如何在Jenkins脚本化流水线中按顺序执行预部署Job并检查状态
Jenkins脚本化流水线实现预部署Job顺序执行(轮询等待完成)
需求说明
在Jenkins文件中定义了3个预部署Job,需要按严格顺序执行:test_prejob执行完成后再启动test1_prejob,test1_prejob完成后再启动test2_prejob。当前通过while循环并行触发可运行,但希望了解如何在脚本化流水线中主动检查Job状态并等待其完成,实现串行执行逻辑。
现有配置
"preDeployJobs" : { "devl" : [ ["Deploy/test_prejob:[parameters: [string(name: 'BUILD_ID_PARAM', value:'%UCD_BUILD_DISPLAY_NAME%')]]"], ["Deploy/test1_prejob:[parameters: [string(name: 'BUILD_ID_PARAM', value:'%UCD_BUILD_DISPLAY_NAME%')]]"], ["Deploy/test2_prejob:[parameters: [string(name: 'BUILD_ID_PARAM', value:'%UCD_BUILD_DISPLAY_NAME%')]]"] ] }
解决方案
方法1:使用build步骤自动等待(推荐)
Jenkins原生的build步骤默认会阻塞当前流水线,直到触发的Job执行完成,无需手动实现轮询逻辑。你可以遍历预部署Job列表,逐个触发并等待:
// 获取实际的BUILD_ID参数值 def buildId = env.UCD_BUILD_DISPLAY_NAME // 定义需要串行执行的预部署Job列表 def preJobList = [ "Deploy/test_prejob", "Deploy/test1_prejob", "Deploy/test2_prejob" ] // 逐个执行Job,等待上一个完成后再启动下一个 preJobList.each { jobFullName -> echo "启动预部署Job: ${jobFullName}" build( job: jobFullName, parameters: [string(name: 'BUILD_ID_PARAM', value: buildId)] // wait参数默认值为true,可省略,会自动等待Job完成 ) echo "预部署Job ${jobFullName} 执行完成" }
方法2:手动轮询Job状态(自定义场景)
如果需要更精细的控制(比如自定义轮询间隔、处理特定中间状态),可以通过Jenkins API获取构建实例,循环检查状态直到Job完成:
def buildId = env.UCD_BUILD_DISPLAY_NAME def preJobList = [ "Deploy/test_prejob", "Deploy/test1_prejob", "Deploy/test2_prejob" ] preJobList.each { jobFullName -> echo "触发预部署Job: ${jobFullName}" // 获取Job实例并触发构建 def targetJob = Jenkins.instance.getItemByFullName(jobFullName) def buildInstance = targetJob.scheduleBuild2(0, new Cause.UserIdCause(), new ParametersAction([ new StringParameterValue('BUILD_ID_PARAM', buildId) ])).get() echo "等待Job ${jobFullName} 完成,构建编号: ${buildInstance.number}" // 轮询构建状态,直到结束 while (buildInstance.isBuilding()) { sleep(time: 30, unit: 'SECONDS') // 每30秒检查一次状态 buildInstance = targetJob.getBuildByNumber(buildInstance.number) // 更新构建状态 echo "Job ${jobFullName} 当前状态: ${buildInstance.getBuildStatus()}" } // 校验构建结果,失败则终止流水线 if (buildInstance.getResult() != Result.SUCCESS) { error "预部署Job ${jobFullName} 执行失败,结果: ${buildInstance.getResult()}" } else { echo "预部署Job ${jobFullName} 执行成功" } }
注意事项
- 使用
Jenkins.instance需要确保流水线拥有足够的权限,可在Jenkins全局安全配置中调整脚本权限,或使用官方插件提供的安全API替代。 - 优先选择方法1,
build步骤已封装了成熟的等待、状态检查逻辑,代码更简洁可靠。 - 如果Job列表是从JSON配置读取的,可先解析JSON提取Job名称,再按上述逻辑处理。
内容的提问来源于stack exchange,提问作者Sagar Shah
相关产品推荐
相关产品推荐

