🐶

GitHub Actionsでreviewdogを飼って静的解析してみる

2022/03/16に公開

こんにちは。株式会社ペライチ でサーバーサイドエンジニアをしている木村です。
入社以来主にペライチを継続利用していただくための機能追加や改善の開発を担当しております。

そのかたわら、ペライチシステムの品質を向上するための対応も行っており、今回はその一環として導入を進めているreviewdogを用いた静的解析について紹介させていただきます。

これまでのコード解析

ペライチでは Sider を利用して Pull Request 毎にソースコードの自動チェックを行っています。

Sider ではリポジトリ毎に解析を実施するツールの設定が可能で、 PHP で開発されているペライチアプリケーションでは以下を有効にしています。

  • PHP_CodeSniffer
  • PHPMD

Pull Request に含まれる変更のみを解析対象としてくれるため、人がコードレビューをする前段の文法やコーディング規約のチェックに活用しています。
それに加えて最低限の型チェックなども実施していきたいというのが、今回本対応を実施したモチベーションです。

ペライチでも CakePHP2 から CakePHP4 へのジャンプアップに伴ってようやく PHP7 系への移行が完了しつつありますが、
PHP7 から可能となった厳格な型付けに対応できている箇所がまだ少ない状態となっています。

CakePHP2 から CakePHP4 へのジャンプアップについて気になった方は以下の記事をご覧ください。
https://zenn.dev/peraichi/articles/01fwfv1gwx4jnzdhst2cw0afrv

これまでのコード解析では不足していた型チェックを行えるようにし、
型を意識した PHP のコーディングができるように PHPStanpsalm を導入できればと考えています。
さらに、ゆくゆくはカスタムルールの追加によってペライチならではな書き方に則っているかのチェックもできればと目論んでいます。

reviewdogとは

各種 linter 解析の検出結果を Pull Request にコメントする形で指摘してくれるツールです。
詳しくはreviewdog開発者様の記事を参考にしてください。

reviewdog のうれしい点はなんといっても、 Pull Request にコメント形式での指摘を簡単に実現できる点です。
前述の Sider などでは解析の結果エラーとなった場合に、その内容を知るのに画面遷移が必要でした。
この一手間を削減できるのはかなり大きいと思っています。

さらに、 PHPStan や psalm などのモダンな静的解析ツールでは baseline を用いることによって既存のソースの解析結果を出力しない設定ができますが、
reviewdog であれば baseline で管理せずとも Pull Request に含まれる範囲に限定して解析してくれます。

導入直後は多くの指摘コメントが付いてしまうことが想定されますが、
慣れていくにつれ意識的に指摘を受けることのない品質の高いコードが書けるようになることを期待しています。

そんな reviewdog は設定次第で各 CI サービスに組み込むことができますが、
今回は GitHub Actions を用いた実行を目指しています。
最も大きな理由としては、 GitHub Actions であればデフォルトで GITHUB_TOKEN の使用が可能なため、
その他 CI サービスで必要となる環境変数への設定などが不要であるという点が挙げられます。
(個人的に GitHub Actions を使ってみたかったというのもかなり大きな比重を占めています😉)

GitHub Actionsの有効化

さっそく GitHub Actions の設定をしようとしましたが、リポジトリの Actions タブで以下メッセージが表示され利用できない状態となっていました。

GitHub Actions workflows can’t be executed on this repository.
The billing plan for (OrganizationName) does not include access to GitHub Actions. Please contact the organization owner or billing manager for questions about the current billing plan

なお、 organization owner または billing manager が見ると表示されるメッセージが以下のものに出し分けられているようです。

GitHub Actions workflows can't be executed on this repository.
Actions is not available for legacy per-repository billing plans. Please visit your billing settings to upgrade your account.

ペライチで利用していた Github のプランがリポジトリ数課金のレガシーなもので、
このままでは GitHub Actions の利用ができなくて困っていましたが、
開発部長に相談したところ爆速で課金プラン移行していただけました。

具体的には CTO から承認いただいたり、 Organization のアカウントを棚卸しすることによって
プラン移行によるコスト増を最小限に抑えるといった対応です。
(実際に棚卸しをすることによってかなりコストを抑えることができました🎉)

使用したいサービスがある場合など適切に相談すれば今回のような対応をいただけるので、
技術的な楽しさを感じられクリエイターパラダイスな組織を目指していることの恩恵を享受できていると思っています。

クリエイターパラダイスな組織については以下の記事をご覧ください。
https://zenn.dev/peraichi/articles/0eacaefda7db4e

GitHub Actionsの設定

検証時の内容ですが、以下設定で Pull Request 毎に PHPStan での解析が実施できるようにしました。

.github/workflows/reviewdog.yml
name: reviewdog

on: [pull_request]

jobs:
  reviewdog:
    name: reviewdog
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '7.2.34'
      - uses: reviewdog/action-setup@v1
        with:
          reviewdog_version: latest
      - name: phpstan install
        run: composer require phpstan/phpstan
      - name: run phpstan and reviewdog
        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

ペライチでは中〜大規模の開発の際にリリースブランチを切っておいて、
そこに機能単位で Pull Request をしていく方式を取ることが多いため、
on: [pull_request] のみとしてベースブランチを master に限定していません。
master ブランチへの Pull Request だけを対象にしたい場合は以下のような設定にします。

on:
  pull_request:
    branches:
      - master

実際に試してみる

試しに PHPStan で怒られてしまうメソッドを追加して Pull Request を作成してみます。

    private function getReport()
    {
        return '返り値の型宣言をしていないメソッド';
    }

返り値の型宣言をしていないため、 Pull Request へのコメントでこのように指摘がされました🐶💬

result_screenshot_1

返り値の型宣言で array としているのに引数によっては string が返ってしまう場合も試してみます。

    private function getReport(string $param): array
    {
        if (empty($param)) {
            return '';
        }

        return [
            '返り値の型は',
            'arrayとは限らないよ'
        ];
    }

以下のようにコメントが付きます🐶💬

result_screenshot_2

まとめ

GitHub Actions で reviewdog を飼って静的解析する方法についてご紹介しました。
静的解析を追加することによって、ペライチシステムの品質をより向上していければと考えております。

また、 GitHub Actions が利用できるようになりましたので、これからどんどん活用していきたいです。
良い活用ができましたら別記事で紹介させていただきます。

採用情報

現在エンジニア募集しています!

▼ 選考をご希望の方はこちら(募集職種一覧)
https://hrmos.co/pages/peraichi/jobs?category=1629135637016141824&utm_source=techblog&utm_medium=referral&utm_campaign=article-01fy360dgteynbfv5tj3q6smv5

▼ まずはカジュアル面談をご希望の方はこちら
https://hrmos.co/pages/peraichi/jobs/0000029?utm_source=techblog&utm_medium=referral&utm_campaign=article-01fy360dgteynbfv5tj3q6smv5

募集中の職種についてご興味がある方は、お気軽にお申し込みください(CTOがお会いします)

ペライチ

Discussion