尽管Jenkins管道中的前一阶段失败,如何在连续阶段中执行下一阶段

时间:2021-06-02 04:32:05

标签: jenkins jenkins-pipeline

目前我在 Jenkins 中定义了两个阶段,因为它们都需要不同的代理。

这是我的概念验证代码

stages {
    stage("Run Tests"){
        agent docker
        stage("Do setup"){}
        stage("Testing") {}
        post{
            always{
                echo "always"
            }
            failure {
                echo "failure"
            }
        }
    }
    stage("Generate Reports"){
        agent node-label
        stage("Generate"){

        }
    }
}

我需要在不同的代理上“生成报告”,因为某些二进制文件在节点上而不是在 docker 容器内。测试在节点上的 docker 共享卷内运行,因此我获得了在节点上生成报告所需的所有工件

(我尝试在后期运行“生成报告”,但它似乎以某种方式在 docker 容器内运行。)

现在,如果“运行测试”失败,则会由于前一阶段失败而跳过“生成报告”。知道如何强制“生成报告”阶段运行,即使前一阶段失败。

2 个答案:

答案 0 :(得分:1)

下面是管道。

pipeline {
agent none
stages {
    stage("Run Tests"){
    agent { label "agent1" }
        stages  {           
            stage("Do setup"){
                steps{
                    sh 'exit 0'
                    }
                }
            stage("Testing") {
                steps {
                    catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
                    sh "exit 1"
                        } //catchError
                    } //steps
                post{
                    always{
                        echo "always"
                        }
                    failure {
                        echo "failure"
                        }
                    } // post
                } // Testing
            } // stages
        } // Run Test

    stage("Generate Reports"){
        agent { label "agent2" }
            steps {
                sh 'exit 0'
            }
        } // Reports
    }    
}

管道成功,但阶段测试显示为失败,您可以根据需要选择buildResultstageResult的状态它不稳定或失败:

enter image description here

答案 1 :(得分:1)

如果您想始终运行“生成报告”阶段,那么您可以在出现故障时将早期阶段标记为 unstable
通过这种方式,Jenkins 将执行所有阶段,并且不会在特定阶段因错误而停止。
示例:

stages {
    stage("Run Tests"){
        agent docker
        stage("Do setup"){}
        stage("Testing") {
          steps {
                script {
            // To show an example, Execute "set 1" which will return failure 
            def result = bat label: 'Check bat......', returnStatus: true, script: "set 1"
                   if (result !=0) {
                   // If the result status is not 0 then mark this stage as unstable to continue ahead 
                   // and all later stages will be executed 
                   unstable ('Testing failed')
                   }
                }
            }
         }
    }
}
    stage("Generate Reports"){
        agent node-label
        stage("Generate"){

        }
    }
}

选项2,如果不想通过返回状态处理,可以使用try and catch block

stage("Testing") {
          steps {
                script {
                 try {
                        // To show an example, Execute "set 1" which will return failure 
                         bat "set 1"
                   }
                   catch (e){
                   unstable('Testing failed!')
                   }
                }
            }
         }

选项 3:无论阶段失败,您都可以将返回状态更改为完成构建成功。

stage("Testing") {
          steps {
                catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE'){
                script {
                         // To show an example, Execute "set 1" which will return failure 
                         bat "set 1"
                   }
                }
            }
         

注意选项 3 有一个缺点,如果有任何错误,它不会在同一阶段执行进一步的步骤。
示例:
在此示例中,将不会执行打印消息“测试阶段”,因为 bat set 1 命令中存在问题

stage("Testing") {
          steps {
                catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE'){
                script {
                         // To show an example, Execute "set 1" which will return failure 
                         bat "set 1"
                         // Note : Below step will not be executed since there was failure in prev step
                         println "Testing stage"
                   }
                }
            }

选项 4:您已经尝试将生成报告阶段保持在构建的 Post always
部分,以便始终执行,而不管任何失败。