トップ «前の日記(2011/12/20 (火) ) 最新 次の日記(2011/12/22 (木) )» 編集 RSS feed

HsbtDiary


2011/12/21 (水) [長年日記]

[jenkins][funtoo][ci] Funtoo と Jenkins と Selenium で CI を実現

社内で動かしている Jenkins では cucumber で @javascript な feature はスキップする設定、つまり

$ bundle exec cucumber features  -t ~@javascript

を実行してたんだけど、Jenkins でも Xvfb を使えば firefox を仮想ディスプレイ上で起動して Selenium を走らせることができるということは知っていたので重い腰を上げて環境を構築してみた。

まずは Xvfb と firefox を入れなければならない。OS は funtoo を使っているので emerge を使ってガンガン入れる。

$ USE="xvfb" emerge -auvDN xorg-server firefox-bin

基本的に必要な物は上記の二つだけ。

Rails 側の変更点としては headless という gem を追加するだけ。これは Xvfb を起動したり終了したりをうまいことやってくれる gem. 今回は cucumber で headless を使いたいので下のような内容を features/support/env.rb に書いた。

headless = Headless.new
headless.start

at_exit do
  headless.destroy
end

あと linux で selenium を走らせるのが初めてで知らなかったんだけど、 selenium-webdriver は OS が Linux の場合は firefox というバイナリ名でブラウザを探すみたい。なので firefox-bin を使っている場合は firefox という実行ファイル(シンボリックリンク)が存在しなかったりするので、よしなに作成したり selenium-webdriver のバイナリパスを書き換えて対応する必要がある(やってないので誰か頼む)。

ここまで来たら、Jenkins で -t ~@javascript を外してもテストが実行できるようになるはず。最後に環境構築以外ではまったポイントは cucumber を --strict オプションで実行していると pending な feature があった場合にリターンコードが 1 で終わってしまい、Jenkins でテスト失敗と見なされること。これは、どうせ pending の feature はいつまで経っても pending だし必要ないコードなのだろうと判断して消して対応した。

テストの実行時間が3分から7分とだいぶ増えてしまったけど、これはこれで全てのテストを実行するために必要な時間なのでこれを何処まで減らすことができるかという方に今後は注力していくつもり。