つばくろぐ @takamii228

知は力なり

GitLab APIを使ってtag名とtagのタイムスタンプをcsv形式で出力する

リリース頻度のデータを分析するために、GitLabのtag名とtagを作成した時のタイムスタンプの一覧が欲しくなったのでGitLab API経由で取得するシェルを書きました。

#!/bin/sh

BASE_URL="xxxx"
API_TOKEN="xxxx"
PROJECT_ID="xxxxx"

# 全tag一覧を取得するための最大ページ数を取得する
TOTAL_PAGES=`curl -D - -s -o /dev/null -X GET -H "PRIVATE-TOKEN: ${API_TOKEN}" "${BASE_URL}/api/v4/projects/${PROJECT_ID}/repository/tags?per_page=100" | grep "X-Total-Pages" | tr -d "X-Total-Pages: " | tr -d "\r"` 

# タグとタグのタイムスタンプをカンマ区切りで取得する
RESULT=""

for i in `seq 1 ${TOTAL_PAGES}`
do
  RESULT=${RESULT}`curl -X GET -H "PRIVATE-TOKEN: ${API_TOKEN}" "${BASE_URL}/api/v4/projects/${PROJECT_ID}/repository/tags?per_page=100&page=${i}" | jq -r '.[] | (.name|tostring) + "," + (.commit.authored_date|tostring)'`"\n"
done

# UTCで返却されるので、JSTに変換し出力する
for line in ${RESULT}
do
  TAG_NAME=`echo ${line} | cut -d ',' -f1`
  TIMESTAMP_UTC=`echo ${line} | cut -d ',' -f2`
  TIMESTAMP_JST=`date -v+9H -j -f "%Y-%m-%dT%T.000Z" ${TIMESTAMP_UTC} +%Y-%m-%dT%T.000Z`
  echo ${TAG_NAME},${TIMESTAMP_JST}
done

tag一覧の取得は/api/v4/projects/${PROJECT_ID}/repository/tagsのエンドポイントを叩くと取れます。

https://docs.gitlab.com/ce/api/

tag一覧の取得はページングのハンドリングが必要なので、レスポンスヘッダーのX-Total-Pagesからページ数を取得し、最終的にはfor文で回してjqで加工したものを連結します。

タイムゾーンの設定によってはUTCで結果が帰ってくるので、最後にdateコマンドでJSTに変換しています。

上記のシェルを実行すると以下のようなcsvが取得できます。

1.5.0,2019-09-30T10:59:49.000Z
1.4.0,2019-09-26T15:35:21.000Z
1.3.2,2019-09-20T19:00:11.000Z
1.3.1,2019-09-17T18:21:30.000Z
1.3.0,2019-09-11T21:01:37.000Z
1.2.0,2019-09-03T22:08:34.000Z
1.1.0,2019-08-27T22:41:38.000Z
1.0.2,2019-08-20T22:37:28.000Z
1.0.1,2019-08-13T22:13:56.000Z
1.0.0,2019-08-06T21:38:05.000Z
0.3.0,2019-07-30T21:16:30.000Z
0.2.0,2019-07-23T22:38:51.000Z
0.1.0,2019-07-17T15:30:01.000Z

あとはこれをSpreadSheetなりExcelなりPythonなりで集計すればリリース頻度の分析の集計ができます。