コメント_2020-01-18_135653

【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が出てくるので、それをチェックします。

コメント 2020-01-18 132010

Include administrators にチェックを入れると、リポジトリ所有者でもこのルールに従わなければならないように設定できます。

Save changesボタンを押して完了です!

確認

適当なブランチ作って、超適当なコード書いて、コミット・プッシュして、Pull Request作ってみましょう。

NGならば下記のように指摘され、Merge pull requestボタンが押せないようになります。

コメント 2020-01-18 135653

detailをクリックすると、どのファイルが引っ掛かったかを確認できます。

コメント 2020-01-18 135850

次に適当なブランチを作って、ローカルでphp-cs-fixerを適用したコードを書いて、コミット・プッシュして、Pull Request作ってみましょう。

未フォーマット検知も通過し、Merge pull requestボタンが押せるようになっています!

コメント 2020-01-18 140107

詳細を見ると以下の通り全てに✔が入っています。やったね!

コメント 2020-01-18 140259

まとめ

個人で対策する方法としては、ソースコード保存時に自動フォーマットを適用や、Git Hooksでコミット時にフォーマッターを適用する方法があります。

チーム開発となるとリポジトリ側でmasterにマージされないように防ぐ手段も必要になってくると思いますので、そういう時は無料でサクッとできるGitHub Actionsを使ってみましょう!


😉