モチベーション
- git のコミット ID に紐づくタグの一覧を GitHub から取得したい
- GitHub API によると
- タグからコミット ID を取得する API はある
- コミット ID からタグを取得する API はない
- なんとかして後者を実現したい
手順
ここでは Bash と jq を使います。
- リポジトリのタグ一覧を取得する API を叩く
https://developer.github.com/v3/repos/#list-repository-tags - 一覧から当該コミット ID を含むタグのみを抽出
1. リポジトリのタグ一覧を取得する API を叩く
bash_script
# GitHub API をコール
response=$(curl -H "Authorization: token ${GITHUB_ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-s -XGET https://api.github.com/repos/${OWNER}/${REPO}/tags \
)
参考: response の例
response
[
{
"name": "test1",
"zipball_url": "https://github.com/octocat/Hello-World/zipball/test1",
"tarball_url": "https://github.com/octocat/Hello-World/tarball/test1",
"commit": {
"sha": "c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc"
"url": "https://api.github.com/repos/octocat/Hello-World/commits/c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc"
},
"node_id": "MDM6UmVmMjAxMTcwOTQ4OnRlc3Qx"
},
{
"name": "test2",
"zipball_url": "https://github.com/octocat/Hello-World/zipball/test2",
"tarball_url": "https://github.com/octocat/Hello-World/tarball/test2",
"commit": {
"sha": "c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc"
"url": "https://api.github.com/repos/octocat/Hello-World/commits/c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc"
},
"node_id": "MDM6UmVmMjAxMTcwOTQ4OnRlc3Q"
},
{
"name": "test3",
"zipball_url": "https://github.com/octocat/Hello-World/zipball/test3",
"tarball_url": "https://github.com/octocat/Hello-World/tarball/test3",
"commit": {
"sha": "762941318ee16e59dabbacb1b4049eec22f0d303"
"url": "https://api.github.com/repos/octocat/Hello-World/commits/762941318ee16e59dabbacb1b4049eec22f0d303"
},
"node_id": "MDM6UmVmMjAxMTcwOTQ4OnRlc3Qz"
}
]
2. 一覧から当該コミット ID を含むタグのみを抽出
bash_script
# コミット ID を指定
COMMIT_SHA='c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc'
# レスポンスからコミットに紐づくタグ JSON のみを取得
tag_object=$(echo -e "$response" | jq -r ".[] | select(.commit.sha == \"$COMMIT_SHA\")")
[[ -z $tag_object ]] && echo "No tag is found. response = $response" && exit 0
# タグ名だけを抽出して JSON の配列に整形して返す
echo -e "$tag_object" | jq '. | .name' | jq -s
実行結果
実行結果
[
"test1",
"test2"
]
メモ
- 全タグを取得してしまっているのであまりエコではない。もっといい方法はないものか。