GitHub Actions でrubocopの結果をPR時に表示する

GitHub Actionsでrubocopを実行するには、単純にgem install rubocopしてrubocopコマンドを実行すればいい。
けれど、「コードのどこがエラーだったのか」というのはgithub actionsからrubocopの出力を見に行かないといけないので面倒。

そこでその面倒臭さを解決するために、エラーだったコードの部分に直接注釈(annotation)を付けてくれる、Github ActionsのAnnotationを使用する。
すると、ワークフローのトップでは次の用に表示されてわかりやすくなる。

さらには次の用に、pull requestのコードの部分にも表示されるのでわかりやすい!!

設定方法

次のようなjobを作成する

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Rubocop Linter Action
      uses: andrewmcodes/rubocop-linter-action@v3.2.0
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    - name: Set up Ruby
      uses: ruby/setup-ruby@ec106b438a1ff6ff109590de34ddc62c540232e0
      with:
        ruby-version: 2.7.1
    - name: Cache gems
      uses: actions/cache@v1
      with:
        path: vendor/bundle
        key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-gem-
    - name: Install dependencies
      run: |
        gem install bundler
        bundle install --path vendor/bundle --without production
    - name: Rubocop
      run: bundle exec rubocop

2つだけ解説する。

rubocop-linter-actionの使用

    - name: Rubocop Linter Action
      uses: andrewmcodes/rubocop-linter-action@v3.2.0
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

rubocop-linter-actionっていう、rubocopの結果をannotationとしてくれるすごいやつを使う宣言である。
これは別タスクとして実行されるので、この行以降の処理をあまりブロッキングしない。
GITHUB_TOKENっていうシークレットなトークンをリポジトリの設定で行わなければいけないように見えるけど、実はそんなものを設定する必要はなくて、自動でやってくれる。
公式ヘルプのGITHUB_TOKENでの認証にある。

GitHubは、ワークフローで利用するGITHUB_TOKENシークレットを自動的に生成します。 このGITHUB_TOKENは、ワークフローの実行内での認証に利用できます。

この設定の他に、rubocop-linter-action自体の設定も別のymlファイルに書いておく必要がある。
プロジェクトの.github/config/rubocop_linter_action.ymlに次の設定を置く。
大事なのはversions。自動でGemfile.lockを読んではくれないっぽいので、バージョンを指定している。

check_name: 'Rubocop Results'
versions:
  - rubocop: '0.83.0'
  - rubocop-rails: '2.5.2'
  - rubocop-performance: '1.5.2'
  - rubocop-rspec: '1.39.0'
rubocop_config_path: '.rubocop.yml'
rubocop_force_exclusion: true
check_scope: 'modified'

この設定ファイルのフルバージョンはこちら
https://github.com/andrewmcodes/rubocop-linter-action/blob/master/.github/config/rubocop_linter_action.yml

rubocopを実行する

rubocop-linter-actionを実行しているのに、別でrubocopも実行する必要ある????
って思うかもしれないけど、これはちょっと苦肉の策で、、
rubocop-linter-actionは、コードにエラーがあってもannotationを作成するだけで、結果はfailにならない。←
なので、rubocopも実行して、エラーがある場合は結果をfailにすることにより、プルリクエスト上でrubocopのエラーがあることをわかりやすくしている。

単純にrubocopの結果をannotationしたいだけであれば、rubocop-linter-actionの実行だけで良いと思います。

感想

Annotationはコメントではないので、プルリクエストのコメント一覧には表示されない。
そこに表示したい場合は、Annotationじゃなくてコメント投稿するようなactionを使うといいのかもしれない。
これ使えるのかな。未検証です。
https://github.com/reviewdog/action-rubocop

アクションを定義して公開できるってなかなか夢がありますね。

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