ruby のプロジェクトで rubocop をアップデートする

とある ruby のプロジェクトで、rubocop のバージョンが相当程度古いまま運用されていたので最新版へアップデートしたのでそのメモ

戦略

  • 原則すべて有効にする。最後まで残ったものは .rubocop_todo.yml に押し込める
  • 現状を壊さない
  • 分割して行う

とった方法

  • まず、 bundle update rubocop を行う。

関連パッケージの依存関係で成功しないこともあるので、成功するまで関連パッケージを足していく。

この時点では Gemfile.lock (とGemfile) にしか変更はない。

  • rubocop を実行して、出てくる cop 一覧を作る。

単純に bundle exec rubocop する。 そして出てきた cop 違反の種類を記録する。

  • rubocop -a (safeなものの修正)

rubocop -a で 修正できる cop を1コミット 1 cop の粒度で 自動修正する。

この段階でGemfile, Gemfile.lock 以外の自動修正されたファイル群を レビューしてもらって mergeする

  • rubocop -A

rubocop -A で修正できる cop を 1コミット 1cop の粒度で自動修正しながら テストを実行していく。

cop のドキュメントを読みつつ、修正された箇所が問題ないかを確認しながら行う。

テストが通らない場合は、通らない理由を確認しつつ、 必要に応じて修正したり # rubocop:disable する。

この段階でGemfile, Gemfile.lock 以外の自動修正されたファイル群を レビューしてもらって mergeする

  • 自動修正できないcop を修

rubocop --only COP で1つずつ実行して、修正箇所を ドキュメントを読みつつ修正。 必要に応じて # rubocop:disable する。

テストを実行する。 ここでも 1cop 1commit を守る。

ここでは、 可能であれば 1cop ごとにレビューしてもらう。粒度が小さすぎたら、修正行数が多くならない程度に分割してレビューしてもらい mergeする。

  • Gemfile Gemfile.lock の merge 上記まで終わって、それでも残るものは .rubocop_todo.yml に押し込んで、 Gemfile Gemfile.lock をmergeする。

結び

最終的に、 自動修正できない cop が少なかったので、上記を 4 つにわけてレビューしてもらいつつ mergeした。

rubocop をアップデートする中で、こんな書き方もあるのか。という真学びが、レビューした人にもあったようで、とても良かった。またrubocop を最新化することで、 新しい ruby バージョンにも対応することができ、今後の ruby バージョンアップにも助かるようになった。

Gemfile を最後まで merge しない。というのは、無駄にCIが壊れず体感的には良かったように思う。

今回、 rubocop が rubocop-rspec を入れるといいよというメッセージを出しているのをかたくなに無視して進めたので、次は rubocop-rspec の導入もしていきたい。