web-dev-qa-db-ja.com

ステージがビルドの失敗/不安定ステータスを設定した場合、Jenkinsパイプラインを終了する方法は?

stage1stage2stage3などの宣言的な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の後に呼び出されます

12
user6348718

残りのパイプラインステージをスキップする最も簡単な方法は、後続のステージをスキップするかどうかを制御する変数を設定することです。このようなもの:

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 1Stage 2Stage 3whenをtrueに設定する非常に簡単な例です。

enter image description here

または、error(String message)ステップを呼び出してパイプラインを停止し、そのステータスをFAILEDに設定できます。たとえば、ステージ1がerror(msg)ステップを次のように呼び出す場合:

stage("Stage 1") {
    steps {
        script {
            error "This pipeline stops here!"
        }
    }
}

この場合、error(msg)ステップが見つかり、残りのすべてのステージが無視されるたびにパイプラインが停止します(whenブロックはチェックされません)。

enter image description here

もちろん、ある条件に応じてerror(msg)を呼び出して、特定の条件が満たされた場合にのみFAILEDにすることができます。

11
Szymon Stepniak

ステージで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..."                    
                     }
                }
            }
        }
    }
}

これによりビルドが中止され、ジョブはそれ以上実行されません。

4
awefsome

単に例外をスローすることもできます。それはビルドを中止します。実際、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
  } 
}
2
Steve Sowerby