如果Jenkins流水线的某个阶段设置了构建失败/不稳定状态,如何退出?

41

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

我知道我可以使用return在构建不成功时停止stage1中的步骤运行,但找不到一种方法可以仅退出整个流水线而不运行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/,阶段3将被执行并跳过阶段2。
注意:我不能在第一阶段中包含第二/三/...阶段的步骤。它应该是这样的。根据构建参数,阶段2/3/4...将在第一阶段之后被调用。

将当前内容翻译成中文: 在Jenkins管道中如何中止当前构建? - John
5个回答

44

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

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...."
                }
            }
        }
    }
}

这是一个非常简单的例子,它在第1个阶段和第2个阶段以及第3个阶段将skipRemainingStages设置为true,并且因为when块中的表达式不为true,所以第3个阶段被跳过。

enter image description here

或者,您可以调用error(String message)步骤来停止管道并将其状态设置为FAILED。例如,如果您的第一阶段调用 error(msg) 步骤:

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

在这种情况下,当发现error(msg)步骤时,流水线将停止,并忽略所有剩余的阶段(when块甚至不会被检查)。

enter image description here

当然,你可以根据某些条件调用error(msg),只有满足特定条件时才会使其变为FAILED

如何测试以确定是否存在错误?是否有“try catch”系统?因为我不想测试脚本的每一行。 - Sandburg
谢谢!很难找到易懂又完整的例子。 - Denny Weinberg

12

您可以使用以下代码在阶段中退出:

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..."                    
                     }
                }
            }
        }
    }
}

这将中止构建,工作将不再继续运行。


5
你也可以简单地抛出一个异常。这将中止构建。 事实上,在catch子句中设置构建状态非常有效。 然后,你还可以在finally块中添加自定义逻辑,以便发送有关构建状态更改的通知(电子邮件、Slack消息等)。
因此,可能像以下示例所示。注意:我从现有的Jenkinsfile中复制了一些内容。因此不能百分之百确定这与你使用的语法相同:
pipeline {
   try {
      stages {
         stage("stage1") {
             if (something) {
               throw new RuntimeException("Something went wrong")
             }
         }

         stage("stage2") {

         }

      } 
  } catch (e) {
     currentBuild.result = "FAILED"
     throw e
  } 
}

2
你可以尝试:

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')
{.
.
.
}

0

您可以在Jenkins管道中将构建标记为失败,然后使用sh "exit 1"来中断其执行,如下所示:

pipeline {
    stages {
        stage('stage 1') {
            steps {

            }
        }
        stage('stage 2') {
            steps {
                script{ 
                      if (something) {
                            currentBuild.result = "FAILURE"
                            sh "exit 1"
                      }
                }
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接