株式会社ヘンリーでSREなどをしている id:eller です。この記事は株式会社ヘンリー Advent Calendar 2024の6日目の記事です。前回は id:Songmu の「社内ラジオをポッドキャスト配信する」でした。
先日GitHubのGraphQL APIでエンジニアのPRの使い方を分析したので、やり方を残しておきます。
材料
gh
コマンドjq
コマンド- 適切な権限を持つGitHubアクセストークン
- 質問をするためのGenerative AI(あれば)
概要
今回は指定日よりもあとに作成されたPRの一覧をCSVで出力することを目指します。中間データにJSONを採用して、 jq
コマンドでいい感じに統計処理できるようにします。
手順
まずシェルスクリプトを書くのですが、今回はあらかじめ作成したものをご用意しております:
#!/bin/bash # 過去3ヶ月の開始日を計算 START_DATE=$(date -v-3m +%Y-%m-%d) gh api graphql --paginate -f query=' query($endCursor: String) { repository(owner: "example.com", name: "repository-name") { pullRequests(first: 100, after: $endCursor, orderBy: {field: UPDATED_AT, direction: DESC}) { pageInfo { hasNextPage endCursor } edges { node { number author { login } createdAt url merged baseRefName reviews(last: 100) { nodes { author { login } state }}}}}}}' --jq ".data.repository.pullRequests.edges[].node | select(.createdAt > \"$START_DATE\" and .merged) | select(.baseRefName == \"develop\" or .baseRefName == \"master\")" > pr_data.json # ユーザーごとの統計を計算 jq -r -s ' group_by(.author.login) | map({ author: .[0].author.login, total_prs: length, }) | sort_by(-.total_prs) | map([.author, .total_prs]) | .[] | @csv' pr_data.json > user_stats.csv
ここのポイントは gh api graphql --paginate
です。ページング処理を gh api
コマンドに任せることで、スクリプトそのものはシンプルにまとまっています。とても嬉しい機能です。
注意点としてはレビュアーが100名を越えないことを前提とした作りになっていますが、多くの場合は問題がないでしょう。
取得したデータに対するフィルタリングを --jq
オプションで実施して元となるデータをJSONファイルに落としてから、改めて jq
コマンドで統計を取る方法を採っています。
元データをまずJSONファイルに落とすことで、統計部分で試行錯誤をする場合にGitHub APIの利用からやり直すことを防ぎ、トライ・アンド・エラーのサイクルを早めています。
質を高めるには味見は大切ですから、スクリプト開発においても味見がしやすい作りを意識したいものです。
おそらく .createdAt
での絞り込みはGraphQL APIでやった方が無駄な検索・通信が発生しないため望ましいはずで、次回改善の余地がありそうです。
GraphQL APIと仲良くすればGitHub上での活動の透明度がぐっと上がります
こんな感じでGitHubのGraphQL APIを使えば、量が多いデータもよしなに扱うことができます。GitHub上でのアクティビティを可視化する方法には色々と提唱されていますが、ちょっと思いついた仮説を検証したい場合にはGraphQL APIが特に便利にご利用いただけるのではないかと思います。
明日は @helene815 の「出社回帰のニュースを見て思うこと」の予定です。お楽しみに!