Pull Request(PR)の追加行数を計測して、指定行数以上だった場合はPRにコメントするGitHub Actionsをつくった。
フィルターパターンを設定しておけば、テストコードや設定ファイルの追加行数を無視する。
https://github.com/budougumi0617/action-pr-size-checker
TL;DR
- PRは小さい方がいい
- GitHub ActionsでPRの追加行数を計測するツールを作成した
- 設定したファイルパターンを無視するのが特徴
- テストコードや設定ファイルならばいくら追加してもよいと考える
利用したいリポジトリで次のように YOUR_REPO/.github/workflows/check_pr_size.yml
を作成するだけで利用できる。
name: check-pr-size
on: [pull_request]
jobs:
linter_name:
name: runner / check-pr-size
runs-on: ubuntu-latest
steps:
- uses: budougumi0617/action-pr-size-checker@v0
with:
github_token: ${{ secrets.github_token }}
max_added_count: 300
filter_pattern: "go.mod|go.sum|.*_test.go|.*.md|.*.golden|.*.yml"
2021/05/07時点では指定行数以上の変更を行なったPRには次のようなコメントが行われる。
PRは小さい方がいい
流派や諸説あるとは思うが、PRは小さい方が良いと思っている。理由は以下のブログが説明してくれている。
日本語訳記載以外の理由を挙げるとそもそもの方向性が間違っていた場合、デカイいPRは手戻りも大きいしマージするときの心理的負荷がレビューア・レビューイ双方にとって大きい。
既存のツールとの比較
すでにPRのサイズをチェックするツールは世の中にいくつか存在する。 有名なOSSでいうとDangerなどがPRのサイズをチェックしてくれる。
他にも、GitHub ActionsのMarketplaceで「PR size」などで検索するといくつかActionsが見つかる。 しかし、既存ツールにはひとつ懸念事項があり、今回自作した。
テストを書く人ほど差分が増えてエラーになってしまう問題
PRのサイズを計測するときのデメリットとしては、テストコードの追加も考慮に入れてしまうと本末転倒な事態が発生してしまうことだ。
TDDやレガシーコード改善ガイドの「テストコードがないコードはレガシーコードだ!」という言葉、テストの重要性が叫ばれている現在PRを作るときは一緒にテストコードを含めることがデファクトになっているはずだ。
テストコードが含まれたPRで闇雲に追加行数でPRをリジェクトしてしまうと、「テストをしっかり書く人」が不幸になってしまう。
私はテストコードについては適切なないようならばどんどん追加してもう良いと思っている。よいテストコードは仕様を明らかにするため、テストコードを含んでいるほうがPRの理解しやすいという点もある。
既存のツールをざっとみたところ「特定のファイルを無視してPRの行数を確認する」という機能はなさそうだったので、今回のツールを作成した。
ファイルパターンで特定ファイルは無視するaction-pr-size-checker
今回作ったGitHub Actionsは前節の問題に対応するため、正規表現でファイルパターンを登録できる。 なので、テストコードやテストで利用する設定ファイル(ゴールデンファイル・YAML etc)を無視してPRの追加行数を確認する。
https://github.com/budougumi0617/action-pr-size-checker
利用するときはリポジトリで次のように YOUR_REPO/.github/workflows/check_pr_size.yml
を作成するだけで利用できる。
閾値となる追加行数の上限はmax_added_count
、無視するファイルパターンをfilter_pattern
で指定するだけた。
name: check-pr-size
on: [pull_request]
jobs:
linter_name:
name: runner / check-pr-size
runs-on: ubuntu-latest
steps:
- uses: budougumi0617/action-pr-size-checker@v0
with:
github_token: ${{ secrets.github_token }}
max_added_count: 300
filter_pattern: "go.mod|go.sum|.*_test.go|.*.md|.*.golden|.*.yml"
上限を超えるPRはCheck Statusがレッドになり、解析結果が以下のようにコメントされる。
ファイルパターンの正規表現
内部的にはGoで実装しているので、ファイルパターンはRE2形式の正規表現を利用できる。
中身の話
実装はGoのバイナリをシェルスクリプトで動かしているだけだ。
GitHub ActionsはreviewdogのActionsテンプレートを流用している。
ファイルごとの追加行数の計算にもreviewdogの実装をライブラリ的に利用している。
終わりに
reviewdogには普段からお世話になっているが、今回はコードでもお世話になってしまった。とても感謝。
余裕があったらcheck statusの変更オプションや任意のコメントに変更できる機能をつけたい1。
参考
- 10 tips for better Pull Requests by Mark Seemann
- https://github.com/budougumi0617/action-pr-size-checker
- https://github.com/budougumi0617/gigi
- Dangerで始めるPull Requestチェック自動化 - コネヒト開発者ブログ
- https://github.com/google/re2/wiki/Syntax
- https://github.com/reviewdog/action-template
- https://pkg.go.dev/github.com/reviewdog/reviewdog@v0.11.0/diff