RuboCop とつきあう方法

こんにちは、元主夫の id:eitoball です。約5年ほどの試用期間*1を経て、今年4月から、Misocaにてフルタイムで開発しています。時事ネタは特にないですが、この夏に発売予定の Starcraft: Remastered を楽しみにしている今日この頃です。

今回は、本格導入してから、2年半になる RuboCop というツールについての話をしたいと思います。

RuboCop とは?

f:id:eitoball:20170526093756p:plain

RuboCop は、Rubyのコードが、コーディング規約に沿って書かれているかを静的にチェックしてくれるツールです。コーディング規約は、 Ruby Style Guide が、ベースとなっています。

RuboCop の導入

Gemfilerubocop gem を追加して、bundle install しました。rubocop と実行すると最初は、多くの警告が出てしまうので、rubocop --auto-gen-config で、.rubocop.ymlrubocop_todo.yml という設定ファイルが作成されました。.rubocop_todo.yml 内では、一旦、全ての検知項目が、無効にされていました。

Jenkins で、CIをしているので、rubocop を実行して、警告がある場合は、ビルドを失敗とするようにしました。 rubocop-checkstyle-formatter を開発して、Checkstyle 形式で警告を出力して、Jenkins の Checkstyle プラグインで、違反箇所が、Jenkins の UI から、分かるようにしました。

f:id:eitoball:20170526094327p:plain

無効にした警告の有効化

一旦、無効にした検知項目は、少しずつ有効にしていきました。できるだけ早く全ての検知項目を有効にして、違反するコードを増やさないようにしたかったので、次の方針で有効にしていきました。

  1. 可能な限り、RuboCop がデフォルトで有効にする。
  2. 1行の文字数などの検知項目は、とりあえず、その時点での最大値を使って有効にする。最大値が、他と比べて、極端に大きい場合は、マジックコメント(# rubocop:disable ...)で、その箇所のみを無効にする。
  3. 警告を修正する場合は、 rubocop -a で自動修正して、手動で修正する必要な箇所は、マジックコメントで、特定の箇所のみ無効にする。

検知項目を有効にする場合は、有効にするプルリクエストを作成して、チームによるレビューを経て、マスターブランチにマージしていきました。わかりやすくて、チームの合意が簡単に得られそうなインデントや行末の不要な空白などのレイアウト関連の警告は、5つ程度まとめて有効にしていきました。ハッシュの記法など議論が起こりそうな警告や変更が多い警告の場合は、1つずつ有効にしました。

f:id:eitoball:20170526102409p:plain

RuboCop の更新

RuboCop の更新に伴い、新しい検知項目が増えていきます。Misoca では、bundle update して、使用している gem を週に1回更新するようにしていて、RuboCop の更新は、大体月に1回程度です。新しい指摘項目が増える場合は、一旦、それらを無効します。それから、前述の方針で、できるだけ早く全ての指摘項目を有効にしていきます。

最新のバージョンを使う上で、注意したいのは、RuboCop の不具合や誤検知です。その場合は、問題のありそうな警告を無効にして、次のバージョンまで様子を見るのも良いと思います。もしくは、修正して、プルリクエストを出すのも良いと思います。同僚の id:mzp や僕は、プルリクエストを出して、貢献しました。

github.com

github.com

github.com

RuboCop を導入したメリット

RuboCopを導入してからは、プルリクエストでのレビューコメントで、記法についての指摘をすることが、無くなり、変数やクラス名についてを考えるとか他の重要なことについての時間を使うことができるようになりました。また、規約に関する指摘は、人からより、機械からの方が、角が立たなくて、心理的な負担がなくなりました。

さいごに

Misoca では、コーディング規約を守ってコードを書きたい几帳面な開発メンバーも募集しています。ご興味ある方は、是非、応募して下さい。

*1:事実は、家庭の都合で、パートタイムで開発していました