【GitHub Actions】Pull Requestが来たらphp-cs-fixerでフォーマット指摘
コードレビューでいちいち「フォーマッターが適用されていない」と指摘するのが煩わしい、スペースやら{}の位置とか表面的なレビューよりもビジネスロジックやセキュリティ面などの本質的なレビューに時間を割きたいそこのあなた!
GitHub Actionsを使ってフォーマット指摘してもらいましょう。
PHPでやっていますが各言語で提供されてるフォーマッターを同じような感じで使えると思います。
やること
- Pull Requestが来たらGitHub Actionsを動かす
- GitHub Actionsでphp-cs-fixerを動かす
- php-cs-fixerでフォーマッター未適用ファイルを検出する
- 検出したらマージできないようにする
やらないこと
- 変更箇所のみの未フォーマット検知
- 未フォーマット箇所の表示
- 自動修正
GitHub Actionsの準備
下記リポジトリの .github/workflows/php-cs-fixer.yml を入手しましょう。
中身は以下の通りです。
name: php-cs-fixer
on: [pull_request]
jobs:
php-cs-fixer:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Prepare
run: |
wget https://cs.symfony.com/download/php-cs-fixer-v2.phar -O php-cs-fixer
chmod a+x php-cs-fixer
- name: php-cs-fixer
run: php php-cs-fixer fix ./src --dry-run
やっていることは以下の通り。
1. チェックアウトする
2. php-cs-fixerの最新版をダウンロードする
3. php-cs-fixerで指定したディレクトリを対象にdry-runして検知する
今回はsrcディレクトリ下にソースファイルがある状況を想定しています。
必要に応じて変更してください。
またphp-cs-fixerの設定ファイルがある場合は自動読込みに頼らずオプションで --config=.php_cs.dist を明示的に指定する方法もあります。
php-cs-fixerの終了ステータスが0ならばOK、それ以外ならNGとなっており、GitHub Actionsも同じように終了ステータスが0ならばOK、それ以外はNGと判定します。
このYAMLファイルを自分のリポジトリに同じように .github/workflows/php-cs-fixer.yml に配置しましょう。
(念のためUTF-8 non-BOM、改行コードLFになっているか確認!)
そしてcommitしてpushしましょう。
リポジトリの設定
せっかく指摘してくれてもマージできてしまっては意味がないので、検知されたらマージできないようにしましょう。
GitHubにはブランチ保護機能があり、特定のブランチに対してpushできなくしたり、レビューしてもらわないとマージできないようにしたり、CIや静的コード解析に失敗したらマージできないようにできます。
今回はこの機能を使っていきます。
GitHubのリポジトリの Settings > Branches に移動し、Add ruleボタンを押します。
Branch name patternに master と入力します。
次に Require status checks to pass before merging にチェックを入れましょう。
上記で作ったGitHub Actionsが認識されていればphp-cs-fixerが出てくるので、それをチェックします。
Include administrators にチェックを入れると、リポジトリ所有者でもこのルールに従わなければならないように設定できます。
Save changesボタンを押して完了です!
確認
適当なブランチ作って、超適当なコード書いて、コミット・プッシュして、Pull Request作ってみましょう。
NGならば下記のように指摘され、Merge pull requestボタンが押せないようになります。
detailをクリックすると、どのファイルが引っ掛かったかを確認できます。
次に適当なブランチを作って、ローカルでphp-cs-fixerを適用したコードを書いて、コミット・プッシュして、Pull Request作ってみましょう。
未フォーマット検知も通過し、Merge pull requestボタンが押せるようになっています!
詳細を見ると以下の通り全てに✔が入っています。やったね!
まとめ
個人で対策する方法としては、ソースコード保存時に自動フォーマットを適用や、Git Hooksでコミット時にフォーマッターを適用する方法があります。
チーム開発となるとリポジトリ側でmasterにマージされないように防ぐ手段も必要になってくると思いますので、そういう時は無料でサクッとできるGitHub Actionsを使ってみましょう!
😉