LoginSignup
5
2

More than 3 years have passed since last update.

Railsのコードをリーズナブルに自動コードレビューをしてもらうためのGithub Actions

Posted at

はじめに

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に書いてあります。

  1. 静的解析ツールを動かすために必要なRubyとNode.jsのインストール
  2. プロジェクトで必要なライブラリ群のインストール
  3. reviewdogのインストール
  4. reviewdogの実行
.github/workflows/code_analysis.yml
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
.reviewdog.yml
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にプロジェクト内で見つかったものがすべて書かれているので…どれくらい課題が溜まっているかも見れるので、気にしているとよいかもしれません。

image.png

ハマったところ

Rubyのセットアップはruby/setup-rubyを!

GitHub謹製のactions/rubyはパッチバージョンを指定できず、最新が少し遅れて使われています。
GemfileでRubyのバージョンを指定したりすると思うのですが、これと相性が悪く、バージョンがズレてしまうことがたびたびあり、bundle installに失敗してしまいます。

Rubyコミュニティがメンテナンスしているruby/setup-rubyはパッチバージョンの指定もできるので、こちらを使うようにしました。

恥ずかしいからプルリクエストに出す前に直したい!

自PCにreviewdogをインストールして、↓のようにすれば事前に確認できます。

$ reviewdog --diff='git diff main'

最後に

こういうのは人間にお願いすると自分もレビュワーもツライので、機械にお願いするのが一番です。指摘されると、たしかに…ということが多いので、自分だけでは拾いきれない、よい書き方を学べて助かっています。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2