Posted at

Jenkinsビルドの「シェルで実行」の失敗/成功を操作する

More than 5 years have passed since last update.

初めて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のステータスも失敗になります。よろしいかんじです。

そんなに複雑なスクリプトではない場合はこれで対応できますね。