0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NEAdvent Calendar 2023

Day 21

GitHub GraphQL APIを使ってプルリクを取得してみた

Last updated at Posted at 2023-12-20

はじめに

この記事はNE Advent Calendar 2023の21日目の記事です。

GitHub GraphQL APIとは

動機

  • 生産性の可視化のためにデプロイ数を集計したかった。
  • デプロイ数=main(master)へのマージ数とした。
  • 全期間集計すると大変なので直近マージされたものだけを取得したかった。

こんな動機から今回スクリプト組んで試してみました。

作ったもの

できること

基本の使い方としてはGitHub側のREADMEに記載してあります。
プルリクエストを集計したいアカウントのユーザー名とアクセストークンを指定することで実行できるようになります。

スクリーンショット 2023-12-18 14.21.53.png

アクセストークンは以下の手順で取得できます。
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"
sample_search_query.txt
{
  "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のアドカレをおたのしみに〜!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?