【最強のプルリクレビュー環境】 GitHub ActionsとPHPStanを繋げてPRのコード上に自動で静的解析のエラーが出てくる仕組みを作る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41743/c2042aa9-b266-2af3-213f-21e5d1f772e7.png)

GitHubでプルリクをレビューするとき、こんな風にコード上に勝手にエラーがあるよ！って表示されたら嬉しいなあということがあります。

わざわざCIの実行結果を見に行ってひとつひとつエラーを確認するのは面倒ですからね。

というわけで、今回は上の画像のように自動でエラーがコード上に現れて教えてくれる環境をGitHub Actionsで作りたいと思います。

## 大前提
- PHPStanがプロジェクトに導入されている
    - 今回はPHPStan 1.5.4を使用して検証しています

PHPStanが入ってないと話が始まらないので、まずは入れておきましょう。

https://phpstan.org/user-guide/getting-started

## GitHub ActionsからPHPStanが走るようにする
以下の設定を入れておきます。

```yaml:.github/workflows/phpstan.yml
name: PHPStan
on:
  push:
    branches:
      - main
      - master
      - develop
  pull_request:
    types:
      - opened
      - synchronize
      - reopened
jobs:
  phpunit:
    name: PHPStan (PHP ${{ matrix.php-versions }} on ${{ matrix.operating-system }})
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system: [ ubuntu-latest ]
        php-versions: [ '8.1' ]
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-versions }}
          extensions: mbstring, dom, fileinfo, simplexml
          coverage: xdebug
      - name: Get composer cache directory
        id: composer-cache
        run: echo "::set-output name=dir::$(composer config cache-files-dir)"
      - name: Cache composer dependencies
        uses: actions/cache@v2
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: ${{ runner.os }}-composer-
      - name: Install Composer dependencies
        run: composer install --no-progress --prefer-dist --optimize-autoloader
      - name: Check with PHPStan
        run: vendor/bin/phpstan --configuration=phpstan.neon
```

また、今回検証に使用した `phpstan.neon` はこのように設定しました。
(ここは合わせる必要はないので、適宜使用している設定を利用してください)

```yaml
parameters:
    paths:
        - src
        - test
    level: 9
```

設定を入れてPRを作れば勝手にPHPStanが走るようになりました。便利！！

設定はこれで完了なので、なにか静的解析でエラーが出るコードを書いてみてPRを作ってみて動作を見てみましょう！

## エラーがコード上に出てくる仕組み
GitHub ActionsにはAnnotationという仕組みがあり、Actionsにどのファイルの何行目にこんなエラーがあるよと教えてあげると自動的にPRのUI上の該当箇所にエラーが出るようになっています。

https://qiita.com/hasht/items/e900fcf35d4804da7758

今回の場合ですと、このような形に出ていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41743/fb9afd2d-93f9-fb28-9e35-a367fe9d34d9.png)

## でも... 何も設定した覚えがないが？？？
**結論：何も設定しなくてもOK**

本来であれば...

https://github.com/actions/toolkit/blob/master/docs/problem-matchers.md

のドキュメントに従って、エラーのパターンを設定しておく、もしくは

https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-error-message

の形式に沿ったエラーを出力をする必要があります。

手作業で設定しないといけないのか～～～と思うかもしれませんが、ちょっとまってください。

PHPStanにはOutput Formatという機能があり、GitHubやGitLabなどの主要なサービスに対応した形式に沿ったエラーを吐いてくれる機能があります。

https://phpstan.org/user-guide/output-format

オプションで指定するだけで自動で合わせてくれますね！便利。

**ちなみに、明示的に `--error-format=github` のオプションを付けてあげても良いですが、何もしなくてもActionsの環境を検出していい感じにしてくれるので設定しなくても大丈夫です。**

## さいごに
これによってUI上でコードの該当箇所にエラーが出てくるようになったので、レビュアーもレビューイもエラーを見に行くなんて非効率なことをしなくてもよくなってハッピー！

良いプルリク生活を！