😴

できるだけ努力をせずに自分が出したPR数が知りたい

2023/05/31に公開

はじめに

はじめまして cacaca_came です。

私ごとですが、最近SI業界からスタートアップのIT企業に転職しました。
https://tech.macloud.jp/entry/2023/05/19/142417

いち早く開発に慣れるため、人事評価の個人目標として、1日あたり1PR(Pull Request)を出すことを設定しています。
具体的には以下の指標で、100%以上を目指す形になります。

PR数 / 稼働日

※開発に慣れるための指標としてPRを基準にすることが正しいかはここでは議論しません。

では、自分の出したPR数はどうやって計測するのでしょうか?

  • 目視で頑張って数える?
  • APIでカウントする?

・・・無理です。
状況把握するために毎日任意のタイミングでカウントしたいので、毎回目視で確認をしていたら気が狂ってしまいます。また、転職直後かつWeb開発がほぼ未経験で業務外の知識習得を行う余裕があまりありません。

そして残念ながらズボラな性格なため、できる限り努力をせずに自分のPR数をカウントしたいと思います。

この記事の想定読者

とにかく簡単に自分の出したPR数をカウントしたい人

結論

ローカル環境の各リポジトリのディレクトリで、ghコマンドを実行するのが一番簡単で早い!

gh pr list --author "@me" --state "all" --limit 200 --search "created:yyyy-mm-dd..yyyy-mm-dd"

前提条件

環境

  • ローカル環境(MacBook)上から実行できること
  • GitHub上の各リポジトリに参照権限がある
  • ローカル環境にリポジトリをクローンしている

要件要望

  • GitHub Organizationが所有者の複数のリポジトリを横断してPR数を知りたい
  • 期間を指定してPR数を知りたい
  • 定期的に知りたいのでカウントにあまり時間をかけたくない

方法を考える

PRをカウントするにはどんな方法がある?

パッと思いついたやり方は4通りありましたので、それぞれ簡単に調査してみました。(記録し忘れたので詳細は割愛します)
その結果、今回は一番楽そうなghコマンドを採用することとしました。

方法 メリット デメリット
GitHubのWebコンソールで目視でカウントする 簡単にfilterで絞り込めて習得コストが低い 毎回自分で数えるので時間がかかる、カウントミスが起こりうる
git logコマンドを使う gitコマンドのため学習コストが低い、シェルスクリプトに組み込め自動化できる(自分の出すPRのブランチ名には固定のprefixをつけているため、他者と被りません。) authorベースではなくブランチ名ベースの検索のため、例外に対応できずカウント漏れが発生しうる(例えば、他人のブランチを引き継いだ場合など)
GitHub API(v4)を使う 柔軟性が高い。PRをカウントする以外の用途が発生した際にスキルの流用ができる GraphQLの知見がなく学習コストが多くかかる。APIキーを権限ある人に発行してもらう必要がある。(適切な権限がすぐにはわからない)
GitHub CLIを使う ghコマンドのため比較的学習コストが低い。ユーザーがリポジトリを参照できれば利用できるため導入コストが低い。 ある程度ドキュメントを読み込む必要がある。

GitHub CLIとは

公式ドキュメントには以下のような説明が記載されています。

GitHub CLI は、すべての作業を 1 か所で行うことができるように、pull request、issues、GitHub Actions、およびその他の GitHub 機能をターミナルに集めたコマンドライン ツールです。

GitHub CLIがあればPRのブランチをチェックアウトするのが比較的簡単にできるので常用しております。
詳しい機能やインストール手順については公式ドキュメントを参照してみてください。
https://docs.github.com/ja/github-cli/github-cli/about-github-cli

コマンドを探してみる

ghコマンドのドキュメントを参照すると、PullRequestの一覧を照会するためのgh pr listというコマンドがあるようです。
https://cli.github.com/manual/gh_pr

色々とオプションはありますが、今回使うものは以下です。

  • -A, --author <string>
    authorでフィルターすることができます。
    "@me"と指定することでコマンド実行者を設定することができます。
    コマンド実行者のPRが取得したいので--author "@me"を指定します。

  • -s, --state <string>
    PRのステータスでフィルターすることができます。
    open|closed|merged|all のいずれかが指定できます。デフォルトはopenのようです。
    全てのPRが取得したいので--state "all"を指定します。

  • -L, --limit <int>
    一度のフェッチで取得する上限件数を指定できます。デフォルトは30件のようです。
    一括で取得したいため、--limit 200を指定します。

  • -S, --search <query>
    クエリでPRを検索することができます。
    期間を指定して抽出したいため、--search "created:2023-04-01..2023-05-31"を指定します。

クエリについては、GitHub上のissue/pr検索時と同じものが使えるようです。

