【问题标题】:How to mark build success when one of the stages is aborted?当某个阶段中止时,如何标记构建成功?
【发布时间】:2020-04-15 18:54:32
【问题描述】:

我有一个带有阶段的管道,其中一个阶段间歇性地花费比预期更长的时间,因此使用timeout 中止它。但是如果阶段被中止,构建也被标记为中止。以下是管道的代码:

pipeline {
    agent any

    stages {

        stage('First') {
            options {
                timeout(time: 10, unit: 'SECONDS')
            }
            steps {
                script {

                    catchError(buildResult: 'SUCCESS') {
                        echo "Executing stage I"
                        sleep 12
                    }

                }
            }
        }

        stage('Second') {
            steps {
                script {
                    echo "Executing stage II"
                }
            }
        }
    }
}

即使阶段标记为Aborted,我也想将构建标记为Success。你能帮助我如何实现这一目标吗?

【问题讨论】:

    标签: jenkins jenkins-pipeline jenkins-groovy


    【解决方案1】:

    我建议对迈克尔的答案进行一项改进(顺便说一句,这是正确的)。您可以使用catchError 标记阶段ABORTED(或UNSTABLE)并标记构建SUCCESS,但您需要使用try-catch 块包装可能超时的代码以控制错误。考虑以下示例:

    pipeline {
        agent any
    
        stages {
    
            stage('First') {
                options {
                    timeout(time: 3, unit: 'SECONDS')
                }
                steps {
                    script {
                        catchError(buildResult: 'SUCCESS', stageResult: 'ABORTED') {
                            try {
                                echo "Executing stage I"
                                sleep 4
                            } catch(org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) {
                                error "Stage interrupted with ${e.toString()}"
                            }
                        }
    
                    }
                }
            }
    
            stage('Second') {
                steps {
                    script {
                        echo "Executing stage II"
                    }
                }
            }
        }
    }
    

    当你运行这个流水线时,超时的阶段被标记为ABORTED,但流水线继续,如果剩余阶段没有失败,它被标记为SUCCESS

    这就是UNSTABLE 阶段状态的样子。

    Michael 的解决方案同样有效,但产生的结果略有不同 - 超时的阶段标记为 SUCCESS,这可能不太直观。你需要点击舞台来检查它是否超时。

    pipeline {
        agent any
    
        stages {
    
            stage('First') {
                options {
                    timeout(time: 3, unit: 'SECONDS')
                }
                steps {
                    script {
                        try {
                            echo "Executing stage I"
                            sleep 4
                        } catch(Exception e) {
                            currentBuild.result = "SUCCESS"
                        }
                    }
                }
            }
    
            stage('Second') {
                steps {
                    script {
                        echo "Executing stage II"
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 您的解决方案正是我想要的!我想标记中止不是成功,而是一些不同的东西,仍然将构建标记为成功。 Stage 目前的不稳定状态有助于识别那里的问题。非常感谢! Michael 的解决方案也有效,但它将中止阶段标记为“绿色”。
    • @TDHM,如果您希望将此阶段标记为灰色而不是UNSTABLE,也可以将阶段状态设置为ABORTED。它也会起作用。
    • 是的。我更新了答案以包含 ABORTED 阶段状态。
    【解决方案2】:

    您的catchError() 不适用于您的情况。文档 (Source) 说明以下内容:

    buildResult(可选)

    如果发现错误,则整体构建结果 将设置为此值。 注意构建结果只能得到 更糟糕的是,如果当前的 结果是 UNSTABLE 或更糟。 使用 SUCCESS 或 null 来保持构建 捕获错误时设置的结果。

    使用currentBuild.currentResult 设置构建状态,它可以有三个值:SUCCESSUNSTABLEFAILURE

    如果您想在中止时将构建标记为 SUCCESS,则可以使用后选项 (Source) aborted

    pipeline {
        agent any
        stages {
            stage('Example') {
                steps {
                    echo 'Hello World'
                }
            }
        }
        post { 
            aborted { 
                // Executed only if stage is aborted
                currentBuild.result = 'SUCCESS'
            }
        }
    }
    

    【讨论】:

    • 是的,这样即使阶段失败,我也可以将构建标记为SUCCESS。即使阶段中止,我也在寻找将构建标记为SUCCESS 的东西。
    • 答案现在应该更适合您的问题。
    • 我之前也尝试过,但没有成功。请参考-stackoverflow.com/questions/44494238/…
    • 感谢 Michael 的努力以及您在此处提供的所有详细信息!您之前编辑的答案也很有帮助,但 Szymon 的答案更清楚地说明了阶段失败,并且仍然将构建标记为成功。
    • 别担心!我很高兴你找到了你的解决方案:)
    猜你喜欢
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2022-11-02
    • 2017-07-11
    • 2022-10-04
    相关资源
    最近更新 更多