Jenkinsの「シェルの実行」でgrepやdiffを使った際途中でジョブが失敗してしまう問題の解決法
問題の現象
- Jenkinsのビルド手順の「シェルの実行」でgrepコマンドやdiffコマンドを使った際、実行結果が"不一致"だった場合のみジョブが中断され失敗扱いになってしまう問題が起きたので困っていた
- すんなり解決できたのでメモ
解決方法
- 「シェルの実行」先頭に以下を記載する
#!/bin/sh
- 詳細は下に記載
詳細
原因
- Jenkinsのシェル実行はデフォルトでは
/bin/sh -xe
で実行される(実行結果参照) - それぞれのオプションの意味は以下
- このeオプションが原因となって発生している
grep
の検索やdiff
の比較は、一致しなかった場合0以外の終了コードを返す仕様になっているため、スクリプトがexitしてジョブが失敗してしまう
解決方法
- 「シェルの実行」先頭に以下を記載する
#!/bin/sh -x
- これを記載することで、
-e
オプションを指定しないシェルでコマンドが実行されるため、途中で0以外の終了コードが返っても続けて実行することができるようになる- シバン (Unix) - Wikipedia
- Jenkinsのジョブは最後のコマンドの終了コードで成功/失敗を判定するようになる
リスク
- 当然他のコマンドが0以外の終了コードを返しても処理が続くため、本当に予期せず失敗したコマンドがあってもジョブが中断されず処理が進んでしまう。成功/失敗検知を正しく行わないととJenkinsは「成功」と判定してしまうため事故の元になる