问题描述
在 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