https://docs.github.com/ja/search-github/searching-on-github/searching-issues-and-pull-requests

コマンドの実行結果

以下のコマンドを計測したいリポジトリ配下で実行してみました

% gh pr list --author "@me" --state "all" --limit 200 --search "created:2023-04-01..2023-05-31"

Showing 21 of 21 pull requests in [Organization名]/[リポジトリ名] that match your search

#653  PR_xxxxx [ブランチ名]  about 9 hours ago
#650  PR_yyyyy [ブランチ名]  about 1 day ago
(中略)
#573  PR_zzzzz [ブランチ名]  about 1 month ago

どうやらこのリポジトリには4/1~5/31の間に自分の出したPRが21個あるようです!
知りたい情報を一瞬で知ることができました!
なお、現時点でトータルPR数が100%を超えていました、一安心です。。。

シェルサンプル

一応目的は達成したのですが、毎回各リポジトリに移動して実行するのは不便なのでシェルスクリプトを作成して数を知りたいタイミングで実行しています。

※リポジトリが同一フォルダ配下にあること

#! /bin/bash

PRLOG_DIR=~/prlog
FILE_NAME_PREFIX=prlog-
FILE_NAME_SUFFIX=`date +%Y%m%d%H%M%S`.txt

# 対象範囲
start_date="2023-04-01"
end_date="2023-05-31"
business_day=40

repo_dir=~/Repositories   # リポジトリのクローン先
repos=(repo1 repo2 repo3) # リポジトリ名の配列

log_file=$PRLOG_DIR/$FILE_NAME_PREFIX$FILE_NAME_SUFFIX

mkdir -p $PRLOG_DIR

for repo in "${repos[@]}"
do
    cd $repo_dir/$repo
    gh pr list --author "@me" --state "all" --limit 200 --search "created:$start_date..$end_date" | sed "s/^/$repo\t/g" >> $log_file
done

count=`cat $log_file | wc -l`
echo Business day : $business_day
echo PR : $count
echo Rate : `awk "BEGIN { print $count / $business_day * 100 }"` %
open $log_file

おまけ

ちなみに後からChatGPTくんに聞いたら瞬殺でした。
※人にすぐ聞くと身につかないので、自分なりに調べてわからない場合や検索しにくいワード(言語の演算子や括弧の意味など)、結論の肉付けにChatGPTを利用しています。

プロンプト
githubの複数のリポジトリにある自分のpull requestの数を計測する方法を複数教えてください。極力簡単に行いたいと考えています。

## 前提条件
- 該当リポジトリはorganizationの持ち物である。
- 該当リポジトリはプライベートだが、参照権限がある。
- 各リポジトリは手元のPC環境にもクローンしている。

## 詳細条件
- 指定した期間に自分が作成したpull requestだけを数えたい。
- マージ済み状態のみを対象にしたい。
output
GitHub上の複数のリポジトリにある自分のマージ済みプルリクエストの数を計測する方法はいくつかあります。以下にいくつかの方法を示します。

方法1: GitHubのウェブインターフェースを使用する
1. GitHubにログインし、組織のページに移動します。
2. "Pull requests"(プルリクエスト)タブを開きます。
3. "Your pull requests"(自分のプルリクエスト)を選択します。
4. "Closed"(クローズ)タブを選択します。
5. 検索バーに自分のユーザー名と期間を入力します。
6. 検索結果に自分がマージ済みのプルリクエストが表示されます。この数を確認できます。

方法2: GitHub CLIを使用する
1. コマンドラインでGitHub CLIをインストールします。
2. ターミナルで該当のリポジトリのクローンディレクトリに移動します。
3. 次のコマンドを実行して、指定した期間にマージされたプルリクエストの数を取得します。

   gh pr list --author=ユーザー名 --state=closed --base=master --merged --json number | jq length

   ユーザー名はGitHubのユーザー名に置き換えてください。

方法3: GitHub APIを使用する
1. GitHubのアクセストークンを生成します。[GitHubのドキュメント](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)を参照して、トークンを生成してください。
2. APIクライアント(例: cURL、Pythonのrequestsモジュールなど)を使用して、GitHubのREST APIを呼び出します。
3. 次のエンドポイントにGETリクエストを送信します。

   GET /search/issues?q=is:pr+is:merged+author:ユーザー名+repo:組織名/リポジトリ名+merged:期間の開始日..期間の終了日

   ユーザー名、組織名、リポジトリ名、期間の開始日、期間の終了日を適切な値に置き換えてください。
4. APIレスポンスに含まれるプルリクエストの数を取得します。

これらの方法のいずれかを使用して、複数のリポジトリにある自分のマージ済みプルリクエストの数を計測することができます。環境や好みに応じて、最適な方法を選択してください。

Discussion