見出し画像

9万件のRuboCop警告を60%削減した話

スライド:RuboCop対応のすべて

noteのエンジニア兼佐久間まゆちゃんのプロデューサーの@hiroki_tanakaです。毎日note連続投稿の記録を着実に伸ばしており、88日目になります。(2021年8月現在)

今回はnoteにRuboCopを導入し、警告がでたコードを60%削減できたことや、リリースフローを変更したことについて話していきたいと思います。

RuboCopとは

スライド:RuboCopの説明

Railsで開発をしている方にはおなじみかもしれませんが、RuboCopはRubyの静的コード解析ツールです。規約を守れていないコードに警告をだすだけではなく、インデントや改行位置の修正、使用NGなメソッドの置換なども自動で行うことができます。

RuboCopを導入することによって、開発チーム全体でコードの整合性をとることができ、可読性や品質の向上を見込めるでしょう。

コードを整備するということは、新しく入社するエンジニアが迷わず開発ができることにもつながります。RuboCopの導入は、チーム全体の開発速度をあげることにもなるでしょう。

スライド:解析する前のコード

実際にどのようにRuboCopがコードを解析するのか、簡単な例を紹介します。

上記のようなコードがあったときに、間違いを瞬間的に人間が見分けるのは非常に難しいはずです。

スライド:解析すると様々なエラーが検出される

RuboCopを実行することによって、瞬時に問題をあぶり出すことができます。

こういった人間が検知しづらい問題をRuboCopに任せることによって、エンジニアは向き合うべき課題に集中して取り組むことができるようになります。

警告9万件オーバーに立ち向かう

スライド:RuboCopで検出すると、92000件の警告がでた

noteリポジトリにRuboCopを導入して、まずはRuby on Railsと同じコード規約を適用してみました。その結果、なんと92000個の警告がでました。また、.rubocop_todo.ymlにはコード違反しているファイルを無視する設定を記載できるのですが、当初は3200行にも及んでいました。

「うわ…当社のレポジトリ、警告多すぎ……」という感じでした(笑)

スライド:4ヶ月、対応をすることで警告を60%削減することができた

そこから4ヶ月間かけて対応を少しずつ行い、92000個あった警告を39000個まで減らすことができました。また、.rubocop_todo.ymlの行数も1000を切る所まで進んでいます。粛々と対抗を行ってきたことが成果につながっています。

また、Rubocop_challengerの導入も効果が高かったと実感しています。Rubocop_challengerは、警告がでているコードに対して自動でPRを作成してくれます。毎朝、発行されるPRを直していくことによって、着実に改修していくことができました。

RuboCop導入による問題も発生し、1から対応を見直した

スライド:対応開始直後は問題も多くあった

コードの警告を60%減らすことができたため、一見するとRuboCopの導入は大成功に見えるかもしれません。

しかし、RuboCopが自動修正したコードによって、不具合が発生してしまうなんてことも……。

また、修正に対する確認フローを確立していなかったため、検出した問題を修正するのが属人化してしまうという問題もありました。

スライド:どうすれば安全にRuboCop 修正を進められるのか?

スライド:RuboCop対応の進め方(修正実施〜PR作成編)

そこでRuboCopでの修正や対応をどのように進めていくか、1から決め直すことにしました。

安全面を考えて、自動で破壊的な変更はしないようにするのはもちろんのこと、一気に修正を行わずに「コントローラーだけ」や「サービス配下のディレクトリだけ」のように分割して修正を実行するようにしました。

また、RuboCopの挙動がバグって自動修正がおかしくなるときもあるため、手動での対応も行っています。

スライド:RuboCop対応の進め方(検証〜本番リリース編)

そして、RuboCopによる修正で障害発生してしまっては元も子もないため、検証〜本番リリースまでの対応も全面的に見直しました。

毎週、水曜の16時〜17時半に検証する時間をつくり、本番にリリースするフローを組んでいます。developブランチへのマージのブロックも行い、RuboCopの修正だけが検証できるようにしています。

ここまでしっかりとした体制を立てたのには理由があります。今回のリリースフローが、note全体のリリースを改善するためのプロトタイプも兼ねているためです。今回のフローをテストとして、全体のリリースをより安全なものにしていく計画です。

まとめ

スライド:終わりに

RuboCop対応は個人だけでは進めていくことができません。

コードへの警告がでたらすぐに修正してもらえるように、会社の文化として定着させていく必要があります。エンジニア全体での意識改革が重要だと考えています。

導入して日も浅いため、まだまだ改良の余地があると考えています。コード規約の改善もどんどんしていく予定なので、なにかあればすぐに相談していただければと思います。

※こちらの記事は、社内LT大会の内容を再編した内容になります

▼noteを一緒に作りませんか?

▼エンジニアの紹介記事

Text by megaya

最後まで読んでくれた方へ。note社の様子や採用情報などをX(Twitter)で発信しています!