はじめに
この記事はNE Advent Calendar 2023の21日目の記事です。
GitHub GraphQL APIとは
動機
- 生産性の可視化のためにデプロイ数を集計したかった。
- デプロイ数=main(master)へのマージ数とした。
- 全期間集計すると大変なので直近マージされたものだけを取得したかった。
こんな動機から今回スクリプト組んで試してみました。
作ったもの
できること
基本の使い方としてはGitHub側のREADMEに記載してあります。
プルリクエストを集計したいアカウントのユーザー名とアクセストークンを指定することで実行できるようになります。
アクセストークンは以下の手順で取得できます。
https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens
権限はpullrequestsとcontentsを許可してください。
GraphQLの叩き方
curl -H "Authorization: bearer 自分のアクセストークン" -X POST -d @sample_search_query.txt "https://api.github.com/graphql"
{
"query": "query {
search(first: 100, query: \"user:集計対象のユーザー名 is:pr is:merged merged:2023-12-01..2023-12-25 base:master base:main\", type: ISSUE) {
nodes {
... on PullRequest {
title
permalink
repository{name}
author{login}
baseRefName
mergedAt
updatedAt
commits(first: 1){nodes{commit{committedDate}}}
}
}
pageInfo{endCursor hasNextPage}
}
}"
}
まず基本形はこんな感じで叩くことができます。
このクエリの部分がだいぶ癖があり意図したものを取得するのに苦労しました。
ドキュメントとにらめっこしながら試行錯誤で欲しいものを取得するクエリを構築しました。
https://docs.github.com/ja/graphql/reference/queries#search
クエリ解説
クエリ | 解説 |
---|---|
first: 100 | 今のカーソル位置から100件取得する。100が上限。 |
after | カーソル位置を指定できる。2ページ目ここからみたいな使い方。 |
is:pr | プルリクエストを対象とする。 |
is:merged | マージ済みのプルリクエストを対象とする。 |
merged | マージされた期間を条件指定する。 |
... on PullRequest | プルリクエストオブジェクトに対して何のフィールドを取得するか指定している。 |
commits | first commitした日を取得している。これによりいつ開始されていつ終了されたかが分かる。 |
base:master base:main | プルリク先がmaster or mainを対象とする。 |
endCursor | 現時点での末尾のカーソル位置。これを取得し次の実行のafterに指定する。 |
hasNextPage | 次ページがあるかどうか。 |
コード解説
curl.php
https://github.com/yamamoto-hiroya/get_pull_requests/blob/main/src/curl.php
curlする部分だけを切り抜いたクラス。
curlのオプションは外部から渡す方式にしても良かったかも。
あとUser-Agentは指定しないと叩けない割にhogehogeでも通るから謎。
github.php
https://github.com/yamamoto-hiroya/get_pull_requests/blob/main/src/github.php
GitHubとの疎通部分を担っているクラス。
結果が複数ページに渡っていたとしてもループでネクストページを取得してくれる君。
結果は「data.csv」というファイルに出力する。
ファイル名とかも外から渡す形式にするか、ファイル出力処理自体を本クラスから切り離しても良かったかも。
あと_get_queryについて。
今後メンテする時に楽なので改行・インデントして見やすいようにしてあるが改行入ってるとうまくクエリ実行できず、仕方なく実行前に改行を削除する処理を挟んだ。
バックラッシュとかでエスケープできるはずなんだけどなぁ、という気持ち。
main.php
https://github.com/yamamoto-hiroya/get_pull_requests/blob/main/src/main.php
メイン実行部分。
期間を指定することでその期間にマージされたプルリクエストが取得できます。
まとめ
実はスクリプトが今の形になるまでに2段階くらいステップを踏んでおり
- 最初は期日指定での検索が分からず全期間取得していた。
- 1ファイルにクラス分けとかもなく処理をバーっと書いていた。
そんな状態でした。
期間指定できなくて都度取得するのしんどくなってきたので、改めて調べてリファクタし整形して今の形となりました。
これにより毎週デプロイ数を取得しスプレッドシートに転記→集計と分析を行っています。
今後は定期実行しスプレッドシートへの転記まで自動にするかを悩み中です。
おわりに
今年のアドカレも佳境です。
引き続き最後までNEのアドカレをおたのしみに〜!