1、 前言
我们在创建jenkins任务的时候,有时候一个任务需要调用多个子任务来完成。比如,我们在编译某个镜像的时候,镜像由多个组件构成。那么我们就可以创建一个主任务以及多个子任务,主任务负责调用每个子任务,并将每个子任务的结果进行汇总,而子任务负责每个单组件的编译。
主任务和子任务的关系如下所示:
每个子任务都是独立的,有自己的工作空间。
这里需要区分几个概念:
任务与job:简单来说,我们在jenkins上可以创建多个任务,每个都执行不同的功能。任务每执行一次成为一个job,对应一个jobnum
上游任务和下游任务:如果主任务触发(即调用)了子任务,那么主任务就成为上游任务,自然子任务就可以成为下游任务。
举例如下:
可以看到下图中展示当前的任务名称为pipelinDebug, 本次任务构建的jobnum为#310,本次构建是上游任务(即主任务)触发的,对应的上游jobnum为33
2、如何在主任务中调用子任务
从上面的举例中,我们看到,上游任务parentjob触发了下游任务pipeDebug。那么具体如何实现呢?
以声明式脚本举例如下:
调用的基本格式为:
build job:"projectName", parameters:params
简单来说,只需要下游任务名称,和传递给下游任务的参数即可。
pipeline {
agent any
parameters {
string(name: 'project_name', defaultValue: 'guest_os_image/windows/cloud_app/asp', description: '项目jar名称')
string(name: 'version', defaultValue: 'test', description: '部署环境')
string(name: 'user_name', defaultValue: 'aqsc', description: '操作系统登录名')
booleanParam(name: 'dryrun', defaultValue: true)
}
stages{
stage('test') {
steps {
script {
def myjob
myjob = build job :'pipelineDebug',parameters:[string(name: 'project', value: '/asp'),
string(name: 'version', value: 'dev')]
copyArtifacts( fingerprintArtifacts: true, projectName: 'pipelineDebug', selector: specific(job.getNumber().toString()))
}
}
}
}
}
3、上游任务如何获取下游任务的结果
3.1 上游任务从下游任务中复制文件
前面提到,每个子任务之前都是独立的,上游任务和下游任务之间虽然存在调用与被调用的关系,但是它们的工作空间都是独立的,一般都是运行在不同的服务器上,彼此之间存在隔离。那么上游任务如何获取到下游任务的结果呢?
这里需要用到一个插件:Copy Artifact
如果没有安装该插件的话,需要安装之后才能使用。
安装好插件之后,下游任务只需要上传文件,上游任务只需要复制文件,这样上游任务可以可以获取下游任务的结果了。
假如下游任务生成了一个projectId.json,上游任务需要获取该json文件,实现如下:
下游任务(pipeDebug)中,增加一行代码,上传文件:
// 下游任务中上传文件
archiveArtifacts artifacts: 'projectId.json'
上游任务复制上传的文件:
def job
job = build job :'pipelineDebug',parameters:[string(name: 'project', value: '/asp'),
string(name: 'version', value: 'dev')]
// 上游任务复制文件
copyArtifacts( fingerprintArtifacts: true, projectName: 'pipelineDebug', selector: specific(job.getNumber().toString()))
通过以上的两个操作,就实现了,将下游任务中的文件projectId.json复制到了上游任务的工作区。
3.2 上游任务从下游任务复制文件的原理
上一节提到,上游任务如何从下游任务中复制文件。操作非常简单,那么现在简单说一说这个实现的原理。
要明白这个原理,只需要搞清楚两个问题:
下游任务所谓的上传文件,到底是上传到哪? 上游任务复制文件,到底是从哪复制?
这看起是两个问题,实际上是一个问题。
答案就是上传的jenkins网站上,或者说jenkin网站所在计算机。
因为不同的任务都是可以通过在jenkins网站上创建和触发的,因此如果将文件复制到jenkins所在网站上,那么自然不同的任务之间就可以共享文件了。
正因为如此,我们可以在下游任务的jenkins界面上看到上传的文件,并可以下载。如下图所示: