7. Jenkins 其他功能
本篇主要介绍日常使用Jenkins过程中一些比较实用的功能。
7.1 Jenkins内部调用另一个job
假设在一个Jenkins中有两个彼此独立的任务,但随着迭代不断更新,两个彼此独立的任务需要相互调用。这时候我们可以在一个任务中,添加另一个任务的步骤。除这种方法,还有没有其他的办法呢?
既然在Jenkins存在参数化的pipeline,则应该是可以支持在一个pipeline中调用另一个pipeline。而要实现这个功能,在pipeline中可以使用build
步骤来实现。看起来是不是与upsteam非常相似,主要区别如下所示:
- build 步骤是上游使用,而upstream是下游使用
- build 可以带参数,而upsteam属于被动触发且不能带参数
build 使用用法示例如下所示:
steps{
build(
job:"jobName",
parameters:[
paramsType(name:"name",value:"value")
],
propagate:true,
quietPeriod:3,
wait:true
)
}
build 步骤的两个基本参数如下所示:
- job:
必填参数
,目标任务的名称 - parameters:
可选参数
,目标任务的传入参数列表,使用方法与参数化命令parameters
类似。 - propagate:
可选参数
,布尔类型。若值为true
,则只有当下游pipeline的运行结果状态为SUCCESS
时,上游pipeline才算成功,若值为false
,则忽略下游pipeline的运行结果状态,上游pipeline都忽略。默认为true
- quietPeriod:
可选参数
,整型。触发下游pipeline后,下游pipeline等待多久执行。如果不设置,则等待时长由下游pipeline确定,单位为秒
- wait:
可选参数
,布尔类型,是否等待下游pipeline运行完成。默认为true
choice类型的参数没有对应的传参方法,使用
string
传参方法代替
假设现在有两个job,分别为SurpassA
和SurpassB
,上游为SurpassA,下游为SurpassB
- SurpassB的任务pipeline脚本如下所示:
pipeline{
agent any
options{
timestamps()
}
parameters{
string(
name:"stringDemo",
defaultValue:"job string SurpassB",
description:"job SurpassB string demo"
)
text(
name:"textDemo",
defaultValue:"job text SurpassA\njob text SurpassB\njob text SurpassC",
description:"job SurpassB text demo"
)
booleanParam(
name:"booleanDemo",
defaultValue:true,
description:"job SurpassB boolean demo"
)
choice(
name:"choiceDemo",
choices:["SurpassA","SurpassB","SurpassC"],
description:"job SurpassB choice demo"
)
password(
name:"passwdDemo",
defaultValue:"job passwd SurpassB",
description:"job SurpassB password demo"
)
}
stages{
stage("job SurpassB demo"){
steps{
echo "job SurpassB demo"
}
}
}
}
- SurpassA的任务pipeline脚本如下所示:
pipeline{
agent any
options{
timestamps()
}
stages{
stage("call inner jobs demo"){
steps{
echo "call inner job SurpassB"
build(
job:"39-SurpassB",
parameters:[
string(name:"stringDemo",value:"input text by SurpassA"),
text(name:"textDemo",value:"input text by SurpassB"),
booleanParam(name:"booleanDemo",value:false),
string(name:"choiceDemo",value:"SurpassB"),
password(name:"passwdDemo",value:"Surpass")
]
)
}
}
}
}
最终运行结果如下所示:
7.2 Jenkins调用外部Jenkins
前面演示的在同一个Jenkins,内部相互调用不同任务的pipeline,那如果是两个不同服务节点的Jenkins有没有相互调用呢?答案是可以的。
通过远程Jekins调用本地Jenkins,演示的环境如下所示:
Jenkins Server | 描述信息 |
---|---|
192.168.188.133 | 本地Jenkins |
192.168.188.132 | 远程Jenkins |
操作步骤如下所示:
- 1.在本地Jenkins开启
触发远程构建
,并设置相应的Token,如下所示:
- 2.在本地Jenkins新建一个用户,并以该用户进行登录,查看并复制对应的API Token信息,如下所示:
- 3.通过接口工具(如Postman)发送HTTP请求,检验是否能成功调用
运行结果如下所示:
- 4.在远程pipeline中添加以下步骤即可实现远程调用
pipeline{
agent any
options{
timestamps()
}
stages{
stage("remote call pipeline demo"){
steps{
script{
def url="Surpass:[email protected]:9090/job/39-SurpassB/buildWithParameters?token=surpass-local&stringDemo=SurpassRemote&textDemo=SurpassRemote&booleanDemo=true&choiceDemo=SurpassB&passwdDemo=SurpassRemote"
sh(
script:"curl -X POST \'${url}\'",
returnStatus:true
)
}
}
}
}
}
运行结果如下所示:
7.3 Jenkins 备份
Jenkins 的所有数据都是存放在文件中。因此Jenkins备份也就是备份JENKINS_HOME
目录。其目录结构大致如下所示:
- config.xml: Jenkins系统配置文件
- *.xml: 部分插件配置文件
- plugins:插件安装路径
- jobs: job存放路径
其中jobs的文件目录结构如下所示:
jobName: 以Jenkins 项目名称做为文件夹名称
- config.xml: 该项目对应的配置文件,里面存储有相应的pipeline
- nextBuildNumber:存放下一次构建的构建号,为文本文件
- builds:每次构建内容
- workspace: 工作空间目录
并不是所有内容都需要备份,一般来讲,只需要备份jobs
和plugins
目录即可。