初めてjenkinsを使ってみました。
シェルで実行で
vagrant up
knife solo prepare hostname
knife solo cook hostname
vagrant halt
vagrant destroy
みたいな事をやってました。
この時、knife solo cook の部分で失敗すると以降のコマンドが実行されないみたいで、vagrantのインスタンスが立ち上がりっぱなしで面倒だなぁと思ってました。
なんとかしたかったので調べてみました。
##エラーを無視する1
Jenkinsの「シェルの実行」はビルドを行うとシェルスクリプトファイルに落とした後、
/bin/sh -xe
で実行されるみたいです。
- オプション-x:シェルスクリプトで実行した結果を逐一表示
- オプション-e:実行中、エラー(exit codeが0以外)が発生した時点でエラーを出力して終了
つまり、ビルドが終了してたのは -e オプションのせいなのでこのオプションなしに実行できれば処理が止まる事はなさそうです。
シェルで実行のシェルのオプションを変えるには、コマンドの一番上に
#!/bin/sh -x
と書いてやれば、エラーでストップせず最後まで実行されました。
ただし、この場合のJenkinsのビルドの失敗/成功は「最後に実行されたコマンドの結果」になるようで実際にはエラーなのにJenkis側ではビルド成功となってしまいました。よろしくないです
(参考)
http://qiita.com/mechamogera/items/f689b95670127d5bf046
##エラーを無視する2
knife solo cook hostname || true
こんな感じにするとこのコマンドの結果は必ず成功になりました。
もちろん実際には失敗なのにJenkis側ではビルド成功になるのでよろしくないです。
##実行の結果を最後に持ってくる
会社の人に相談したらこんな感じで教えてもらえました
vagrant up
knife solo prepare hostname
knife solo cook hostname || RET=$?
vagrant halt
vagrant destroy
exit $RET
変数にexit codeを代入して、スクリプトの最後でそのexit codeで終了させていますので失敗してもビルドが継続され、Jenkisのステータスも失敗になります。よろしいかんじです。
そんなに複雑なスクリプトではない場合はこれで対応できますね。