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
相关产品推荐
相关产品推荐

