回答:
コマンドが失敗したときにそれ以上の実行を停止するには:
command || exit 0
コマンドが失敗したときに実行を継続するには:
command || true
|| exit 0
最初のケースではは必要ありません。falseをcommand
返すと実行が停止します。つまり、2番目のオプションは非常に役立ちます。
exit 0
、ゼロ以外の終了コードは、ビルドに失敗しますので。
Jenkinsは/bin/sh -xe
デフォルトでを使用してシェルビルドステップを実行しています。-x
実行されたすべてのコマンドを出力することを意味します。-e
スクリプト内のいずれかのコマンドが失敗した場合、失敗して終了することを意味します。
したがって、あなたのケースで何が起こったのかは、gitコマンドが1で終了することであると思います。デフォルトの-e
パラメータのため、シェルは0以外の終了コードを取得し、残りのスクリプトを無視して、ステップを失敗としてマークします。ここにビルドステップスクリプトを投稿できれば、これを確認できます。
その場合は、#!/bin/sh
オプションなしでスクリプトが実行されるように配置してみてください。または、set +e
この動作をオーバーライドするために、ビルドステップの上で何か類似したことを行います。
編集:もう1つ注意すべき点は、シェルスクリプトの最後のコマンドが0以外のコードを返す場合、このセットアップを使用しても、ビルドステップ全体が失敗とマークされることです。この場合、echo
コマンドを最後に置くだけでそれを回避できます。
プッシュするものが何もない場合、gitは終了ステータスを返します。1。実行シェルビルドステップはそれぞれ失敗としてマークされます。ORステートメントを使用できます|| (二重管)。
git commit -m 'some messasge' || echo 'Commit failed. There is probably nothing to commit.'
つまり、最初に失敗した場合(終了ステータス> 0が返された場合)、2番目の引数を実行します。2番目のコマンドは常に0を返します。プッシュするものが何もない場合(終了ステータス1-> 2番目のコマンドを実行)、エコーは0を返し、ビルドステップが続行されます。
ビルドを不安定としてマークするには、ビルド後のステップであるJenkins Text Finderを使用できます。コンソール出力を通過し、パターン(あなたのエコー)を照合し、ビルドを不安定としてマークすることができます。
Jenkinsは、ステップの戻り値によってステップの成功/失敗を決定します。シェルの場合、それは最後の値の戻りでなければなりません。Windows CMDと(POSIX)Bashシェルの両方でexit 0
、最後のコマンドとしてを使用して戻り値を手動で設定できるはずです。
exit 0
Windows Jenkinsインストールの複数のビルドで "execute windows batch command"と一緒に使用すると、期待どおりに動作します。何か他のことが起こっているに違いない。コンソールログの関連部分を投稿できますか?
#!/bin/sh -xv
は、エラーが発生した場合にスクリプトを停止するシェルを実行します。
私はここにある答えを使用してこれを機能させることができました:
git diff --quiet --exit-code --cached || git commit -m 'bla'
git diff
コマンドを実行し、失敗した場合はgit commit
コマンドを実行します。基本的に、コミットするgit diff
ものが見つかった場合にのみコミットを実行します。ただし、@ jwernernyの回答は正しかったexit 0
ので、最後のステートメントとして追加できます。。ジェンキンスは成功として扱うようにする任意のスクリプトに私はあなたがLinuxのシェルのステップをやっていたならば、これは失敗する1つのシナリオを考えることができますが、バッチ内のこれは常に動作するはずです。
/bin/sh -xe
述べたように、デフォルトでシェルビルドステップを実行しています。したがって、ビルドステップの上にを配置または実行して、この動作をオーバーライドすることができます。これにより、exit内の1つのコマンド(0以外のコード)でも残りのステップが続行されます#!/bin/bash
set +e
https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script
returnStatus:trueプロパティを含めると、シェルリターンは無視されます。
テキスト検索プラグインを使用できます。これにより、選択した式の出力コンソールを確認し、ビルドをとしてマークできますUnstable
。
いくつかのヒントを含む別の答えは、誰かにとって役立つ可能性があります:
次のルールでコマンドを分離することを忘れないでください:
コマンド1 && command2-command1が成功した場合にのみ、command2が実行されることを意味します
command1 ;command2-コマンド1の結果に関係なくコマンド2が実行されることを意味します
例えば:
String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test ;set -e;echo 0 ", returnStdout: true).trim()
println run_tests
失敗した場合(コマンドが失敗した場合)set -e
およびecho 0
コマンドを使用して正常に実行されgmake test
ますが、次のコードは省略されます。
String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test && set -e && echo 0 ", returnStdout: true).trim()
println run_tests
少し間違っており、コマンドset -e
とecho 0
イン&& gmake test && set -e && echo 0
はprintln run_tests
ステートメントでスキップされますgmake test
。失敗するとjenkinsビルドが中止されるためです。回避策としてreturnStatus:true
、に切り替えることができますが、コマンドからの出力を見逃してしまいます。