You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:05:31