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
アクションを定義して公開できるってなかなか夢がありますね。