ALMiniumをVirtualBox上のCentOSにインストールするのにJenkinsを使ってみたお話

[Jenkins アドベントカレンダー 2013](http://qiita.com/advent-calendar/2013/jenkinsci) の12/3の分として参加させていただきます。
とは言いながら、Redmine絡みのお話で申し訳ありません…。

お話の流れはこんな感じです。

- お話のきっかけ
- 最初は手で仮想マシン作成からALMiniumセットアップ…
- こんな構成でJenkinsを使ってインストール用ジョブを作成
- ジョブのステップの一部 (shell)
- セットアップログのキャプチャ
- ジョブをJenkinsでCIしてみる
- インストール完了時のキャプチャ
- せっかくだから、Serverspec とブラウザ表示(Selenium) のテストもしてみよう！

Qiitaの投稿としては長くて申し訳ないですが、何かの参考になれば幸いです。

-------------------------

### お話のきっかけ

Redmineの関係で[ALMinium](https://github.com/ALMinium/ALMinium)のお世話になったことがあり、[ALMinium](https://github.com/ALMinium/ALMinium)のissuesをウォッチしていたのですが、うまくセットアップできないとのチケットが登録されてきました。

実は最近、Vagrant + VirtualBoxでの仮想マシンのセットアップと、Chefに興味を持っていたところだったので、本当に失敗するのかCentOS6.4上でクリーンインストールしてみることにしたのが始まりです。

-------------------------

### 最初は手で仮想マシン作成からALMiniumセットアップ...

作業してみた環境は、下記の通りです。

- ホスト（作業用）OS: MacOS
- ゲスト（仮想環境／ALMiniumインストール用): VirtualBox上のCentOS 6.4

ゲストOS作成に当たっては、Vagrantを使い、イメージも[Vagrantbox.es](http://www.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の設定がありません。

ということで、やってみたのが下記のような構成です。


![ALMinium install with Jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/27976/bbfbb6b7-70cf-b81c-f8d1-3d35fe2eaa09.png "ALMinium install with Jenkins.png")

-------------

### ジョブのステップの一部 (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で回すとデフォルト値で勝手に処理が進みます。

![ALMinium-setup-with-vagrant.png](https://qiita-image-store.s3.amazonaws.com/0/27976/44423e7a-d6d7-1550-7949-e1e70c2514c6.png "ALMinium-setup-with-vagrant.png")

-------------------------

### ジョブを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側の記録

![ALMinium-setup-with-vagrant-2.png](https://qiita-image-store.s3.amazonaws.com/0/27976/5e704777-d732-7b43-6a4f-9dc60c3691e3.png "ALMinium-setup-with-vagrant-2.png")


-------------------------

### インストール完了時のキャプチャ

![ALMinium-setup-with-vagrant-3.png](https://qiita-image-store.s3.amazonaws.com/0/27976/71772cbf-4993-80df-f05b-a069d13907dd.png "ALMinium-setup-with-vagrant-3.png")

-------------------------

### せっかくだから、Serverspec とブラウザ表示(Selenium) のテストもしてみよう！

そんなこんなでうまくALMiniumが入るようになりましたので、ついでにセットアップが成功したら、Serverspec とSelenium でのブラウザテスト（Redmineの画面が表示されているか）もJenkinsで試してみました。

-  Serverspecの結果
 - 雛形作成で提供される、80番を叩くだけのもの + redmine.conf があるかどうかのチェック。

![ALMinium-setup-with-vagrant-4.png](https://qiita-image-store.s3.amazonaws.com/0/27976/a725af32-e286-dee9-d0ef-22272b39b351.png "ALMinium-setup-with-vagrant-4.png")

- Seleniumでのテスト
  - 80番で"ALMinium" というタイトルでページが表示されるか
 - adminでログインできるか

![ALMinium-setup-with-vagrant-5.png](https://qiita-image-store.s3.amazonaws.com/0/27976/5aa2890e-dcab-8fe3-5fc3-6573cfd897ac.png "ALMinium-setup-with-vagrant-5.png")


-------------------------

### まとめ

なんとなく思いついて設定してみましたが、ソフトウェアというよりはOSのセットアップ作業も、Jenkinsが大変役に立ってくれました。
特に、処理時間の記録／ログの保存という点が大きいです。

また、ALMinium のインストールを通して、やってみたいな〜と思っていたServerspecも試すことができたのも、良い機会でした。

ちなみに、今回試してひっかかった点は、ALMiniumのリポジトリにフィードバックさせていただきました:)
この次は、Ubuntuでも試してみたいなと思っています。

### 補足：Vagrant boxに関して

最初、CentOS6.4は、Chef+ruby入りのboxを[Vagrantbox.es](http://www.vagrantbox.es)から取って来て試してみました。また、smelt というインストールのコマンドの実行も、ssh で記載せずに、簡単なcookbookを作って仮想マシン内でALMiniumのソースをClone 〜 インストールコマンドの実行を試していました。

でも、ALMiniumがruby2.0を入れようとするところでうまく行かず、Chefもrubyも入っていない、minimalのboxを利用しています。
この辺りも、簡単に作成／実行／ログ記録が出来るようになったおかげで気がついたことです。