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界面上看到上传的文件,并可以下载。如下图所示:

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