止まっていたRuboCopを復活させ、秩序を取り戻す
「あれ?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を下げる取り組み
さらなる秩序を求めて仲間になっていただける方を募集しています!
スペースを簡単に貸し借りできるサービス「スペースマーケット」のエンジニアによる公式ブログです。 弊社採用技術スタックはこちら -> whatweuse.dev/company/spacemarket
Discussion