您好,我正在尝试从 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
和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。