如何在其中一个阶段中止时标记构建成功

46次阅读
没有评论

问题描述

在使用Jenkins的流水线时遇到一个问题:在流水线的某个阶段中,由于某些原因,该阶段有时会超过预期的时间,因此使用timeout来中止它。但是,如果该阶段被中止,构建也会被标记为中止。以下是流水线的代码示例:

pipeline {
    agent any
    stages {
        stage('First') {
            options {
                timeout(time: 10, unit: 'SECONDS')
            }
            steps {
                script {
                    catchError(buildResult: 'SUCCESS') {
                        echo "执行阶段I"
                        sleep 12
                    }
                }
            }
        }
        stage('Second') {
            steps {
                script {
                    echo "执行阶段II"
                }
            }
        }
    }
}

即使阶段被标记为“中止”,用户希望将构建标记为“成功”。用户想知道如何实现这一点。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

用户想要的效果是,尽管某个阶段被中止,仍然能够将整个构建标记为“成功”。要实现这一点,我们可以使用trycatch语句来处理超时的情况。

以下是解决方案的步骤:

  1. 在Jenkins的Declarative流水线中,确保阶段内的timeout位于try块内部。
  2. catch块中,设置一个环境变量,以便后续的阶段可以根据它来判断是否继续执行。

以下是示例代码:

pipeline {
    agent any
    environment {
        PROCEED_TO_DEPLOY = '1' // 默认设置为1,表示继续执行后续阶段
    }
    stages {
        stage('First') {
            steps {
                script {
                    try {
                        timeout(time: 10, unit: 'SECONDS') {
                            echo "执行阶段I"
                            sleep 12
                        }
                    } catch (Exception err) {
                        currentBuild.result = 'SUCCESS' // 将构建标记为成功
                        env.PROCEED_TO_DEPLOY = '0' // 设置为0,表示后续阶段不会执行
                    }
                }
            }
        }
        stage('Second') {
            when {
                expression { env.PROCEED_TO_DEPLOY == '1' } // 只有当环境变量为1时才执行
            }
            steps {
                script {
                    echo "执行阶段II"
                }
            }
        }
    }
}

在上述示例中,我们使用了PROCEED_TO_DEPLOY这个环境变量来控制后续阶段是否执行。在第一个阶段内,如果发生超时,我们将PROCEED_TO_DEPLOY设置为0,表示后续阶段将不会执行。而如果没有超时,它将保持为1,后续阶段将继续执行。同时,我们还将当前构建的结果标记为“成功”。

通过这种方式,即使某个阶段被中止,整个构建仍然可以标记为“成功”。

请注意,上述代码中的环境变量设置和when表达式的逻辑可能需要根据实际情况进行调整。

注意: 由于Jenkins和插件的版本可能会不断更新,某些细节和语法可能会有所不同。请根据你所使用的Jenkins版本和插件版本进行适当的调整。

正文完