🛀

止まっていたRuboCopを復活させ、秩序を取り戻す

2024/02/15に公開

「あれ?RuboCopの設定は残っているけどCIで動いてないのでは・・?🤔」

はじめまして、エンジニアのもりわきです。
スペースマーケットには昨年の11月に入社しました。
入社エントリも書いたのでよければどうぞ!)

今回は入社後から1ヶ月くらいRuboCopの整備を少しずつしていたのでその経緯と効果をお伝えしようと思います。

はじまり

スペースマーケットはバックエンドのAPIにRuby on Railsを利用しています。

あわせて、静的解析ツールとしてRuboCopの導入がされていましたが、これまでの歴史(今年で10周年です🎉)の中で運用する人が少なくなったり、Railsのバージョンアップに伴った警告が多く出てしまうことなどからだんだんと運用されなくなっていました。

一方でフロントエンドはというと、ESLintやPrettierを利用した開発が根付いており、品質を保つための取り組みが既にできている状態でした。
この乖離はとても勿体ないですし、Railsの開発においてもやらない理由はありません。

復活の儀

まずは今のコードをNo警告でCIで動くようにし、あとでルールを整備していくことにしました。

  • パフォーマンス用のcopを入れたかったので rubocop-performance を追加
    • RuboCop入れている理由の半分はこれ!というくらい個人的には重宝しています。いい書き方を提示してくれるのは助かりますね。
  • RuboCop関連のgemを更新
  • 既存のコードはすべてパスするように .rubocop_todo.yml を作成
rubocop --auto-gen-config --no-exclude-limit
  • GitHub Actionsを使ってrubocopを実行し、プルリクにコメントをつける
    • 元の設定を見るとdangerおよびrubocop-dangerでPRに対してコメントが付く仕組みになっていましたが、今回からはreviewdogを使うことで簡単に実現するようにしています
- name: rubocop
  uses: reviewdog/action-rubocop@v2
  with:
    rubocop_version: gemfile
    rubocop_extensions: rubocop-performance:gemfile rubocop-rails:gemfile rubocop-rspec:gemfile
    github_token: ${{ secrets.GITHUB_TOKEN }}
    rubocop_flags: --config .rubocop.yml .
    reporter: github-pr-review

土台は整った

さて、これで復活の儀は完了です。
ここからは無視したルールを有効化していくことになりますが、コードベースが大きいことや破壊的な変更を避けたいことから安全な変更( --auto-correct で対象になるもの)のうち、これだけは今後守っていきたいというルールを洗い出します。

このあたりの判断はこれまでのコードの書き方を見たり、メンバーのフィードバックを得ながらわたしの主観で定性的に決定しました。
最終的に以下のようなルールを始めとして、空白やインデントの扱い、改行などのスタイルに関するもの50個について対応を進めます。

# インデント
Layout/IndentationStyle
# 末尾改行
Layout/TrailingEmptyLines
# 冗長なreturn
Style/RedundantReturn

とくに空白の扱いに関してはかなり自由度の高い書き方になっていたこともあり、200ファイル近い変更のプルリクをあげることも・・(ということを数回繰り返しました)

レビュアーのみなさん、本当にありがとうございました!

おれたちの戦いはこれからだ

さて、ここまでで一通りの整備をすることができました。
1ヶ月ほどプルリクの様子を見ていましたが、ちゃんと警告を受けた箇所をみんな修正してくれており、バラバラだった書き方が合うようになっています。
これは大きな一歩ですね。

しかし、まだまだやることは残っています。

主にMetrics系のルールはリファクタリングが必要になるため、本当に重要なのはここからです。

  • AbcSizeを下げる取り組み
    • めざせ20台!
  • CyclomaticComplexityを下げる取り組み
  • BlockNestingを下げる取り組み
  • ClassLength, MethodLengthを下げる取り組み

さらなる秩序を求めて仲間になっていただける方を募集しています!

スペースマーケット Engineer Blog

Discussion