Jenkins アドベントカレンダー 2013 の12/3の分として参加させていただきます。
とは言いながら、Redmine絡みのお話で申し訳ありません…。
お話の流れはこんな感じです。
- お話のきっかけ
- 最初は手で仮想マシン作成からALMiniumセットアップ…
- こんな構成でJenkinsを使ってインストール用ジョブを作成
- ジョブのステップの一部 (shell)
- セットアップログのキャプチャ
- ジョブをJenkinsでCIしてみる
- インストール完了時のキャプチャ
- せっかくだから、Serverspec とブラウザ表示(Selenium) のテストもしてみよう!
Qiitaの投稿としては長くて申し訳ないですが、何かの参考になれば幸いです。
お話のきっかけ
Redmineの関係でALMiniumのお世話になったことがあり、ALMiniumのissuesをウォッチしていたのですが、うまくセットアップできないとのチケットが登録されてきました。
実は最近、Vagrant + VirtualBoxでの仮想マシンのセットアップと、Chefに興味を持っていたところだったので、本当に失敗するのかCentOS6.4上でクリーンインストールしてみることにしたのが始まりです。
最初は手で仮想マシン作成からALMiniumセットアップ...
作業してみた環境は、下記の通りです。
- ホスト(作業用)OS: MacOS
- ゲスト(仮想環境/ALMiniumインストール用): VirtualBox上のCentOS 6.4
ゲストOS作成に当たっては、Vagrantを使い、イメージもVagrantbox.esにあるものを利用しました。
『イメージCDを使って最初からのOSインストール』といった手間が省けるだけでも、かなり楽ではあります。
が、やってみるとやっぱりissueに上がっている通り、ALMiniumのインストールに失敗してしまいました。一番の原因は、どうやら RubyForgeが利用できなくなっており、Redmineのソースが取得できなくなっていることのようでした。
Redmineも新バージョンがリリースされていたので、ALMiniumのソース中の、RedmineのダウンロードURLを修正したのはいいのですが、それでもまだ失敗。なんとなく、rubyをインストールするところで失敗しているのは分かったのですが、一回だけでは原因が掴めません。
途中で失敗した環境ではなく、あらためて新規で綺麗な環境で、数回セットアップを試したい…。
今やVagrantを使えば仮想マシンの作成自体、コマンドラインでできてしまうので、『 3回以上やるならJenkins! 』のマイルールで、Jenkinsを使って仮想マシンの作成 〜 起動 〜 ALMiniumのインストールシェルの実行を試すことにしました。
こんな構成でJenkinsを使ってインストール用ジョブを作成
ということで、早速Jenkinsのジョブを作成。
試行錯誤をしつつ、ALMiniumのソースのclone自体は、仮想環境の中ではなく、ホストOS側で行い、Vagrantの機能を使ってホストOS側のフォルダをゲストOS側にマウントさせることで対応してみました。
理由は、ソースの微調整をして、コミットする可能性があるからです。
※ゲストOS側にcloneしてしまうと、gitの設定や自分のアカウントすら作られていない状態のため、コミットしたらrootもしくはvagrantアカウントでのコミット記録になってしまいます。また、変更をリモートリポジトリにpushしようにも、githubに対するssh / gitconfigの設定がありません。
ということで、やってみたのが下記のような構成です。
ジョブのステップの一部 (shell)
Vagrantは使いたてであまり良くわかっていないのですが、こんな感じでシェルを設定しました。
cd VM/${VM_NAME}
vagrant halt
vagrant destroy -f
BUILD_ID=dontKillMe vagrant up
wait
export LANG=ja_JP.UTF-8
rm -fr ALMinium/*.installed
vagrant sandbox on
vagrant ssh -c "cd /vagrant/ALMinium && sudo bash ./smelt"
セットアップログのキャプチャ
本来は対話式で進むのですが、Jenkinsで回すとデフォルト値で勝手に処理が進みます。
ジョブをJenkinsでCIしてみる
さて、Jenkinsから継続的にクリーンなOSの起動 〜 ALMiniumのインストール実施が出来るようになりましたが、最初から上手くインストールが完了したわけではありません。
1. インストールできたんだけど凄く時間がかかる!
ビルドの実行結果が語っているとおり、インストール完了までに53分かかり、これはいくらなんでも遅すぎ!
なんとか処理を早くしたいと思い、Vagrantfileに下記の設定を追加しました。
vb.customize ["modifyvm", :id, "--natdnsproxy1", "off"]
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off"]
2. 設定を変えていないのに失敗する!
上記の対応で、少しは早くインストールが完了するようになりましたが、なぜが失敗するケースが出てきました。
どうも、passenger のビルド中に、メモリが足りなくて失敗してしまっている模様…。
VirtualBoxのデフォルトだと、仮想OSに割り当てられるメモリは、たしか256MBくらいです。これではあんまり少なすぎなので、Vagrantfileを修正して、2GBまで上げて、Jenkinsのジョブを再実行。
vb.customize ["modifyvm", :id, "--memory", "2048"]
vb.customize ["modifyvm", :id, "--cpus", "2"]
その他のエラーも、Jenkinsのログを見ながら、ALMiniumのソースを修正したり、Vagrantfileを調整したりして数回試し、ちゃんとセットアップが安定して出来るようになりました!
成功するまでのJenkins側の記録
インストール完了時のキャプチャ
せっかくだから、Serverspec とブラウザ表示(Selenium) のテストもしてみよう!
そんなこんなでうまくALMiniumが入るようになりましたので、ついでにセットアップが成功したら、Serverspec とSelenium でのブラウザテスト(Redmineの画面が表示されているか)もJenkinsで試してみました。
- Serverspecの結果
- 雛形作成で提供される、80番を叩くだけのもの + redmine.conf があるかどうかのチェック。
- Seleniumでのテスト
- 80番で"ALMinium" というタイトルでページが表示されるか
- adminでログインできるか
まとめ
なんとなく思いついて設定してみましたが、ソフトウェアというよりはOSのセットアップ作業も、Jenkinsが大変役に立ってくれました。
特に、処理時間の記録/ログの保存という点が大きいです。
また、ALMinium のインストールを通して、やってみたいな〜と思っていたServerspecも試すことができたのも、良い機会でした。
ちなみに、今回試してひっかかった点は、ALMiniumのリポジトリにフィードバックさせていただきました:)
この次は、Ubuntuでも試してみたいなと思っています。
補足:Vagrant boxに関して
最初、CentOS6.4は、Chef+ruby入りのboxをVagrantbox.esから取って来て試してみました。また、smelt というインストールのコマンドの実行も、ssh で記載せずに、簡単なcookbookを作って仮想マシン内でALMiniumのソースをClone 〜 インストールコマンドの実行を試していました。
でも、ALMiniumがruby2.0を入れようとするところでうまく行かず、Chefもrubyも入っていない、minimalのboxを利用しています。
この辺りも、簡単に作成/実行/ログ記録が出来るようになったおかげで気がついたことです。