如果阶段设置了构建失败/不稳定状态,如何从Jenkins管道退出?

时间:2018-08-01 16:05:08

标签: jenkins groovy jenkins-pipeline jenkins-groovy

我有一个声明性的Jenkins管道,其中包含stage1stage2stage3等。如果stage2设置构建不稳定/失败,我想停止运行stage1

我知道我可以在构建不成功但无法找到stage1中的步骤的情况下使用return来运行stage1,但是我无法找到一种无需退出{ {1}}

这是我所拥有的:

    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/阶段3,则跳过阶段2

注意:我不能在stage1 / 3 / ..中包括步骤1。应该是那样的。根据构建参数,stage2 / 3/4 ...将在stage1之后调用

4 个答案:

答案 0 :(得分:5)

跳过剩余管道阶段的最简单方法是设置一个变量,该变量将控制是否应跳过后面的阶段。像这样:

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处将Stage 1设置为true,并且Stage 2Stage 3被跳过,因为when块中的表达式不求值真实。

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

答案 1 :(得分:1)

您也可以简单地引发Exception。这将中止构建。 实际上,只需在catch子句中设置构建状态就可以很好地工作。 然后,您还可以在finally块中添加自定义逻辑,以发送有关构建状态更改(电子邮件,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 :(得分:1)

您可以在阶段中使用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..."                    
                     }
                }
            }
        }
    }
}

这将中止构建,并且作业将无法继续运行。

答案 3 :(得分:0)

您可以尝试:

stage('Set skipRemainingStages variable which decides, whether to run next stages or not') {
    steps {
        script {
            skipRemainingStages = true
            try {
                println("In if block")
                skipRemainingStages = true
            }
            catch (Exception exc) {
                println("Exception block: ${exc}")
                skipRemainingStages = false
            }

            if (skipRemainingStages) {
                currentBuild.result = 'FAILURE'
                error("Stopping early!")
            }
        }
    }
}
stage('This will not execute if skipRemainingStages=true')
{.
.
.
}