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

Jenkins如何校验其他多分支任务指定分支是否存在对应构建构件

Jenkins多分支流水线校验目标任务构件存在性的实现方案

方案1:使用Copy Artifact插件内置参数(最简实现)

如果你只是需要避免构件不存在时任务报错中断,不需要额外的分支逻辑,直接给copyArtifacts步骤添加两个可选参数即可实现需求,无需调用Jenkins内部API,也不需要处理权限问题:

script {
    copyArtifacts filter: "dist.tar.gz",
        projectName: 'Frontend/${BRANCH_NAME}',
        selector: lastSuccessful(),
        target: "./public",
        failIfNotFound: false, // 找不到对应构件时直接跳过,不抛出异常
        optional: true // 标记该构件为可选,避免步骤标记为失败
}

方案2:自定义前置校验逻辑(灵活可控)

如果你需要根据构件是否存在执行不同的后续逻辑,可以基于你已经掌握的Jenkins内部API能力实现完整的校验流程,完整代码如下:

script {
    def targetJobName = "Frontend/${BRANCH_NAME}"
    def targetArtifactName = "dist.tar.gz"
    def allowCopy = false

    try {
        // 1. 获取目标多分支任务的指定分支任务实例
        def targetJob = Jenkins.instance.getItemByFullName(targetJobName)
        if (!targetJob) {
            println "目标任务${targetJobName}不存在,跳过复制"
        } else {
            // 2. 获取目标任务的最近成功构建
            def lastSuccessBuild = targetJob.getLastSuccessfulBuild()
            if (!lastSuccessBuild) {
                println "目标任务${targetJobName}无成功构建记录,跳过复制"
            } else {
                // 3. 校验最近成功构建中是否存在目标构件
                allowCopy = lastSuccessBuild.getArtifacts().any { artifact ->
                    artifact.getFileName() == targetArtifactName
                }
                if (!allowCopy) {
                    println "目标构建中未找到${targetArtifactName},跳过复制"
                }
            }
        }
    } catch (Exception e) {
        println "校验过程出现异常:${e.getMessage()},跳过复制"
        allowCopy = false
    }

    if (allowCopy) {
        println "找到符合要求的构件,开始执行复制"
        copyArtifacts filter: targetArtifactName,
            projectName: targetJobName,
            selector: lastSuccessful(),
            target: "./public"
    }
}

注意事项

  • 方案2使用了Jenkins内部API,首次执行如果遇到脚本权限拦截,需要进入Jenkins管理后台的「进程内脚本批准」页面,批准对应的方法调用权限。
  • 如果你的多分支任务存放在Jenkins文件夹下,targetJobName需要填写完整路径,例如业务前端组/Frontend/${BRANCH_NAME}。
  • 如果需要匹配子目录下的构件,可以将校验逻辑中的getFileName()替换为getRelativePath(),即可匹配构件的完整相对路径。

内容的提问来源于stack exchange,提问作者prodigy7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:36:04