当前位置: 首页 > 知识库问答 >
问题:

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

仲孙子辰
2023-03-14

我有一个带有stage1stage2stage3等的声明性Jenkins管道。如果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/...阶段1中的步骤。应该是那样的。基于构建参数第2/3/4阶段...将在第1阶段之后调用

共有3个答案

勾学博
2023-03-14

您也可以简单地抛出一个异常。这将中止构建。事实上,在catch子句中简单地设置构建状态非常有效。然后,您还可以在finally块中添加自定义逻辑,用于发送生成状态更改通知(电子邮件、松弛消息等)

因此,可能类似于以下内容。注意:我已经从现有的Jenkins文件中复制了一些。因此,不能100%确定这与您使用的语法相同:

pipeline {
   try {
      stages {
         stage("stage1") {
             if (something) {
               throw new RuntimeException("Something went wrong")
             }
         }

         stage("stage2") {

         }

      } 
  } catch (e) {
     currentBuild.result = "FAILED"
     throw e
  } 
}
洪经义
2023-03-14

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

这将中止生成,作业将无法进一步运行。

段干开宇
2023-03-14

跳过其余管道阶段的最简单方法是设置一个变量,该变量将控制是否应跳过以下阶段。大概是这样的:

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阶段3skipreminingstages设置为true,因为when块中的表达式计算结果不为true。

或者,您可以调用错误(字符串消息)步骤停止管道并将其状态设置为失败。例如,如果阶段1调用error(msg)步骤如下:

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

在这种情况下,只要找到error(msg)步骤,管道就会停止,并且忽略所有剩余的阶段(时,甚至不检查块)。

当然,您可以根据某些条件调用error(msg),只有在满足特定条件时才能使其失败。

 类似资料:
  • 我的Jenkins管道中的一个阶段应根据其步骤中脚本的退出代码设置为不稳定:2应将阶段状态设置为不稳定性,而1应将阶段结果设置为失败。 如何做到这一点?我检查了“catchError”,但它似乎没有区分失败状态,只提供了一种捕获非0退出(1,2...)的方法。

  • 问题内容: 当前,当maven-job不稳定(黄色)时,我的管道失败(红色)。 在此示例中,作业单元测试的结果不稳定,但在管道中显示为失败。 如何更改Jobs / Pipeline /Jenkins,使(1)管道步骤不稳定而不是失败,以及(2)管道状态不稳定而不是失败。 我尝试添加参数,但没有解决问题。我不确定如何包装成可以捕获和处理结果的逻辑。 使用这种逻辑添加子管道并不能解决问题,因为没有选项

  • Jenkins版本=2.19 Jenkins多分支管道插件版本=2.92 我有一个Jenkinsfile,其中有一些基于分支的条件阶段。 为了简洁起见,这是我的Jenkinsfile的修改版本: 我正在使用多分支管道插件。 它成功地检测并构建了我所有的分支。 我的问题是,所有构建报告为失败,即使我悬停每个阶段,它报告'成功'。 我附上了一张图片,显示了一个功能分支,其中我想要运行的两个阶段已经运行

  • 问题内容: 绝对詹金斯管道/时髦菜鸟在这里,我有一个舞台 使用共享库,其源在这里: 问题是,当无法将构建推送到远程存储库时(请参见下文),阶段仍然最终显示成功。 如何使shell脚本的退出代码冒泡并使阶段失败? 问题答案: 该步骤返回的状态代码与实际的sh命令(在本例中为您的脚本)返回的状态代码相同。从sh文档中: 通常,以非零状态代码退出的脚本将导致该步骤失败并出现异常。 您必须确保脚本失败时返

  • 问题内容: 作为构建过程的一部分,我正在运行git commit作为execute shell步骤。但是,如果工作空间中没有任何更改,则Jenkins将使构建失败。这是因为当没有更改要提交时,git返回错误代码。我想中止构建,或者在这种情况下将其标记为不稳定。有任何想法吗? 问题答案: 要在 命令 失败时停止进一步执行: 要在 命令 失败时继续执行:

  • 我有一系列执行快速检查的阶段。我想完成所有这些,即使有失败。例如: 第二阶段失败,因此默认情况下第三阶段不执行。 通常这将是的工作,但我想在阶段视图中显示它们。在下面的模型中: 构建4显示了通常发生的情况。作业失败,因此不运行