逃げる8回で会心の一撃

Web エンジニアのサトウリョウスケが開発とか色々書くブログです

Rubocop Challenger 作者が教えるオススメの使い方。 〜 .rubocop_todo.yml 解消後も消さないで残しておくと良いことがあります!〜

1 ヶ月も前になってしまいましたが、クラッソーネの @yamat47 さんが拙作の rubocop_challenger を使って .rubocop_todo.yml を解消した、というブログを書いて下さいました。

かつての自分と同じような課題を抱えていた方に自分の gem を役立てて頂けたのは本当に嬉しいです。 ブログ化までして下さった @yamat47 さん、本当にありがとうございます!

また、gem の README では Circle CI を使った方法しか紹介してなかったのですが、GitHub Actions を使った方法についても解説して頂いており、重ね重ね感謝感激です🙏 GitHub の README からもリンク貼らせて頂きました!

zenn.dev

一方で、ひとつ気になったことが。。

自動で解消できるものがなくなって以降はRuboCop Challengerの仕組みが不要になったので、最後は削除してしまいました。

手動で対応した履歴

ありがとう、RuboCop Challenger...!!

待って! Rubocop Challenger は消さないで残しておくと良いことがあります!

Rubocop Challenger は v2.0.0 から bundle update 機能も兼ね備えています

本家 RuboCop の gem をアップデートする時、新しく追加された Cop によってエラーが出てしまった、という経験は無いでしょうか? このエラーの解消が億劫で gem のアップデートを放置してしまっている方もいるかも知れません。

Rubocop Challenger v1.0.0 のテーマは「負債の解消」だったんですが、 v2.0.0 からは「RuboCop との共生」だったりします。

誰にも話したこと無いので今始めて公表しました←

v2.0.0 以上の Rubocop Challenger では最初に RuboCop 関連の gem に対して bundle update を実行するようになっています。

最新の RuboCop にアップデートした状態で Rubocop Challenge を実行するので、新しく追加された Cop に違反したコードがあった場合、その場で即 auto-correct を実行し、以下のような PR を作成してくれます。

f:id:ryz310:20210923205915p:plain
RSpec/ExcessiveDocstringSpacing を修正した PR が作成されました
f:id:ryz310:20210923210041p:plain
同 PR で rubocop-rspec が v2.4.0 から v2.5.0 にアップデートされています

一方 dependabot も rubocop-rspec v2.5.0 の bundle update の PR を作成してくれていますが、こちらは CI の RuboCop チェックでエラーになっています。 RuboCop の CI チェックをパスしないと merge 出来ない設定にしている場合も多いと思いますが、これを修正するのは地味に面倒です。

f:id:ryz310:20210923210548p:plainf:id:ryz310:20210923210545p:plain
RuboCop の CI チェックでエラー

ちなみに違反したコードが存在しない場合は Re-generate .rubocop_todo.yml with RuboCop v1.21.0 のような PR が作成され、 bundle update を実行しただけの PR が作成されます。

この機能は地味に便利なので、CI のスケジュール実行を使って週イチくらいで動かすのがオススメの使い方です。

v2.0.0 以降の RuboCop Challenger は Gemfile に含めない事をオススメします

v2.0.0 あたりから RuboCop Challenger を Gemfile に含めて実行すると、他の gem との互換性問題でエラーになるケースを確認しております🙏 現在では以下のように CI での実行時に gem install rubocop_challenger を実行する方法をオススメしております。

# .circleci/config.yml
version: 2

jobs:
  rubocop_challenge:
    docker:
      - image: circleci/ruby:3.0
    working_directory: ~/repo
    steps:
      - checkout
      - run:
          name: Rubocop Challenge
          command: |
            gem install rubocop_challenger
            rubocop_challenger go \
              --email=rubocop-challenger@example.com \
              --name="Rubocop Challenger"

workflows:
  version: 2

  nightly:
    triggers:
      - schedule:
          cron: "30 23 * * 1,2,3" # 8:30am every Tuesday, Wednsday and Thursday (JST)
          filters:
            branches:
              only:
                - master
    jobs:
      - rubocop_challenge

こちらは完全に自分がやらかしたというか、会社で書いた以下のブログの内容が古いまま更新しなかったため、 Gemfilerubocop_challenger を入れて使っている方が沢山 (?) いるかも知れません。 GitHub の README ですら間違っていたので、さっき慌てて修正しました。。

developer.feedforce.jp

古い方法で使ってしまった皆さん、本当にすみません。。

rubocop_challenger を Gemfile に含めるのが.rubocop_todo.yml 解消後にアンインストールしたくなる理由の一つだと思うので、これで使い続ける人が増えてくれると嬉しいです🙏

安全な auto-correct かどうかが分かります

特にアナウンスしていなかった気がするのでついでにご紹介しておくと、最新の Rubocop Challenger では「安全な auto-correct」かどうかが分かるようになっていて、 PR の本文に以下のような記述が入るようになっています。

f:id:ryz310:20210923215918p:plain
✅ 安全な auto-correct

f:id:ryz310:20210923220846p:plain
⚠️ 安全でない auto-correct

RuboCop 公式によると「安全な auto-correct」の場合、元のソースコードが壊れる心配は無いとのことなので、 PR merge する際の判断材料にして頂ければ。