読者です 読者をやめる 読者になる 読者になる

hudsonでrvmを使ってrails3アプリを継続的インテグレーション(CI)

前々から興味があったhudsonをrails3のアプリケーションで使ってみた。
rvmを利用して綺麗な環境でビルドすることが目標。
 

hudsonの起動

第1回 Hudsonの導入:Hudsonを使ったアジャイルな開発入門|gihyo.jp … 技術評論社を参考にしました。
すんなり動くかと思いきや、HTTPサーバが起動しない。
しかもエラーも吐かないものだから困った。
 
原因を調べるとhudsonが悪いワケじゃなかった。
winstoneの中でIPv6localhostにconnectしているところでシーンという感じ。
ip6tablesを見るとloが空いてなくて、パケットがことごとく捨てられてたみたい。

ping6 ::1

すら何も帰ってこなかった…。
タイムアウトに時間がかかるのでエラーが吐かれる前に手で止めてて、エラーが確認できなかったのです。
しくしく。
 
とりあえず、IPv4を優先的に使うようにする。

$ java -Djava.net.preferIPv4Stack=true -jar hudson.war --daemon

無事に動作。
 

rvm

rvmの導入は第39回 RVM(Ruby Version Manager)による環境構築:Ruby Freaks Lounge|gihyo.jp … 技術評論社を読むこと。
 
gemsetを使ってプロジェクト用の環境を作成した。

$ rvm use ruby-1.9.2-p0
$ rvm gemset create rails-sample-app
$ rvm gemset use rails-sample-app
$ gem install rails sqlite3-ruby

ビルド

使用するプラグインについてはRuby on rails on hudsonの活用事例を参考にしました。
 
rcovのタスクは以下のように書いておく。

require 'rcov/rcovtask'

task :default => [:rcov]

desc "RCov"
Rcov::RcovTask.new do |t|
  t.test_files = FileList[ 'test/**/*_test.rb' ]
  t.rcov_opts << '--exclude /gems/,/Library/,/usr/,spec,lib/tasks,config/'
end

「rake rcov」でcoverageフォルダが生成される。
 
hudsonのビルドタスクはシェルで以下のように設定。
(当然だけどrvmが使えるユーザでhudsonを起動しないとダメ)。

bash -l -c "rvm 1.9.2-p0@rails-sample-app exec bundle install"
bash -l -c "rvm 1.9.2-p0@rails-sample-app exec rake db:migrate"
bash -l -c "rvm 1.9.2-p0@rails-sample-app exec rake rcov"

 
はまったことはプロジェクト内の.rvmrcの扱い。
プロジェクト内の.rvmrcをおいとくと、ビルド時に「信用しますか?」ってrvmに聞かれて、そこで止まってしまう。
なので、~/.rvmrcに以下を記入。

rvm_trust_rvmrcs_flag=1

こうすると「すべての.rvmrcは信用されるものとして読み込んでしまう」のであんまり良くないけど、背に腹は代えられぬ…。
逆に全部信用しないフラグがあればいいのになぁ(あるかもしれない)。
 

雑感

hudsonはUIが作り込んであってとても使いやすい。
ほんとに設定ファイルを書かずに済んだ。これは便利。
 

hudson.rb

ちょっと調べるとhudson.rbなるものがあるらしい。
https://github.com/cowboyd/hudson.rb
これはCLIでjobとかノードとか管理するものらしく、ruby版のhudsonとかではなかった。
普通の用途だと使う必要なさそう。