株式会社ヘンリー エンジニアブログ

株式会社ヘンリーのエンジニアが技術情報を発信します

GitHubのGraphQL APIを使ってPull Requestを分析するためのレシピ

株式会社ヘンリーで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 の「出社回帰のニュースを見て思うこと」の予定です。お楽しみに!