My External Storage

May 7, 2021 - 4 minute read - Comments - github oss

テストコードなどは除外してからPRのサイズを警告するActionsを作った

Pull Request(PR)の追加行数を計測して、指定行数以上だった場合はPRにコメントするGitHub Actionsをつくった。
フィルターパターンを設定しておけば、テストコードや設定ファイルの追加行数を無視する。

https://github.com/budougumi0617/action-pr-size-checker

TL;DR

利用したいリポジトリで次のように 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は手戻りも大きいしマージするときの心理的負荷がレビューア・レビューイ双方にとって大きい。

既存のツールとの比較

すでに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がレッドになり、解析結果が以下のようにコメントされる。

PRへのコメントイメージ

ファイルパターンの正規表現

内部的にはGoで実装しているので、ファイルパターンはRE2形式の正規表現を利用できる。

中身の話

実装はGoのバイナリをシェルスクリプトで動かしているだけだ。

GitHub ActionsはreviewdogのActionsテンプレートを流用している。

ファイルごとの追加行数の計算にもreviewdogの実装をライブラリ的に利用している。

終わりに

reviewdogには普段からお世話になっているが、今回はコードでもお世話になってしまった。とても感謝。
余裕があったらcheck statusの変更オプションや任意のコメントに変更できる機能をつけたい1

参考


  1. 深夜のテンションで「デカ過ぎんだろ…」とコメントするように実装しようと思ったがさすがにやめた。 ↩︎

関連記事