Githubリポジトリからバージョン番号を抽出する

Githubリポジトリからバージョン番号を抽出する

こんにちは。 Githubリリースサイトからバージョン番号を抽出しようとしています。後でAnsibleロールが必要です。

たとえば、githubから最新バージョンのneovimの正しいバージョン番号を取得したいとします。これまで私はこれを得ました:

curl -s https://api.github.com/repos/neovim/neovim/releases/latest | grep NVIM | cut -c 1-35

出力は次のとおりです

  "body": "```\nNVIM v0.9.0\nBuild

私は成功せずにバージョン番号を抽出するためにsedを使ってみました。

残念ながら、このブログ投稿は私には適していませんhttps://fabianlee.org/2021/02/16/bash-ok-latest-github-release-tag-and-version/

答え1

このリポジトリは正規リリースではなくタグを公開するため、最新バージョンのページ全体を検索し、「v」で始まり、後に数字が続くタグを見つける必要があります。

$ curl -s https://api.github.com/repos/neovim/neovim/releases | \
  jq -r 'first(.[].tag_name | select(test("^v[0-9]")))'
v0.9.0

これは、「v」で始まるバージョンを反映するタグ付きバージョンを公開するすべてのリポジトリに適用されます。

より一般的なアプローチは、タグを見つけることです。

curl -s https://api.github.com/repos/neovim/neovim/tags | \
jq -r 'first(.[].name | select(test("^v[0-9]")))'

これはGitHubバージョンを公開しないプロジェクトにも当てはまります。リリースバージョンプロジェクトでは、これはバージョンに対応するタグだけでなく、すべてのタグと一致します。

一部のプロジェクトでは、前に「v」のないバージョンラベルを使用します。正規表現は、次のことを許可するように具体化できます。

curl -s https:/api.github.com/repos/akucukelbir/resmap/tags | \
jq -r 'first(.[].name | select(test("^v?[0-9]")))'

一部のプロジェクトはタグをまったくプッシュせず、そのための普遍的な解決策はありません。

答え2

コマンドを次にパイプします。

sed -E 's/^.*v([0-9.]*).*$/\1/'

答え3

そしてgronそしてGNU grep

$ gron https://api.github.com/repos/neovim/neovim/releases/latest |
    grep -oP '^json.body = ".*\KNVIM v(\d+\.?)+'

または以下を使用してPerl

$ gron https://api.github.com/repos/neovim/neovim/releases/latest |
    perl -pe 'print $& if /^json.body = ".*\KNVIM v(\d+\.?)+/' 

出力

NVIM v0.9.0

もう気づいてたんだけど、API はプロジェクト間で同じ JSON を生成しません。

関連情報