search
LoginSignup
1

More than 1 year has passed since last update.

posted at

updated at

Organization

Larastanで静的解析したエラーをreviewdogでプルリクにコメントさせるよ

はじめに

アドベントカレンダー
この記事ではGitHubへのプルリクエストに対して、Larastanを利用して静的解析して出たエラーをreviewdogがコメントしてくれる方法を紹介します。

LarastanはPHPの静的解析ツールであるPHPstanをLaravel用に最適化したラッパーのパッケージです。
https://github.com/nunomaduro/larastan

reviewdogはlinterなどを使ってソースコードレビューを行ってくれる補助ツールです。
linterの実行結果を自動でGitHubのプルリクエストにコメントしたりしてくれます。
https://github.com/reviewdog/reviewdog

環境
Laravel 8.*
Larastan 1.0
reviewdog 0.13.0

作成したソースコード
https://github.com/ryofutebol/laravel_reviewdog

Larastan設定

インストール

composer require nunomaduro/larastan --dev

LarastanはPHPが7.2以上、Laravelが6.0以上である必要があります。

phpstan.neonファイル設定

phpstan自体の設定はphpstan.neonファイルに記述します。

includes:
    - ./vendor/nunomaduro/larastan/extension.neon

parameters:
    paths:
        - app
    level: 0
    ignoreErrors:
        - '#Call to an undefined method .*badMethod\(\)#'

最初に2行でLarastanの設定を読み込んでいます。

parametersに必要な設定をしていきます。

  • pathsにどのパスを解析対象のディレクトリを指定
  • levelはPHPstanでどのくらい厳格に解析するかのレベルを指定
    0~9まであるので今回は最も緩い解析である0を指定します。
  • ignoreErrorsで無視するエラーを指定 エラー分をそのまま指定してもいいですし、上記コードのように正規表現で指定することも可能です。

動作確認

実際に静的解析を行ってくれているのかをローカルで確認してみます。
Laravelをインストールした初期状態でUserContorllerのみを作成します。
そこに下記のようなわざとエラーが出るようなメソッドを記述します。

namespace App\Http\Controllers;

use App\Models\User;

class UserController extends Controller
{
    public function getUserName(): string
    {
        $user = Admin::query()->findOrFail(1);
        return $user->name;
    }
}

本来やりたいことはIDが1のユーザー名を取得することですが、わざと存在しないAdminモデルを指定したメソッドを用意しました。
この状態で静的解析を実行します。

./vendor/bin/phpstan analyse
Note: Using configuration file /laravel_reviewdog/phpstan.neon.
 19/19 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%

 ------ ------------------------------------------------------------------------------- 
  Line   Http/Controllers/UserController.php                                            
 ------ ------------------------------------------------------------------------------- 
  15     Call to static method query() on an unknown class App\Http\Controllers\Admin.  
         💡 Learn more at https://phpstan.org/user-guide/discovering-symbols             
 ------ ------------------------------------------------------------------------------- 

 [ERROR] Found 1 error                                                                                                    

存在しないクラスなのでしっかりエラーが出てくれました。

試しにignoreErrorsで上記エラーが出ないように正規表現で指定してみます。

ignoreErrors:
    - '#Call to static method .*\(\)#'
Note: Using configuration file /laravel_reviewdog/phpstan.neon.
 19/19 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%

 [OK] No errors                                                                                                                                                                                                                        

今回はエラーが出ず正常に静的解析が実行されました。

reviewdog設定

reviewdogが静的解析のエラーをプルリクにコメントしてくれるようにGitHub Actionsの設定をしていきます。
.github/workflow/reviewdog.ymlを作成します。

name: reviewdog
on:
  pull_request:
    branches:
      - master
jobs:
  analyse:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: reviewdog/action-setup@v1
        with:
          reviewdog_version: latest
      - name: Setup PHP
        uses: shivammathur/setup-php@v2 
        with:
          php-version: '8.0'
          tools: composer:v2
      - name: Resolve dependencies
        run: composer install --no-progress --prefer-dist --optimize-autoloader
      - name: Run PHPstan
        env:
          REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: ./vendor/bin/phpstan analyse --error-format=raw --no-progress | reviewdog -reporter=github-pr-review -f=phpstan
  • nameでワークフロー名を指定

  • onでワークフローファイルを自動的にトリガーするイベントを指定
    今回だとmasterブランチにプルリクを上げたタイミングでこのワークフローが実行されます。

  • jobsの中にLarastanを実行してエラーが出た際にreviewdogがコメントしてくれるための実行ジョブを指定
    中身を簡単に説明すると
    ①reviewdogを導入
    ②PHPとComposerのセットアップ
    ③PHPstan実行して結果を出力
    注意点としてはREVIEWDOG_GITHUB_API_TOKENにGitHubのトークンを設定していますが、Personal Access Tokensの権限スコープのworkflowにチェックが入っていないとうまく動いてくれません。
    スクリーンショット 2021-11-28 16.28.35.png

これでreviewdogの設定は終了です。

reviewdogにコメントしてもらう

試しに先程エラーが出たコードをプルリクにあげてみます。
スクリーンショット 2021-11-28 16.34.13.png
そうすると先程ローカルで実行したときと同じエラーがコメントとして表示されます。

最後に

今回はLaravelで静的解析ツールを使いましたが、構文チェックしてくれるPHP_CodeSnifferでも同じことは可能です。
レビュワーからすると細かく構文などをチェックしている時間はないと思うので、こういった自動ツールを導入することで実装タスク以外のコストが削減できることはメリットかなと思います。
そもそもプルリク上げる前に構文エラーがあったら自動整形してくれるようなツールもあるみたいなので調べたいみたいですね。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1