当早期阶段在 catchError 步骤中失败时,Jenkins Pipeline post 不接受阶段级别通过

Jenkins Pipeline post is not honoring stage level pass when earlier stage failed within the catchError step

我有一个 Jenkins 管道,我正在其中进行部署,运行 自动化测试,然后 post 将结果发送到测试管理系统。

如果部署阶段失败,我不想继续运行测试Post结果阶段。

如果运行 测试 失败,我仍然想继续并post 测试管理系统通过+失败的测试结果。

在每个阶段,我想触发相应阶段失败的电子邮件。

pipeline {
    agent { label 'my-agent' }
    stages {
        stage('Deploy') {
            steps {
                // carry out deployment
            }
            post {
                failure {
                    // send email that deployment failed
                }
            }
        }
        stage('Run Tests') {
            steps {
                catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
                    // carry out run
                }
            }
            post {
                failure {
                    // send email that run tests failed
                }
            }
        }
        stage('Post Results') {
            steps {
                catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
                    // post the results to the test management system
                }
            }
            post {
                failure {
                    // send email that posting results encountered error
                }
            }
        }
    }
}

问题:

Deploy运行 Tests 的电子邮件触发器工作正常。但是,当 运行 Tests 失败时;即使结果已成功 posted 到测试管理系统,控制正在进入 post 的失败部分,用于 Post 结果 阶段.

我尝试将 buildResult 设为成功,将 stageResult 设为失败。但是,即使是同一阶段的故障部分,控件也不会进入。

我需要做哪些更改才能避免为 Post 测试 失败发送电子邮件,即使它通过了更早的 运行 测试 失败了?

这不是理想的解决方案。但是我已经通过将 post 结果错误电子邮件触发器从 post 部分转移到一个单独的阶段来解决上述问题。

post 结果执行阶段最后有 touch import_success 语句。它仅在 posting 结果成功时执行。

post 结果错误电子邮件触发阶段有一个 when 子句来检查 import_success 文件是否存在以发送电子邮件(当 import_success 文件不存在时触发电子邮件) .

这是最后的管道,

pipeline {
    agent { label 'my-agent' }
    stages {
        stage('Deploy') {
            steps {
                // carry out deployment
            }
            post {
                failure {
                    // send email that deployment failed
                }
            }
        }
        stage('Run Tests') {
            steps {
                catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
                    // carry out run
                }
            }
            post {
                failure {
                    // send email that run tests failed
                }
            }
        }
        stage('Post Results') {
            steps {
                catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
                    // post the results to the test management system
                    sh 'touch import_success'  // this is executed only when post results is successful
                }
            }
        }
        stage ('Post Results Error Email Trigger') {
            when {
                not {
                    expression {
                        fileExists 'import_success'
                    }
                }
            }
            steps {
                // send email that posting results encountered error
            }
        }
    }
}