log

Jenkins で Rails3 プロジェクトのカバレッジを計測する

話にはよく聞くけど実際 Jenkins 使ったことないなーってことで、ちょうど手元で試してた rails3 のプロジェクトを対象に構築してみることにした。

rails3 でカバレッジ計測

以前は rcov 使ったと思うんだけど、rcov は 1.9.* には対応してないらしい。 最近の流行りは simplecov らしいってことで simplecov を入れる。

参考: Ruby 1.9.2 + Rails3でテストカバレッジを取るにはSimpleCovが良さそう | FIRN.JP

ちなみに rspec までは導入済みという前提。

必要なのは simplecov と simplecov-rcov。前者がカバレッジ計測で後者は出力フォーマットを rcov 互換にする。

まずは Gemfile に simplecov と simplecov-rcov を追加。

group :test do
gem 'simplecov', :require => false
gem 'simplecov-rcov', :require => false
end

追加したら bundle install を実行。

$ bundle install

spec/spec_helper.rb に以下の記述を追加。 require 'rspec/rails' よりも前じゃないと正常に動作しないっぽい。

require 'simplecov'
require 'simplecov-rcov'
SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
SimpleCov.start 'rails'

準備ができたら rake spec を実行する。結果は coverage/rcov 以下に出力される。

$ rake spec

simplecov の設定はひとまず完了。

Jenkins インストール

公式の Wiki に Ubuntu の場合のインストール手順が載ってたのでそのまま実行。

ちなみに、rails 開発環境とは別マシンを作ってそっちにインストールした。実際に運用するときを想定して。

Installing Jenkins on Ubuntu - Jenkins - Jenkins Wiki

Jenkins サーバに rvm をインストールする

手順は 以前エントリにまとめた のでそれをそのまま使う。

開発マシンから git clone するために ssh 公開鍵の設定

考えてみたら、複数人開発で git 使うときって何が主流なんだろう。公開できないようなレポジトリの場合。github のプライベートレポジトリ? gitosis? gitlab? まあいいや。

とりあえず、ssh アクセス用に開発マシンに jenkins アカウントを作っておく。

% sudo adduser jenkins

続いて、jenkins サーバで公開鍵を作る。パスフレーズは空のままにしておくこと。

$ sudo su - jenkins
$ ssh-keygen

一度開発マシンに ssh ログインする。

$ ssh jenkins@rails-dev

gitconfig の設定

これを済ませておかないと clone でこける。

参考: Ubuntu ServerにJenkinsをセットアップしてGitレポジトリと連動するまでのまとめ - jiska

sudo -u jenkins -H git config --global user.email "jenkins@jenkins-server"
sudo -u jenkins -H git config --global user.name "jenkins"

必要なプラグインをインストールする

今回の用途だと以下の三つを入れておくといいらしい。

  • Jenkins ruby metrics plugin
  • Jenkins GIT plugin
  • Jenkins Rake plugin

インストールは http://jenkins-server:8080/pluginManager から GUI で実行可能。便利。

rails プロジェクト用ジョブ作成

設定を以下にまとめる。

#!/var/lib/jenkins/.rvm/bin/rvm-shell ruby-1.9.2-p290@rails3
bundle install --without=production
rake db:migrate
rake spec
  • ビルド後の処理

これでひと通り設定完了。のはず。うまくいかない場合はコンソール出力を確認すること。