stage1
、stage2
、stage3
などの宣言的なJenkinsパイプラインがあります。 stage2
がビルドを不安定/失敗に設定した場合、stage1
の実行を停止したい。
ビルドが成功しなかったが、以下のステージを実行せずにパイプラインを終了できる方法を見つけられなかったときに、stage1
のステップをreturn
を使用して実行を停止できることを知っていますstage1
ここに私が持っているものがあります:
stage('stage1') {
steps {
script{
//somesteps
if ("${stdout}" == "1"){
currentBuild.result = 'UNSTABLE'
return
} //if
//somesteps
} //script
} //steps
} //stage
// run only when stage1 is success
stage('stage2'){
when {
expression {
params.name ==~ /x|y/
}
}
steps {
script{
//stage2 steps
}
}
}
params.name ==~ /z/
stage 3が実行される場合、stage2をスキップします
注:stage2/3/..のステップをstage1に含めることはできません。そのようにする必要があります。ビルドパラメーターに基づいて、stage2/3/4 ...はstage1の後に呼び出されます
残りのパイプラインステージをスキップする最も簡単な方法は、後続のステージをスキップするかどうかを制御する変数を設定することです。このようなもの:
def skipRemainingStages = false
pipeline {
agent any
stages {
stage("Stage 1") {
steps {
script {
skipRemainingStages = true
println "skipRemainingStages = ${skipRemainingStages}"
}
}
}
stage("Stage 2") {
when {
expression {
!skipRemainingStages
}
}
steps {
script {
println "This text wont show up...."
}
}
}
stage("Stage 3") {
when {
expression {
!skipRemainingStages
}
}
steps {
script {
println "This text wont show up...."
}
}
}
}
}
これは、skipRemainingStages
ブロックの式がtrueと評価されないため、Stage 1
とStage 2
とStage 3
でwhen
をtrueに設定する非常に簡単な例です。
または、error(String message)
ステップを呼び出してパイプラインを停止し、そのステータスをFAILED
に設定できます。たとえば、ステージ1がerror(msg)
ステップを次のように呼び出す場合:
stage("Stage 1") {
steps {
script {
error "This pipeline stops here!"
}
}
}
この場合、error(msg)
ステップが見つかり、残りのすべてのステージが無視されるたびにパイプラインが停止します(when
ブロックはチェックされません)。
もちろん、ある条件に応じてerror(msg)
を呼び出して、特定の条件が満たされた場合にのみFAILED
にすることができます。
ステージでpostを使用して、次のように終了できます。
pipeline {
stages {
stage('stage 1') {
steps {
//step 1
}
}
stage('stage 2') {
steps {
script{
//step 2
}
}
post{
success {
}
failure {
script{
sh "exit 1"
//or
error "Failed, exiting now..."
}
}
aborted {
}
unstable {
script{
sh "exit 1"
//or
error "Unstable, exiting now..."
}
}
}
}
}
}
これによりビルドが中止され、ジョブはそれ以上実行されません。
単に例外をスローすることもできます。それはビルドを中止します。実際、catch句でビルドステータスを設定するだけで十分に機能します。また、ビルドステータスの変更(電子メール、Slackメッセージなど)の通知を送信するための最終ブロックにカスタムロジックを追加することもできます。
おそらく次のようなものです。注:私はこれのいくつかを既存のJenkinsfileからコピーしました。だから、これがあなたが使っていたのと同じ構文であることを100%確信していない:
pipeline {
try {
stages {
stage("stage1") {
if (something) {
throw new RuntimeException("Something went wrong")
}
}
stage("stage2") {
}
}
} catch (e) {
currentBuild.result = "FAILED"
throw e
}
}