9万件のRuboCop警告を60%削減した話
noteのエンジニア兼佐久間まゆちゃんのプロデューサーの@hiroki_tanakaです。毎日note連続投稿の記録を着実に伸ばしており、88日目になります。(2021年8月現在)
今回はnoteにRuboCopを導入し、警告がでたコードを60%削減できたことや、リリースフローを変更したことについて話していきたいと思います。
RuboCopとは
Railsで開発をしている方にはおなじみかもしれませんが、RuboCopはRubyの静的コード解析ツールです。規約を守れていないコードに警告をだすだけではなく、インデントや改行位置の修正、使用NGなメソッドの置換なども自動で行うことができます。
RuboCopを導入することによって、開発チーム全体でコードの整合性をとることができ、可読性や品質の向上を見込めるでしょう。
コードを整備するということは、新しく入社するエンジニアが迷わず開発ができることにもつながります。RuboCopの導入は、チーム全体の開発速度をあげることにもなるでしょう。
実際にどのようにRuboCopがコードを解析するのか、簡単な例を紹介します。
上記のようなコードがあったときに、間違いを瞬間的に人間が見分けるのは非常に難しいはずです。
RuboCopを実行することによって、瞬時に問題をあぶり出すことができます。
こういった人間が検知しづらい問題をRuboCopに任せることによって、エンジニアは向き合うべき課題に集中して取り組むことができるようになります。
警告9万件オーバーに立ち向かう
noteリポジトリにRuboCopを導入して、まずはRuby on Railsと同じコード規約を適用してみました。その結果、なんと92000個の警告がでました。また、.rubocop_todo.ymlにはコード違反しているファイルを無視する設定を記載できるのですが、当初は3200行にも及んでいました。
「うわ…当社のレポジトリ、警告多すぎ……」という感じでした(笑)
そこから4ヶ月間かけて対応を少しずつ行い、92000個あった警告を39000個まで減らすことができました。また、.rubocop_todo.ymlの行数も1000を切る所まで進んでいます。粛々と対抗を行ってきたことが成果につながっています。
また、Rubocop_challengerの導入も効果が高かったと実感しています。Rubocop_challengerは、警告がでているコードに対して自動でPRを作成してくれます。毎朝、発行されるPRを直していくことによって、着実に改修していくことができました。
RuboCop導入による問題も発生し、1から対応を見直した
コードの警告を60%減らすことができたため、一見するとRuboCopの導入は大成功に見えるかもしれません。
しかし、RuboCopが自動修正したコードによって、不具合が発生してしまうなんてことも……。
また、修正に対する確認フローを確立していなかったため、検出した問題を修正するのが属人化してしまうという問題もありました。
そこでRuboCopでの修正や対応をどのように進めていくか、1から決め直すことにしました。
安全面を考えて、自動で破壊的な変更はしないようにするのはもちろんのこと、一気に修正を行わずに「コントローラーだけ」や「サービス配下のディレクトリだけ」のように分割して修正を実行するようにしました。
また、RuboCopの挙動がバグって自動修正がおかしくなるときもあるため、手動での対応も行っています。
そして、RuboCopによる修正で障害発生してしまっては元も子もないため、検証〜本番リリースまでの対応も全面的に見直しました。
毎週、水曜の16時〜17時半に検証する時間をつくり、本番にリリースするフローを組んでいます。developブランチへのマージのブロックも行い、RuboCopの修正だけが検証できるようにしています。
ここまでしっかりとした体制を立てたのには理由があります。今回のリリースフローが、note全体のリリースを改善するためのプロトタイプも兼ねているためです。今回のフローをテストとして、全体のリリースをより安全なものにしていく計画です。
まとめ
RuboCop対応は個人だけでは進めていくことができません。
コードへの警告がでたらすぐに修正してもらえるように、会社の文化として定着させていく必要があります。エンジニア全体での意識改革が重要だと考えています。
導入して日も浅いため、まだまだ改良の余地があると考えています。コード規約の改善もどんどんしていく予定なので、なにかあればすぐに相談していただければと思います。
※こちらの記事は、社内LT大会の内容を再編した内容になります
▼noteを一緒に作りませんか?
▼エンジニアの紹介記事
Text by megaya