如果步骤不稳定,Jenkins 管道将失败

Jenkins Pipeline Fails if Step is Unstable

当前,当 maven-job 不稳定(黄色)时,我的管道失败(红色)。

node {
    stage 'Unit/SQL-Tests'
    parallel (
       phase1: { build 'Unit-Tests' }, // maven
       phase2: { build 'SQL-Tests' } // shell
    )
    stage 'Integration-Tests'
    build 'Integration-Tests' // maven
}

在此示例中,作业单元测试的结果不稳定,但在管道中显示为失败。

如何更改 jobs/pipeline/jenkins 以使 (1) 管道步骤不稳定而不是失败,以及 (2) 管道状态不稳定而不是失败。

我尝试添加 MAVEN_OPTS 参数 -Dmaven.test.failure.ignore=true,但这并没有解决问题。我不确定如何将 build 'Unit-Test' 包装成一些可以捕获和处理结果的逻辑。

添加带有 this logic 的子管道并不能解决问题,因为没有从 subversion 检出的选项(该选项在常规 Maven 作业中可用)。如果可能,我不想使用命令行结帐。

无论步骤是 UNSTABLE 还是 FAILED,脚本中的最终构建结果都将是 FAILED。

您可以将propagate默认设置为false,避免流程失败。

def result = build job: 'test', propagate: false

在流程结束时,您可以根据从 "result" 变量中获得的内容来判断最终结果。

例如

currentBuild.result='UNSTABLE'

这是一个详细的例子 How to set current build result in Pipeline

Br,

蒂姆

经验教训:

  • Jenkins 将根据 currentBuild.result 值不断更新管道,该值可以是 SUCCESSUNSTABLEFAILURE (source)。
  • build job: <JOBNAME>的结果可以存储在一个变量中。构建状态在 variable.result.
  • build job: <JOBNAME>, propagate: false 将防止整个构建立即失败。
  • currentBuild.resultcan only get worse。如果该值以前是 FAILED 并通过 currentBuild.result = 'SUCCESS' 收到新状态 SUCCESS 它将保持 FAILED

这是我最终使用的:

    node {
        def result  // define the variable once in the beginning
        stage 'Unit/SQL-Tests'
        parallel (
           phase1: { result = build job: 'Unit', propagate: false }, // might be UNSTABLE
           phase2: { build 'SQL-Tests' }
        )
        currentBuild.result = result.result  // update the build status. jenkins will update the pipeline's current status accordingly
        stage 'Install SQL'
        build 'InstallSQL'
        stage 'Deploy/Integration-Tests'
        parallel (
           phase1: { build 'Deploy' },
           phase2: { result = build job: 'Integration-Tests', propagate: false }
        )
        currentBuild.result = result.result // should the Unit-Test be FAILED and Integration-Test SUCCESS, then the currentBuild.result will stay FAILED (it can only get worse)
        stage 'Code Analysis'
        build 'Analysis'
    }