RubyCritic + CircleCI + Slack でプロジェクトの Ruby コードを継続的に採点しよう

はじめに

こんにちは! Sherpa事業部製品開発室の太田です。
この記事ではプロジェクトの Ruby コードを継続的に採点する方法を紹介します。

使用するツールとバージョン情報

  • RubyCritic v3.5.2
    • ※本当は4以上を使いたいところですが、プロジェクトの依存ライブラリの関係で3を選択しています
  • CircleCI v2.0

RubyCritic とは

  • Ruby コードを静的解析してスコアをつけてくれるツールです
  • RubyCritic について詳しくはこちらの記事をご参照ください

RubyCritic を CircleCI 上で実行する

プロジェクトの Gemfile に RubyCritic を追加

  • 依存ライブラリの問題がなければ、RubyCriticの4系を入れることをおすすめします
  • 理由は、後述するマルチフォーマットが使えるためです
  • 余談ですが、当プロジェクトでは依存ライブラリ(Reek)の関係で最新のバージョンにできず、3系を使用しています。。
    • Reekを4 -> 5にバージョンアップすればいけそうなので、近い内にやりたいところです

CircleCI の Config を設定

.circleci/config.yml の例

  • ※1… RubyCritic を実行
    • ここでは結果をパースしやすいように JSON フォーマットで保存しています
    • RubyCritic のバージョンが4以上場合、マルチフォーマットが使用できるため JSON と HTML の両方を指定すると便利です
      • コマンド例: rubycritic --format json --format html
      • 結果のパース用の JSON だけではなく、画面での閲覧用に HTML が出力できます
    • RUBYOPT=-EUTF-8 の指定は、 invalid byte sequence in US-ASCII というエラーの対策です
  • ※2… 結果の JSON をパース & Slack 通知するスクリプトを実行
    • Rake タスクを作成(後述)
    • Rake タスクに渡しているブランチ名、HEAD、ビルドURL、リポジトリ名は CircleCI 組み込みの環境変数から取得できます
  • ※3… Artifacts に結果を保存
    • CircleCIの機能で、ビルドの成果物を長期間保存することができます
    • ビルド画面の Artifacts タブから参照できます
  • ※4… Workflow でジョブ分離・ブランチ指定
    • 開発の本流ブランチ( development )のみ実行するようにフィルターを指定します
    • ビルドは merge, push などブランチに変更が入った場合に実行されるようになっています

結果のパースと Slack 通知

  • Rake タスクでごりごり書いてみました

実行結果

CircleCI のビルド結果

  • (HTML 出力していた場合) Artifacts タブから結果の HTML を閲覧できます

  • overview.html をクリックした結果

  • code_index.html をクリックした結果

Slack 通知結果

  • このように通知されます(画像は例です。スコアの動きがおかしいですが、実際のものとは異なります)

今後について

  • 結果の推移を見るために、簡単にアクセスできる場所にスコアを溜めてグラフ化できると面白そうだと思いました
  • ブランチ間の差分だけ採点するやり方もあるため、 Topic ブランチ <-> 本流ブランチを比較してスコア90未満はマージできないようにする、などもできそうです

参考文献

太田 実花

太田 実花

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする