「Jenkins Pipeline」- 修改构建状态、放弃当前构建

  CREATED BY JENKINSBOT

问题描述

在 Jenkins Pipeline 中,(1)我们希望放弃某次构建,(2)但是又不希望显示失败,而是返回 ABORTED 状态。

该笔记将记录:在 Jenkins 中,如何控制构建状态,以及相关问题的处理方法。

解决办法

if (!continueBuild) {
    currentBuild.result = 'ABORTED'
    error('Stopping early…')
}

附加说明

我们无法决定最终的构建结构,我们仅能设置某个阶段的构建结果(step),最终的状态由 Jenkins 根据每个阶段的结果来决定。

构建结果的修改只会更坏。比如 SUCCESS => UNSTABLE => FAILURE,而无法从 FAILURE => SUCCES 结果。这是故意设计的,参考 jenkins/Run.java/setResult 函数。

所有状态值,参考 jenkins/Result.java at master · jenkinsci/jenkins 文件。

修改 currentBuild.result 属性,仅会改变构建结果,但是不会结束构建,所以我们使用 error() 来结束构建。

result 与 currentResult 仅有的差别是 result 会返回为 NULL 值。参考 workflow-support-plugin/RunWrapper.java at master 文件。

常见问题汇总

…RejectedAccessException: No such field found: field …RunWrapper currentResult

问题描述:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: No such field found: field org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper currentResult
	at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.unclassifiedField(SandboxInterceptor.java:425)
	at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onSetProperty(SandboxInterceptor.java:263)
	at org.kohsuke.groovy.sandbox.impl.Checker$8.call(Checker.java:409)
...

原因分析:
通过修改 currentBuild.currentResult 属性来改变构建结果是不可行的,因为该参数是不可写的(参考 Global Variable Reference/currentBuild 说明)。

解决方案:
需要通过 currentBuild.result 属性来修改构建结构。

参考文献

Abort a hung build in Jenkins
Abort current build from pipeline in Jenkins
Aborting a build
How to manipulate the build result of a Jenkins pipeline job (back to ‘SUCCESS’)? – Stack Overflow
I have a stuck Pipeline and I can not stop it
java – Extensive list of Jenkins job statuses? – Stack Overflow
Jenkins pipeline bubble up the shell exit code to fail the stage – Javaer101
jenkins/Run.java at 213363d387736874f1d14d83e57347f757f3ed4f · jenkinsci/jenkins