如何在Jenkinsfile中获取重放构建的当前状态
我完全懂你现在的困扰——重放Jenkins构建时,想获取当前构建的状态,但试了currentBuild.result和currentResult都返回null,对吧?先给你梳理下问题出在哪,再给你对应的解决方案。
首先,你用来判断是否为重放构建的代码是没问题的:
def replayClassName = 'org.jenkinsci.plugins.workflow.cps.replay.ReplayCause' def cause = currentBuild.getBuildCauses(replayClassName) def isReplay = !(cause.isEmpty())
至于为什么currentBuild.result会返回null,核心原因是:这个属性只有在构建完全结束后才会被Jenkins赋值。如果你是在构建的steps阶段(也就是构建还在运行中)去调用它,自然拿不到值。
而currentBuild.currentResult是用来获取构建的实时执行状态的(哪怕构建还在进行中),如果这个也返回null,大概率是因为你在声明式Jenkinsfile中没有把代码放在script块里,或者Jenkins版本过低(建议升级到2.200以上版本)。
下面给你两种场景的具体实现:
场景1:构建过程中获取实时状态
如果需要在构建执行的步骤中获取当前重放构建的实时状态,可以用currentBuild.currentResult,注意如果是声明式Jenkinsfile,要把代码放在script块内:
pipeline { agent any stages { stage('Check Replay Status') { steps { script { def replayClassName = 'org.jenkinsci.plugins.workflow.cps.replay.ReplayCause' def cause = currentBuild.getBuildCauses(replayClassName) def isReplay = !(cause.isEmpty()) if(isReplay) { def currentStatus = currentBuild.currentResult if(currentStatus == 'SUCCESS'){ echo "当前重放构建处于成功状态,执行对应操作" // 在这里添加你的业务逻辑 } else { echo "当前重放构建状态为${currentStatus},执行其他操作" // 在这里添加你的业务逻辑 } } } } } } }
场景2:构建完成后获取最终状态
如果需要获取重放构建的最终结果,建议在post阶段操作,这时候currentBuild.result已经有值了:
pipeline { agent any stages { // 你的构建步骤 stage('Build') { steps { echo "执行构建操作" } } } post { always { script { def replayClassName = 'org.jenkinsci.plugins.workflow.cps.replay.ReplayCause' def cause = currentBuild.getBuildCauses(replayClassName) def isReplay = !(cause.isEmpty()) if(isReplay) { def finalStatus = currentBuild.result if(finalStatus == 'SUCCESS'){ echo "重放构建最终成功,执行后续操作" // 在这里添加你的业务逻辑 } else { echo "重放构建最终状态为${finalStatus},执行对应处理" // 在这里添加你的业务逻辑 } } } } } }
另外补充一点:如果你的Jenkins版本比较旧,currentBuild.currentResult可能不支持,这时候可以尝试通过currentBuild.getRawBuild().getExecution().getStatus().toString()来获取实时状态,但这个方法依赖Jenkins内部API,可能在后续版本中变动,建议优先升级Jenkins版本。
备注:内容来源于stack exchange,提问作者LugiHaue

