はじめに
アドベントカレンダー
この記事では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
にチェックが入っていないとうまく動いてくれません。
これでreviewdogの設定は終了です。
reviewdogにコメントしてもらう
試しに先程エラーが出たコードをプルリクにあげてみます。
そうすると先程ローカルで実行したときと同じエラーがコメントとして表示されます。
##最後に
今回はLaravelで静的解析ツールを使いましたが、構文チェックしてくれるPHP_CodeSnifferでも同じことは可能です。
レビュワーからすると細かく構文などをチェックしている時間はないと思うので、こういった自動ツールを導入することで実装タスク以外のコストが削減できることはメリットかなと思います。
そもそもプルリク上げる前に構文エラーがあったら自動整形してくれるようなツールもあるみたいなので調べたいみたいですね。