一、背景

在进入正题之前,首先介绍一下项目之间的依赖关系 构件。什么是依赖关系呢,例如,项目Test1构建是需要在项目Test2构件完成后进行,这就是依赖关系。在Jenkins上的界面来解释,就是图1的红色区域选项。

在这里插入图片描述

环境准备

  1. 一台电脑
  2. Jenkins环境(这个网上有,可以随意找)

二、同类型Job间的相互调用

Project Job间的相互调用及传参

使用本地Jenkins的小伙伴请安装 Parameterized Trigger Plugin这个插件

为了模仿这个过程,我创建了Test1和Test2,每个项目里面的构建内容都是 windows batch commonds,输入的命令大家可以随意。

1. Test1 的相关配置如下

首先要知道我们要传递的是packageName这个参数
(1)在Test1中首先设置这个参数。在这里插入图片描述
(2)选择Trigger parameterized build on other projects

Projects to build 选择你要触发的项目,这里我们写Test2。Trigger when build is 按需选择。

predefined parameters中可以定义你要传递的参数,写法如下,也可以将当前job的环境变量传递给另外一个项目。在这里插入图片描述
这样Test1就设置好了

2. Test2 的相关配置如下

Test2 中的配置,选择参数化构建过程。参数名称和刚刚写的要一致![在这里插入图片描述]
windows batch commonds中验证参数是否被正确的传递
在这里插入图片描述
3. 最后我们分别来看一下两个Job的控制台输出在这里插入图片描述
首先是Test1的控制台输出。可以看到调用了Test 2

接着我们看下Test2的控制台输出
在这里插入图片描述
可以看出,由Test1 的Number4触发,我们传的packageName参数也被传递了过来。

Pipeline Job间的相互调用及传参

下面来介绍下,pipeline代码中如何把两个JOB给串接起来。我们知道,在图形界面的jenkins中的自由风格的job的设置页眉,我们可以选择,执行完job A之后触发执行Job B, 那么pipeline又是如何实现这一过程呢。

环境准备

当前我的JobA 命名为ProjectA-pipeline-demo,JobB 命名为ProjectA1-pipeline-demo

1. ProjectA-pipeline-demo 的相关配置如下
这是我在本地写的一个简易的pipeline Job,使用build函数可以实现pipeline Job之间的调用和参数传递。

// An highlighted block
import hudson.model.*;
 
 
pipeline{ 
	
	agent any
	stages{
		stage("Hello Pipeline") {
			steps {
			    script {
					println "Hello Pipeline!"
					println env.JOB_NAME
					println env.BUILD_NUMBER
				}
			}
		}
		
		stage("Init paramters in json") {
			steps {
			    script {
					println "read josn input file"
					def packagename = "xxx"
					println packagename
				    callTestingJob(packagename)
				}
			}
		}	
	}
}
def callTestingJob(packagename){
    println packagename
	build job:"1", propagate: false, wait: true,parameters: [
	     string(name:'packagename', value: packagename)
	                   ]	
}


三、不同类型Job间的相互调用

Pipeline Job 调用Project Job并传参

上面我们学习了同类型间的相互调用与传参,那么,不同类型的Job之间如何串联起来呢。我们这里把pipeline Job命名为ProjectB-pipeline-demo,Project Job命名为1.

1. ProjectB-pipeline-demo 的相关配置如下

这是我在自己本地写的一段简易的pipeline代码

// An highlighted block
import hudson.model.*;
 
 
pipeline{ 
	
	agent any
	stages{
		stage("Hello Pipeline") {
			steps {
			    script {
					println "Hello Pipeline!"
					println env.JOB_NAME
					println env.BUILD_NUMBER
				}
			}
		}
		
		stage("Init paramters in json") {
			steps {
			    script {
					println "read josn input file"
					def packagename = "xxx"
					println packagename
				    callTestingJob(packagename)
				}
			}
		}	
	}
}
def callTestingJob(packagename){
    println packagename
	build job:"1", propagate: false, wait: true,parameters: [
	     string(name:'packagename', value: packagename)
	                   ]	
}


定义了一个callTestingJob函数添加调用Job B的代码。传递packagename这个参数。

2. Project 1的相关配置如下
在这里插入图片描述
添加一个名字与ProjectB-pipeline-demo要传递参数相同的参数在这里插入图片描述
用windows batch commonds测试一下,看packeageName能不能打印出来。

3. 看下控制台的输出

在这里插入图片描述

首先是ProjectB-pipeline-demo的控制台输出。可以看到调用了1

接着我们看下1的控制台输出
在这里插入图片描述
可以看出,由ProjectB-pipeline-demo的Number 34触发,我们传的packageName参数也被传递了过来。

参考文献

【1】https://blog.csdn.net/winter199/article/details/90604933
【2】https://blog.csdn.net/u011541946/article/details/89344002

Logo

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

更多推荐