Jenkins - Copy Artifact 插件 Build 之间数据共享传递

引言

实现 CICD 的过程中,Jenkins Pipeline Job Build 之间需要传递共享数据,比如,有一个 Test Job 用来跑测试用例,跑完后会生成一个测试结果文件,另外一个 Report Job 是用于邮件通知测试结果,需要测试结果文件,那么就需要从 Test Job 中 拷贝测试结果文件。或则为了统计历史数据,本次 Build 的结果需要基于上次 Build 的数据添加新的数据,那么就需要拷贝上一个 Build 的结果文件。Copy Artifact Plugin 可以满足这个需求,本文就来介绍一下这个插件。

内容提要:

  1. Copy Artifact Plugin 简介和安装
  2. Copy Artifact Plugin 应用

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 ConfigureAdd build step 选项中可以看到 Copy artifacts from another project
在这里插入图片描述

Copy Artifact Plugin 应用

文件归档 Archive the artifacts

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

在这里插入图片描述
workspace 目录下的文件进行归档,归档成功后的文件可以通过 URL 来访问:JenkinsURL/…JobPath/BuildNo/artifact/
在这里插入图片描述

Copy artifacts from another project 应用

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

在这里插入图片描述

最近 Jenkins 升级过,加强了安全性,可能会出现如下异常
Unable to find project for artifact copy: Dev/X/XX/XXXX-Smoke
This may be due to incorrect project name or permission settings; see help for project name in job configuration.
在这里插入图片描述
解决方案:
在被 Copy arfifacts 的 job configure 中 General Tab 配置允许 Copy arfifacts 的 project。
例如: Project A 需要 Copy Project B 中的 artifacts,那么需要在 Project B 中 配置允许 Project A copy。 被允许的 Project name 最好是 full name,而且要以 / 开头。
在这里插入图片描述

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

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

Copy artifacts from another project 详细设置

对目标 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 NamePermalink 参数,均可以从 Job 首页获取。

Project Name 就是 Full project name,可以避免 Job 之间识别问题。

Permalink 参数之前一直很困惑,后面才发现其实就是基于 Job 的固定 URL,当前 Job 首页就能看到这些信息。
例如:lastBuild 的 Permalinks
https://jenkinsURL/projectURL/lastBuild/

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您需要完成以下步骤来创建一个Jenkins + Vue的操作数据看板项目: 1. 创建一个Maven项目 ``` mvn archetype:generate -DgroupId=com.example -DartifactId=jenkins-dashboard -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false ``` 2. 添加以下依赖项到pom.xml文件中: ``` <dependencies> <dependency> <groupId>com.offbytwo.jenkins</groupId> <artifactId>jenkins-client</artifactId> <version>0.3.10</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> ``` 3. 创建一个名为“JenkinsClientService”的Java类,并添加以下代码: ``` import com.offbytwo.jenkins.JenkinsServer; import com.offbytwo.jenkins.model.Build; import com.offbytwo.jenkins.model.BuildResult; import com.offbytwo.jenkins.model.BuildWithDetails; import com.offbytwo.jenkins.model.Job; import org.springframework.stereotype.Service; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Service public class JenkinsClientService { private JenkinsServer jenkins; public JenkinsClientService() throws URISyntaxException { jenkins = new JenkinsServer(new URI("http://localhost:8080"), "admin", "admin"); } public List<String> getJobs() throws IOException { Map<String, Job> jobs = jenkins.getJobs(); return jobs.values().stream().map(Job::getName).collect(Collectors.toList()); } public BuildWithDetails getLastBuild(String jobName) throws IOException { Job job = jenkins.getJob(jobName); Build lastBuild = job.getLastBuild(); return lastBuild.details(); } public BuildResult getBuildResult(String jobName, int buildNumber) throws IOException { Job job = jenkins.getJob(jobName); Build build = job.getBuildByNumber(buildNumber); return build.details().getResult(); } } ``` 请将“http://localhost:8080”,“admin”和“admin”替换为您的Jenkins服务器URL,用户名和密码。 4. 创建一个名为“JenkinsController”的Java类,并添加以下代码: ``` import com.offbytwo.jenkins.model.BuildResult; import com.offbytwo.jenkins.model.BuildWithDetails; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; import java.util.List; @RestController public class JenkinsController { @Autowired private JenkinsClientService jenkinsClient; @GetMapping("/jobs") public List<String> getJobs() throws IOException { return jenkinsClient.getJobs(); } @GetMapping("/jobs/{jobName}/lastBuild") public BuildWithDetails getLastBuild(@PathVariable String jobName) throws IOException { return jenkinsClient.getLastBuild(jobName); } @GetMapping("/jobs/{jobName}/builds/{buildNumber}/result") public BuildResult getBuildResult(@PathVariable String jobName, @PathVariable int buildNumber) throws IOException { return jenkinsClient.getBuildResult(jobName, buildNumber); } } ``` 5. 创建一个名为“app.js”的Vue文件,并添加以下代码: ``` <template> <div id="app"> <h1>Jenkins Dashboard</h1> <ul> <li v-for="job in jobs" :key="job"> <h2>{{ job }}</h2> <p>Last build status: {{ getLastBuildStatus(job) }}</p> <button @click="buildJob(job)">Build now</button> </li> </ul> </div> </template> <script> import axios from 'axios'; export default { name: 'app', data() { return { jobs: [] } }, mounted() { axios.get('/jobs') .then(response => { this.jobs = response.data; }); }, methods: { getLastBuildStatus(jobName) { axios.get(`/jobs/${jobName}/lastBuild`) .then(response => { return response.data.result; }); }, buildJob(jobName) { axios.post(`/jobs/${jobName}/build`) .then(response => { console.log(response.data); }); } } } </script> ``` 6. 创建一个名为“index.html”的文件并添加以下代码: ``` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Jenkins Dashboard</title> </head> <body> <div id="app"></div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="app.js"></script> </body> </html> ``` 7. 创建一个名为“App.java”的Java类,并添加以下代码: ``` import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } } ``` 8. 运行以下命令启动应用程序: ``` mvn spring-boot:run ``` 现在,您已经创建了一个Jenkins + Vue操作数据看板项目。您可以通过在浏览器中打开“http://localhost:8080”来查看该应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值