のために書くことができますあなたは、並列ステップでウォッチドッグブランチを実装することができます。それは、危険な可能性のあるウォッチドッグ状態を追跡するためにグローバルを使用しています。「並列」のグローバルにアクセスするのがスレッドセーフであるかどうかはわかりません。 'bat'が終了を無視して例外を発生させない場合でも機能します。
コード:
runWithAbortCheck { abortState ->
// run all tests, print which failed
node ('windows') {
for (int i = 0; i < 5; i++) {
try {
bat "ping 127.0.0.1 -n ${10-i}"
} catch (e) {
echo "${i} FAIL"
currentBuild.result = "UNSTABLE"
// continue with remaining tests
}
abortCheck(abortState) // sometimes bat doesn't even raise an exception! so check here
}
}
}
def runWithAbortCheck(closure) {
def abortState = [complete:false, aborted:false]
parallel (
"_watchdog": {
try {
waitUntil { abortState.complete || abortState.aborted }
} catch (e) {
abortState.aborted = true
echo "caught: ${e}"
throw e
} finally {
abortState.complete = true
}
},
"work": {
try {
closure.call(abortState)
}
finally {
abortState.complete = true
}
},
"failFast": true
)
}
def _abortCheckInstant(abortState) {
if (abortState.aborted) {
echo "Job Aborted Detected"
throw new org.jenkinsci.plugins.workflow.steps.FlowInterruptedException(Result.ABORTED)
}
}
def abortCheck(abortState) {
_abortCheckInstant(abortState)
sleep time:500, unit:"MILLISECONDS"
_abortCheckInstant(abortState)
}
おかげでジェシー。私の「somethingSlowは」シェルスクリプトかもしれないとして、残念ながら私のcatchブロックは、もう少し複雑である必要があり、作業が終了したときには、InterruptedExceptionあるのではなく、AbortExceptionを発生させます。中止されたシェルスクリプトが正しい終了コードを返すと仮定すると、それが中止されたかどうかはわかりますが、100%ではないことがわかります。 –
あなたはまた、次のものを使用することもできます: 'sh 'some-script;エコー$? >結果 '; def exit = Integer.parseInt(readFile( 'result')。trim()); if(exit!= 0){...} ' –
あなたの返信をありがとう!残念ながら、終了コードをファイルに書き込むことは、ジョブの終了を検出する良い方法ではありません。ウィンドウ上のバッチファイルは、ジェンキー終了後にいくつかの余分な行を実行することがあります。 「結果」ファイルはほとんど常に書き込まれるので、終了コードが実際のエラーか終了かを把握しなければなりません。 –