とある 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 の導入もしていきたい。