reviewdogを飼ってレビュー楽にしよう(PHP編)

ツール

今回はチェックツールなどの結果を自動でプルリクにコメントなどをしてくれるreviewdogについてまとめてみます。

reviewdog自体はいろんな言語に対応していますが、今回はPHPをメインで進めます。

ソースコードチェックに使用するのは構文チェックをするPHP_CodeSnifferと静的解析を行うPHPStanです。

かなりシンプルですがサンプルコードもGitHub上にあります。

プルリクを見てもらえればどのようにreviewdogがコメントしているかもわかります。

reviewdogとは

reviewdogとはlinterなどを使ってソースコードレビューを行ってくれる補助ツールです。

linterの実行結果を自動でGitHubのプルリクエストにコメントしたりしてくれます。

こんな感じです↓

人的にコードをレビューする際にロジック部分を確認することはもちろん必要です。
しかしコードの可読性や保守性を上げるためにも構文チェックや静的解析も必要になってきます。

1行1行しっかり見てレビューしたいところですが、レビューにそこまで時間を取れない場合はスペースが足りないなど細かいところまで目が行かなかったりします。

後は単純に見落としたりすることもあります。

そういった時にreviewdogを使えば解決してくれます。

わざわざコメントするところでもないなぁと思っていたところや見落としていたところまでコメントしてくれるので、レビュアーはロジックの部分だけを重点的にレビューするだけで済みます。

プロジェクトを全体的に見てこういった労力を減らせるのは地味に大きいと思います。

今回はGitHub Actionsを利用してmainブランチへのプルリク時に実行結果のエラーをコメントするよう実装していきます。

reviewdog用のyamlファイルの用意

まずGitHub Actionsを使用するためにプロジェクトリポジトリにyamlファイルを作成します。

.github/workflow/reviewdog.ymlを作成し、このファイルの中でGitHub Actionsで実行する内容を記述していきます。

name: reviewdog
on:
  pull_request:
    branches:
      - main
jobs:
  # 構文チェック
  lint:
   
  # 静的解析
  analyse:

nameでワークフロー名を指定

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

jobsでワークフローファイルで実行されるすべてのジョブをグループ化
jobsの中身は後述していきます。

GitHubActionsの詳しい設定についてはこちら↓

GitHub Actions を理解する - GitHub Docs
コア概念や重要な用語など、GitHub Actions の基本について説明します。

reviewdogにPHP_CodeSnifferの結果をコメント出力する

jobs:
  # 構文チェック
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      # ①
      - uses: reviewdog/action-setup@v1
        with:
          reviewdog_version: latest
      # ②
      - name: code snifffer install
        run: composer require squizlabs/php_codesniffer
      - name: lint
        # ③
        env:
          REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        # ④
        run: ./vendor/bin/phpcs --report=emacs --standard=phpcs.xml ./ | reviewdog -reporter=github-pr-review -efm='%f:%l:%c:%m'

①reviewdogをセットアップし導入
②PHP_CodeSnifferをインストール
③reviewdogがコメントを書き込めるようにトークンを設定
④構文チェックの結果をreviewdogに渡す

ここで確認する必要があるのが、GitHubのPersonal Access Tokensの権限スコープの設定です。

workflowの項目にチェックがないと書き込みの権限がないため失敗してしまいます。

もう一つ気をつけるポイントとして、PHP_CodeSnifferの出力フォーマットです。

通常の出力フォーマットではreviewdog側で読み取れないためフォーマットを–report=emacsに変更して出力しています。

reviewdogにPHPStanの結果をコメントする

# 静的解析
  analyse:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      # ①
      - uses: reviewdog/action-setup@v1
        with:
          reviewdog_version: latest
      # ②
      - name: phpstan install
        run: composer require phpstan/phpstan
      - name: analyse
        env:
          # ③
          REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        # ④
        run: ./vendor/bin/phpstan analyse --error-format=raw --no-progress -l 5 index.php | reviewdog -reporter=github-pr-review -f=phpstan

基本的に構文チェックと流れは同じです。

異なる部分として、PHPStanをインストールしている点とこちらも–error-format=rawと指定してフォーマットを変更しています。

ちなみに今回はPHPStanのレベルを5に設定して実行しました。

しっかりと型が違うことを指摘してくれました。

最後に

今回は取り上げませんでしたが、改修のあった部分のみを警告できることも可能です。

プルリクの差分に含まれない行の警告をフィルタリングしてくれます。

こういった便利ツールは実装以外のコスト削減にもつながるので、積極的に活用しより良い実装に集中したいものです。

参考

reviewdog で構文チェックや静的解析の結果をプルリクのレビューコメントとして出力する(GithubActions)

Reviewdog を飼ってコードレビューや開発を改善しませんか

PHP_CodeSniffer

PHPStan

コメント

  1. 上田 より:

    改修のあった部分のみを警告するようにするには何を参考にされましたでしょうか。

タイトルとURLをコピーしました