Jenkins下游运行时,如何用Copy artifacts插件复制上游触发构建的制品?
解决Jenkins上下游任务制品复制问题
问题本质
你碰到的核心矛盾是:上游任务虽配置了阻塞等待下游完成,但此时上游仍处于运行状态,工作区可能被占用、制品未完成归档,导致下游无法从「触发当前构建的上游运行中构建」复制文件;而「最后完成的上游构建」是稳定状态,所以复制正常。要拿到触发当前下游的新鲜snapshot.zip,得换个稳定的产物获取方式。
具体实现步骤
1. 上游任务先归档制品到构建记录
放弃直接从上游工作区复制的思路,先让上游把生成的zip制品归档到自身构建记录中:
- 在上游Maven构建步骤之后,添加**「Archive the artifacts」**步骤
- 配置归档路径:比如
**/target/*.zip(根据你的实际制品路径调整) - 勾选「Keep build artifacts」确保构建记录保留这些文件
2. 下游从上游归档的制品中复制
下游使用**「Copy artifacts from another project」**插件,配置如下:
- 「Which build」选择**「Upstream build that triggered this job」**
- 「Artifacts to copy」填写和上游一致的归档路径(如
**/*.zip) - 注意选择从artifacts复制,而非workspace(插件默认会优先取artifacts,无需额外配置,但要确保上游已完成归档)
3. 固定上游任务执行顺序
确保上游任务的执行流程严格按以下顺序:
- 执行Maven构建生成snapshot.zip
- 完成制品归档到构建记录
- 触发下游任务并阻塞等待其完成
这样下游触发时,上游的新鲜制品已经稳定归档,即使上游仍在运行,也能从它的构建artifacts中获取到正确的文件。
4. 备选方案:通过参数传递构建号
如果上述方案仍有问题,可在上游触发下游时传递自身构建号:
- 上游触发下游时,添加参数:
UPSTREAM_BUILD_NUMBER=${BUILD_NUMBER} - 下游「Copy artifacts」配置中,选择「Specific build」,并填写参数
${UPSTREAM_BUILD_NUMBER} - 同样从artifacts中复制文件
关键提醒
- 绝对不要直接从运行中的上游工作区复制:工作区可能存在文件锁、后续步骤会修改文件,导致复制失败或拿到不完整的制品
- 依赖构建归档的artifacts是Jenkins中获取构建产物的标准稳定方式,只要归档步骤执行完成,无论构建是运行中还是已结束,都能安全访问
内容的提问来源于stack exchange,提问作者K. Sai Bharadwaj
相关产品推荐
相关产品推荐

