实现 CICD 的过程中,Jenkins Pipeline Job Build 之间需要传递共享数据,比如,有一个 Test Job 用来跑测试用例,跑完后会生成一个测试结果文件,另外一个 Report Job 是用于邮件通知测试结果,需要测试结果文件,那么就需要从 Test Job 中 拷贝测试结果文件。或则为了统计历史数据,本次 Build 的结果需要基于上次 Build 的数据添加新的数据,那么就需要拷贝上一个 Build 的结果文件。Copy Artifact Plugin 可以满足这个需求,本文就来介绍一下这个插件。
内容提要:
Copy Artifact 应用于 Jenkins Job 拷贝 Archive the artifacts 归档文件,可以指定具体哪个 Build (例如:the last successful/stable build, by build number, or by a build parameter),也可以过滤控制拷贝哪些文件及拷贝到哪个目标文件夹。还可以从 workspace 目录拷贝文件。
这个插件不在 Jenkins 建议安装的插件列表中,所以想使用该插件,需要单独安装。
Manage Jenkins -> Plugin Manger

安装成功后,打开 Job Configure, Add build step 选项中可以看到 Copy artifacts from another project

应用这个 Plugin 之前,需要将共享的文件进行归档处理。通过 Post-build Actions 添加 Archive the artifacts 选项。

将 workspace 目录下的文件进行归档,归档成功后的文件可以通过 URL 来访问:JenkinsURL/…JobPath/BuildNo/artifact/

文件归档后,就可以访问拷贝了
例如下面的配置,从目标 job 最后一个 build 归档目录中拷贝所有归档的 csv 文件到当前 Job 的 workspace 根目录下。

Build 成功后,workspace 就看到拷贝的文件了。

这里需要提醒一下,默认 Job Configure 中,会删除 workspace,如果需要保留 workspace 就不要勾选。为了节约存储空间,建议还是勾选,可通过 Arhicve the artifacts 归档一些需要的文件。

对目标 Build,有很多个选项,有些从名字就能看出来,可根据需要选择。

Specific build 选项
举个指定具体 Build No 的例子,可通过变量访问动态获取。

当然也可以通过 Pipeline Groovy 脚本设置变量。
举例:一个 Jenkins Pipeline Job,并行触发 Smoke 和 Regression Job,最后触发 Report job 邮件通知,之间参数互相传递。
#!groovy
pipeline {
options {
buildDiscarder(logRotator(numToKeepStr: '15', daysToKeepStr: '15'))
}
agent { label "Linux1" }
parameters {
string(name: 'branch', defaultValue: 'master', description: 'example : master')
string(name: 'env', defaultValue: 'dev', description: 'example : dev')
string(name: 'project_name', defaultValue: 'Project XXX', description: 'example : Project XXX')
string(name: 'email_list', defaultValue: 'aaa@bbb.com',
description: 'example : aaa@bbb.com')
}
stages{
stage('Testing'){
parallel{
stage('Smoke') {
agent { label "Linux1" }
steps {
script {
def smoke_build = build job: 'Smoke-Job',
propagate: false,
parameters: [
string(name: 'branch', value: "${params.branch}"),
string(name: "env", value: "${params.env}")
]
smoke_full_project_name = smoke_build.getFullProjectName()
smoke_build_num = smoke_build.getNumber()
}
}
}
stage('Regression') {
agent { label "Linux1" }
steps {
script {
def regression_build = build job: 'Reg-Job',
propagate: false,
parameters: [
string(name: 'branch', value: "${params.branch}"),
string(name: "env", value: "${params.env}")
]
regression_full_project_name = regression_build.getFullProjectName()
regression_build_num = regression_build.getNumber()
}
}
}
}
}
}
post {
always {
build job: '../Report-JOB',
parameters: [
string(name: 'smoke_job', value: "${smoke_full_project_name}"),
string(name: 'smoke_build_num', value: "${smoke_build_num}"),
string(name: 'regression_job', value: "${regression_full_project_name}"),
string(name: 'regression_build_num', value: "${regression_build_num}"),
string(name: 'branch', value: "${params.branch}"),
string(name: 'env', value: "${params.env}"),
string(name: 'project_name', value: "${params.project_name}"),
string(name: 'email_list', value: "${params.email_list}")
]
}
}
}
Specified by a build parameter 选项
先添加一个 Build selector for Copy Artifact 参数

Copy arfifacts from another project,选择 Specified by a build parameter 选项, Parameter Name 直接填上前面添加的 Build selector for Copy Artifact 参数名即可。

有关 Project Name 和 Permalink 参数,均可以从 Job 首页获取。
Project Name 就是 Full project name,可以避免 Job 之间识别问题。
Permalink 参数之前一直很困惑,后面才发现其实就是基于 Job 的固定 URL,当前 Job 首页就能看到这些信息。
例如:lastBuild 的 Permalinks
https://jenkinsURL/projectURL/lastBuild/
