안녕하세요. 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을 생성하지 않습니다.