✌️

今日のPull request数を可視化して開発モチベーションを爆上げ

2024/03/03に公開

作ったもの

git push --set-upstream origin branchnameした際に、今日自分が作ったPull requestの数と一覧を表示してくれるようにしました。

% git push --set-upstream origin branchname
You have created 3 pull request(s) today.

Showing 3 of 3 pull requests in xxx/xxx that match your search

ID  TITLE BRANCH           CREATED AT      
#1  PR1   feature/branch1  about 3 days ago
#2  PR2   feature/branch2  about 3 days ago
#3  PR3   fix/branch3      about 3 days ago

モチベーション

個人の目標というか、日々の行動の数値化としてその日に作ったPull requestの数を計測しています。
この数値設定の意味は簡単に説明すると手を動かすことを意識するためです。

自分はあれこれ考え出すと手が止まってしまったり、チャレンジしてみようと思っても他人からの目を気にしてアクションしないことがあります。

エンジニアである以上、どれだけコードを書いたかが"アクション"として計測できると思っています。(指標の1つにすぎませんが)
批判があっても良いですし、mergeせずcloseになっても良いので何かしらPull requestという形でアウトプットを意識するのが良いのではないか?という仮説から来ています。

元々は計測のために、週末に手作業で行っていたのですが数値がイマイチだった週があっても改善へとつながっていませんでした。
試行錯誤した結果、週末に測るよりもPull requestを作ったその瞬間に今日何個作っているかを可視化した方がモチベーションが上がるのではないかと思ったので、何か方法を模索してみました。

仕組み

結局動く仕組みはPull requestを作った時ではなくgit push --set-upstream origin branchnameした時になりましたが、ほぼイコールでPull requestを作った時だと思うので良しとしました。

ざっくり仕組みとしては

  • gitのhookを利用しpushした時にスクリプトを走らせる
    • 全てのリポジトリで実行したかったのでグローバルでpre-pushを登録
  • ghコマンドを使ってPR数を取得

と言った感じです。

実践する

git hookをグローバルに設定する

基本的にhookは特定のリポジトリに設定しますが、全てのリポジトリでpushを検知して欲しかったのでその手順です。

~/.config/git/hooks/pre-pushを作ります(ディレクトリはどこでもOK)
一旦空でOK

$ touch ~/.config/git/hooks/pre-push
$ git config --global core.hooksPath ~/.config/git/hooks
$ chmod +x ~/.config/git/hooks/pre-push

これだとリポジトリ個別のhookに対応しないので、もし必要であればこちらに書いてありました。
https://qiita.com/ik-fib/items/55edad2e5f5f06b3ddd1#gitリポジトリ内のgit-hooksも実行するようにする

スクリプトを書く

push時のスクリプト。
やっていることの流れは、

  • ブランチ名とリモート名を取得
  • 特定のブランチがリモートに存在するかチェック
  • 今日、自分が作成した全てのpull request(merged, closeなどを含む)をの数を取得
  • echoでpull request数を出力

ちなみにghコマンドを使っているのでインストールしてください。macはbrew install ghでインストールし、gh auth loginでログインできます。

https://github.com/cli/cli

~/.config/git/hooks/pre-push
#!/bin/sh

# 現在のブランチ名を取得
current_branch=$(git branch --show-current)

# リモート名を指定(ここでは 'origin' を使用)
remote_name="origin"

# 特定のブランチがリモートに存在するかチェック
if ! git ls-remote --heads $remote_name $current_branch | grep -q "refs/heads/$current_branch"; then
  # 今日の日付をYYYY-MM-DD形式で取得
  TODAY=$(date "+%Y-%m-%d")
  # GitHubのユーザー名を取得
  GH_USER=$(gh api user | jq -r '.login')
  
  # 今日、指定したユーザーが作成したPRの数を取得
  PR_COUNT=$(gh pr list --state all --search "created:$TODAY author:$GH_USER" --json number --jq '. | length')
  
  # 結果を表示
  echo "You have created \033[33m$PR_COUNT\033[0m pull request(s) today."
  # open以外を含む全てのPRを表示
  gh pr list --search "created:$TODAY author:$GH_USER" --state all
fi


# スクリプトが成功したことを示すために0を返す
exit 0

これでgit push --set-upstream origin branchnameした時にpull requestの数と、一覧を表示することができました。

% git push --set-upstream origin branchname
You have created 3 pull request(s) today.

Showing 3 of 3 pull requests in xxx/xxx that match your search

ID  TITLE BRANCH           CREATED AT      
#1  PR1   feature/branch1  about 3 days ago
#2  PR2   feature/branch2  about 3 days ago
#3  PR3   fix/branch3      about 3 days ago

さいごに

やっていることは簡単ですが、普段の行動(git push)の行動をトリガーにして開発モチベーションを維持できるので良いデザインかなと思います。
表示するフォーマットとかは運用してみて改善していこうかなと思います。
(pull requestが0個だったら「がんばれ」メッセージ出すとか、適当な目標数を達成したらクラッカー🎉の絵文字出しまくるとか)

もし試された人がいたらフィードバックなりをコメントに書いてみてください!

Discussion