堀井 啓真

Rails Best Practices を CI (Jenkins) で確認する


こんにちは。ほりいです。 今日は rails-bestpractices の話をします。

Ruby on Rails で開発するときのベストプラクティスをまとめている Rails Best Practices というサイトがあります。先日の RubyKaigi 2011 で、このサイトのベストプラクティスに従っていないコードを指摘してくれる gem である rails_best_practices についての 発表がありました

今回はそれを CI に組み込んでみた話をしたいと思います。

とりあえず rails_best_practices を実際のプロジェクトのソースに対して使ってみることにします。(一応使われている項目の確認はしておきましょう)

インストール〜実行

gem install rails_best_practices
cd path/to/rails/root
rails_best_practices

command of rails_best_practices

ほとんどが 行末のスペースを除去せよrender に与えるオプションが古い というエラーでしたが、257 箇所エラーだよと教えてもらいました。

んー

多いですね。

Jenkins

このプロジェクトではこのエラー(?)を少しずつ直していこうということになりました。とはいえ、現状 rake spec と関連もないため、「たまに回してみる」などという不確実な方法になりがちです。

そこで、CI のレベルでトラッキングします。弊社では Jenkins を使っているので、このプラグインを利用して記録を取ることにします。

Rails の指標を測るために使われる Jenkins のプラグインには RubyMetrics plugin というものがあります。これを使えば、 rcov によるカバレッジの測定などはすぐ組み込むことができます。

できればこれに組み込めるのが理想なので、上記ソースを見ましたが、大変そうなので今回はパスし、汎用的なプラグインを利用します。

Plot Plugin

Jenkins の汎用的なグラフ描画プラグインに Plot Plugin というものがあります。今回はこれを利用します。

まず、 Jenkins のプラグインマネージャーから「Plot Plugin」を探してインストールします。

次に、プロジェクトの設定を書きます。

まずは Plot Plugin の設定。

Jenkins Plot Plugin Setting

  • 「ビルドデータのプロット」にチェックします。
  • 「プロットを追加」して設定の追加を開始します。
  • 重要なのは「データ系列ファイル」の部分で、このファイルに結果を出力します。
  • 「プロパティファイルからデータを読み込む」にして、この形式に合うような結果出力を行うよう、調整していきます。

ここでは reports/rails_best_practices.properties に出力することにしています。このファイルに指定されたデータ形式で結果を出力するようなスクリプトを書きます。

https://gist.github.com/1173288

#!/bin/sh

cd `dirname $0`/..

OUTDIR=reports
OUTFILE=$OUTDIR/rails_best_practices.properties
TMPFILE=`mktemp $OUTDIR/rails_best_practices.XXXXXX`

mkdir $OUTDIR 2> /dev/null
rails_best_practices > $TMPFILE

STATUS=$?

if [ $STATUS -eq 0 ]; then echo “YVALUE=0” > $OUTFILE
else NUM=`awk ‘/^Found [0-9]+ errors/{ print $2; }’ < $TMPFILE` echo “YVALUE=$NUM” > $OUTFILE
fi

rm $TMPFILE

あとは、このスクリプトをビルドの途中で実行しておきます(もちろん、Jenkins でのビルド環境で rails_best_practices をインストールしておくのを忘れずに)

結果表示

うまくいっていれば左メニューの「プロット」からこのようなグラフを見ることができるはずです。

まとめ

rails_best_practices で確認できるプラクティスは “Rails Best Practices” の一部ですが、それでも指標を出せることは意義が大きいと思います。そして、それを CI 見える化しておくことはとても参考になると思います。

あとは誰か RubyMetrics で使えるようにしてくれると……(他力本願)。

それではまた。