如何在不触发构建的情况下获取Jenkins已完成构建的状态?
解决方案:查询Jenkins已完成构建状态(不触发新构建)
你可以通过Jenkins核心API直接获取指定任务的已完成构建记录,无需触发新构建。核心思路是先获取任务实例,再提取其最后一次已完成的构建结果,替换掉原代码中触发构建的build job逻辑。
修改后的核心代码
Map buildResults = [:] Boolean failedJobs = false void notify_email(Map results) { echo "TEST SIMULATE notify: ${results.toString()}" // 这里可替换为实际邮件发送逻辑,比如用emailext插件 } Boolean checkLastCompletedBuildStatus(String jobName, Map results) { // 获取Jenkins任务实例 def job = Jenkins.instance.getItem(jobName) if (!job) { echo "任务 ${jobName} 不存在" results[jobName] = 'NOT_FOUND' return false } // 获取最后一次已完成的构建(跳过正在运行的) def lastCompletedBuild = job.getLastCompletedBuild() if (!lastCompletedBuild) { echo "任务 ${jobName} 无已完成构建记录" results[jobName] = 'NO_COMPLETED_BUILD' return false } def jobResult = lastCompletedBuild.getResult().toString() echo "任务 ${jobName} 最后一次已完成构建结果: ${jobResult}" results[jobName] = jobResult return jobResult == 'SUCCESS' }
修改后的Pipeline片段
pipeline { agent any stages { stage('Check Build Statuses') { steps { parallel( "testJob1": { script { if (!checkLastCompletedBuildStatus('testJob1', buildResults)) { failedJobs = true } } }, // 可添加更多需要检查的任务 "testJob2": { script { if (!checkLastCompletedBuildStatus('testJob2', buildResults)) { failedJobs = true } } } ) } } } post { always { script { // 筛选出失败/异常状态的任务 def failedJobList = buildResults.findAll { key, value -> value in ['FAILURE', 'ABORTED', 'NOT_FOUND', 'NO_COMPLETED_BUILD'] }.keySet() if (!failedJobList.isEmpty()) { notify_email(['failedJobs': failedJobList, 'allResults': buildResults]) } } } } }
关键说明
- 无构建触发:通过
Jenkins.instance.getItem(jobName)获取任务实例,再用getLastCompletedBuild()获取已完成的最新构建,全程不会触发新构建。 - 边界处理:增加了任务不存在、无已完成构建的判断,避免Pipeline报错中断。
- 结果筛选:在post阶段统一筛选失败/异常状态的任务,再调用邮件通知逻辑。
- 权限注意:运行Pipeline的账号需要有对应任务的读取权限,否则无法获取构建信息。
内容的提问来源于stack exchange,提问作者Flint
相关产品推荐
相关产品推荐

