vagrantにはvagrant-serverspecっていう便利なプラグインがあって、vagrant provision
した際にserverspecを流す事が出来る。
インストールは
vagrant plugin install vagrant-serverspec
でOK
こんなディレクトリ構成だとして
vagrant/
Vagrantfile
spec/
spec_helper.rb
hogehoge/
httpd_spec.rb
Vagrantfileの設定はこんな感じ。
specファイルの指定をVagrantfileからの相対パスで書く。
Vagrantfile
config.vm.provision :serverspec do |spec|
spec.pattern = '../spec/hogehoge/*_spec.rb'
end
serverspecの設定はこんな感じ
spec_helper.rb
require 'serverspec'
require 'pathname'
require 'net/ssh'
include SpecInfra::Helper::Ssh
include SpecInfra::Helper::DetectOS
httpd_spec.rb
require '../spec_helper'
describe port(80) do
it { should be_listening }
end
個人的にインフラCIする上でserverspecを使うときに一番面倒なのは地味にsshまわりの設定なのですが、vagrantだとそのへんを綺麗にまとめてくれるので助かる。
けど実際にjenkinsから
vagrant provision --provision-with serverspec
というコマンド実行してもjenkinsのビルドはsuccessで終わってしまう。
コンソール出力を見ればエラー出力はされているけど、パッと見で正常に終わったと見えちゃうと辛い。
実際に実行しても確かにexit code 0 だった。
[root@hoge]# vagrant provision --provision-with serverspec
==> default: Running provisioner: serverspec...
Port "80"
should be listening (FAILED - 1)
Failures:
1) Port "80" should be listening
Failure/Error: it { should be_listening }
expected Port "80" to be listening
# /spec/ahogehoge/httpd_spec.rb:10:in `block (2 levels) in <top (required)>'
Finished in 15.93 seconds
1 examples, 1 failure
Failed examples:
rspec /spec/hogehoge/httpd_spec.rb:10 # Port "80" should be listening
[root@hoge]# echo $?
0
仕方がないのでjenkinsでは以下のようなコマンドごりごりで対応している
sudo vagrant up
sudo vagrant provision --provision-with serverspec > /tmp/serverspec
cat /tmp/serverspec.tmp
SPEC=`cat /tmp/serverspec | grep "0 failures" | wc -l`
RET=0
if [ $SPEC -ne 1 ]; then RET=1 ; fi
rm -f /tmp/serverspec.tmp
#some command
sudo vagrant halt
if [ $RET -ne 0 ]; then exit $RET ; fi
exit 0
(参考になれば・・) Jenkinsビルドの「シェルで実行」の失敗/成功を操作する
他にいい方法ないかなぁ。