はじめに
GitHub ActionsにはMarget PlaceでいろいろなActionが公開されていて、導入するだけでRailsプロジェクトで即使えます。ただ…そのままだと仮想マシンを何台も使うので、プライベートなリポジトリではあっという間にクレジットを消費してしまいます…。そこで、自分達のプロジェクト用に作ることにしました。
対象プロジェクト全体を解析し、常にクリーンに保つようにできればよいのですが、途中から入れたせいもあり、なかなかできず…。それなので最低限各々が出したプルリクエストに対してキレイにしようという方針です。
試したときのコードはこちらです。
https://github.com/ken1flan/test_with_reviewdog
今回使っているツール(ありがとうございます!)
-
reviewdog
- ↓の各静的解析ツールの出力からプルリクエストの分だけ抽出して、報告してくれます。
-
rubocop
- コミュニティ内でよいとされているRubyの書き方に沿っているかチェックしてくれます。
-
reek
- Rubyで書かれたコードの可読性/保守性/拡張性がよくないかチェックしてくれます。
-
brakeman
- Railsアプリケーションのセキュリティスキャナです。
-
haml-lint
- HAMLがメンテナンスしやすくなっているかチェックしてくれます。
-
eslint
- Javascriptがメンテナンスしやすいかなどをチェックしてくれます。
-
stylelint
- CSSやSCSSがメンテナンスしやすいかなどをチェックしてくれます。
コード
やっていることは大雑把に書くとこんな感じです。
reviewdogが内部で実行する静的解析ツールについては.reviewdog.yml
に書いてあります。
- 静的解析ツールを動かすために必要なRubyとNode.jsのインストール
- プロジェクトで必要なライブラリ群のインストール
- reviewdogのインストール
- reviewdogの実行
name: code_analysis
on: [pull_request]
jobs:
code_analysis:
name: runner
runs-on: ubuntu-latest
env:
REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7.1
- uses: actions/setup-node@v1
with:
node-version: 12.x
- name: cache vendor/bundle
uses: actions/cache@v1
with:
path: vendor/bundle
key: bundle-${{ hashFiles('**/Gemfile.lock') }}
- name: cache node_modules
uses: actions/cache@v1
with:
path: node_modules
key: yarn-${{ hashFiles('**/yarn.lock') }}
- name: bundle install
run: bundle check || bundle install --jobs=4 --retry=3 --path vendor/bundle
- name: yarn install
run: yarn install
- name: install reviewdog
uses: reviewdog/action-setup@v1
- name: reviewdog
run: reviewdog -reporter=github-pr-check
runner:
rubocop:
cmd: bundle exec rubocop
brakeman:
cmd: bundle exec brakeman --quiet --format tabs
reek:
cmd: bundle exec reek --single-line
haml-lint:
cmd: bundle exec haml-lint
eslint:
cmd: yarn run eslint app/**/*.js
stylelint:
cmd: yarn run stylelint app/**/*.{css,scss}
出力
こんなふうに出力されます。
プルリクエスト内で見つかったものは見やすく表示されます。
Filtered Findings
にプロジェクト内で見つかったものがすべて書かれているので…どれくらい課題が溜まっているかも見れるので、気にしているとよいかもしれません。
ハマったところ
Rubyのセットアップはruby/setup-rubyを!
GitHub謹製のactions/rubyはパッチバージョンを指定できず、最新が少し遅れて使われています。
GemfileでRubyのバージョンを指定したりすると思うのですが、これと相性が悪く、バージョンがズレてしまうことがたびたびあり、bundle installに失敗してしまいます。
Rubyコミュニティがメンテナンスしているruby/setup-rubyはパッチバージョンの指定もできるので、こちらを使うようにしました。
恥ずかしいからプルリクエストに出す前に直したい!
自PCにreviewdog
をインストールして、↓のようにすれば事前に確認できます。
$ reviewdog --diff='git diff main'
最後に
こういうのは人間にお願いすると自分もレビュワーもツライので、機械にお願いするのが一番です。指摘されると、たしかに…ということが多いので、自分だけでは拾いきれない、よい書き方を学べて助かっています。