2

Jenkinfile パイプライン スクリプト内で、実行中のジョブの状態をクエリして、ジョブが中止されたかどうかを確認するにはどうすればよいですか?

通常、FlowInterruptedException または AbortException (スクリプトが実行されている場合) が発生しますが、これらはキャッチして無視することができます。また、複数のステートメントがある場合、スクリプトはすぐには終了しません。

「currentBuild.Result」を調べてみましたが、ビルドが完了するまで設定されていないようです。おそらく「currentBuild.rawBuild」の何か?

4

2 に答える 2

0

並行ステップでウォッチドッグ ブランチを実装できます。グローバルを使用して、危険な可能性のあるウォッチドッグ状態を追跡します。「並列」でグローバルにアクセスすることがスレッドセーフであるかどうかはわかりません。「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)
}
于 2016-04-28T10:36:06.417 に答える