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

관련 정보