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

继续Jenkins管道通过失败阶段

贺聪
2023-03-14

我有一系列执行快速检查的阶段。我想完成所有这些,即使有失败。例如:

stage('one') {
    node {
        sh 'exit 0'
    }
}
stage('two') {
    node {
        sh 'exit 1'   // failure
    }
}
stage('three') {
    node {
        sh 'exit 0'
    }
}

第二阶段失败,因此默认情况下第三阶段不执行。

通常这将是并行的工作,但我想在阶段视图中显示它们。在下面的模型中:

  • 构建4显示了通常发生的情况。作业two失败,因此two不运行

共有3个答案

欧旻
2023-03-14

这取决于您使用的是声明性管道语法还是脚本管道语法。

声明性管道语法:

pipeline {
    agent any
    stages {
        stage('one') {
            steps {
                sh 'exit 0'
            }
        }
        stage('two') {
            steps {
                sh 'exit 1'   // failure
            }
        }
    }
    post {
        always {
            sh 'exit 0'
        }
    }
}

Post条件块包含与步骤部分相同的步骤。

脚本化管道语法:

node {

    def build_ok = true

    stage('one') {
        sh 'exit 0'
    }

    try{
        stage('two') {
            sh 'exit 1'   // failure
        }
    } catch(e) {
        build_ok = false
        echo e.toString()  
    }

    stage('three') {
        sh 'exit 0'
    }

    if(build_ok) {
        currentBuild.result = "SUCCESS"
    } else {
        currentBuild.result = "FAILURE"
    }
}
喻嘉泽
2023-03-14

我也有同样的担忧。我能够解决它这样做。

第二阶段将显示为红色,并标记为失败,而其余阶段将继续运行。您可以设置一个标志,在阶段结束时检查标志并通知整个构建的状态。

node {

    def build_ok = true

    stage('one') {
        sh 'exit 0'
    }

    try{
        stage('two') {
            sh 'exit 1'   // failure
        }
    } catch(e) {
        build_ok = false
        echo e.toString()  
    }

    stage('three') {
        sh 'exit 0'
    }

    ....

    if(build_ok) {
        currentBuild.result = "SUCCESS"
    } else {
        currentBuild.result = "FAILURE"
    }
}
宇文弘懿
2023-03-14

这现在是可能的。下面是一个声明性管道的示例,但是catchError也适用于脚本化管道。

pipeline {
    agent any
    stages {
        stage('1') {
            steps {
                sh 'exit 0'
            }
        }
        stage('2') {
            steps {
                catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
                    sh "exit 1"
                }
            }
        }
        stage('3') {
            steps {
                sh 'exit 0'
            }
        }
    }
}

在上面的示例中,所有阶段都将执行,管道将成功,但阶段2将显示为失败:

正如您可能已经猜到的,您可以自由选择buildResultstageResult,以防它不稳定或其他任何情况。您甚至可以使构建失败并继续执行管道。

只要确保您的Jenkins是最新的,因为这是一个相当新的功能。

编辑:您需要“管道:基本步骤”2.16(2019年5月14日)

 类似资料:
  • 我想在Jenkins声明性管道语法中定义多个阶段,它们可以在任何一个失败后继续。我找不到任何现存的真正重复的问题,因为它们都假定或允许脚本语法。 为了澄清,我不寻求如何在脚本语法中实现这一点。我试图理解这种流控制是否在声明性语法中得到支持和形式化。为此,我将尝试准确定义我要寻找的内容: < li >没有尝试/捕捉。我不想陷入脚本模式,或者将我的声明性管道“包装”在另一个共享库或脚本块中。 < li

  • 问题内容: 如何报告声明式管道失败的阶段?在fail块中,我想获取failureStage.name并将其报告(最终报告为松弛)。 问题答案: PipelineVisitor是一种很好的方法。但是,如果您只想查看错误,那么利用可能会更好。 以下内容提供了每个失败步骤的映射列表,并且还遍历了下游作业。我发现它非常有用。 您将要使用共享库来避免安全沙箱警告/批准

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

  • 问题内容: 我必须与GIT存储库(bitbucket)进行交互。如果我通过bash尝试任何clone / push / pull命令,则效果很好。 无论如何,如果我尝试在jenkins中设置克隆uri,则会得到: 为什么? 问题答案: Jenkins正在使用GnuTLS来处理与Bitbucket通信的TLS部分(即“ HTTPS”中的“ S”)。在这种情况下,有些事情使GnuTLS无法正确建立TL

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

  • 我正在编写一个Groovy脚本,其中包含部署terraform的作业。我正在使用作业DSL并使种子作业由JCasC实现,一切正常。然后我有一个包含作业的Groovy文件的存储库。 如果我将Groovy文件保持为单个作业,它就可以正常工作。 然而,我希望能够构建具有构建阶段的管道。我知道我可以把管道写在詹金斯文件中 我有这个作为开始: 但是,我看到了这个错误: 我已经尝试了各种方法,并阅读了一堆文档