从 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-确定-最新-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

gronGNU 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。

相关内容