关于Jenkins中getLastSuccessfulBuild将Unstable视为成功及2.277版本获取最后一次绿色构建的技术问询
Jenkins API 问题解答:getLastSuccessfulBuild行为与绿色构建获取
针对你在Jenkins 2.277版本遇到的两个问题,我整理了具体的原因和解决方案:
1. 为什么getLastSuccessfulBuild会把Unstable状态的构建视为成功?
这源于Jenkins对构建状态的核心定义逻辑:
- 在Jenkins的状态体系里,
UNSTABLE(即你提到的状态码6)属于构建完成但存在非致命问题(比如测试用例失败、代码检查警告)的范畴,和彻底失败的FAILURE(状态码4)是完全不同的层级。 - 早期Jenkins的API设计中,
getLastSuccessfulBuild()方法的“成功”定义包含了UNSTABLE状态——毕竟这类构建完成了全部执行流程,没有直接中断失败。但在2.277版本中,这个判断逻辑出现了调整,导致它和getLastUnstableBuild()返回了同一个构建实例,这确实是版本更新带来的行为变化。
2. Jenkins 2.277中如何获取真正的最后一次绿色(SUCCESS)构建?
既然默认API方法不再可靠,你可以通过遍历构建历史的方式,手动筛选出状态为SUCCESS(对应状态码5)的最近构建。这里提供两种场景的实现:
场景1:Jenkins脚本控制台使用(Groovy)
// 按作业全名获取目标作业 def targetJob = Jenkins.instance.getItemByFullName("Experiments/exp.Stability") def lastGreenBuild = null // 遍历构建历史,找到第一个状态为SUCCESS的构建 for (build in targetJob.builds) { if (build.result == hudson.model.Result.SUCCESS) { lastGreenBuild = build break } } // 输出结果 if (lastGreenBuild) { println "找到最后一次绿色构建:${lastGreenBuild.fullDisplayName}" } else { println "当前作业无绿色构建记录" }
场景2:Pipeline流水线中使用
pipeline { agent any stages { stage('获取绿色构建') { steps { script { def targetJob = Jenkins.instance.getItemByFullName('Experiments/exp.Stability') def lastGreenBuild = targetJob.builds.find { it.result == Result.SUCCESS } if (lastGreenBuild) { echo "最后一次绿色构建:${lastGreenBuild.fullDisplayName}" // 这里可以添加你的构建晋升逻辑 } else { echo "未找到有效绿色构建" } } } } } }
注意事项:
- 直接使用
hudson.model.Result枚举(如Result.SUCCESS)比判断状态码更可靠,避免不同版本状态码可能的变动; - 如果你的Jenkins开启了安全限制,可能需要给脚本添加对应的权限才能访问作业构建历史。
内容的提问来源于stack exchange,提问作者Peter Kahn
相关产品推荐
相关产品推荐

