一.简介
当大量使用pipeline后,内置功能并不能照顾到所有需求,这时候需要扩展pipeline。
pipeline本质就是一个Groovy脚本。所以,可以在pipeline中定义函数,并使用Groovy语言自带的脚本特性。我们定义了createVersion函数,并使用了Date类
def createVersion(String BUILD_NUMBER)
{
-
return
new
Date().format(
'yyMM'
)
"-${BUILD_NUMBER}"
}
pipeline {
agent any
stages {
stage('Build')
{
steps {
echo "${createVersion(BUILD_NUMBER)}"
-
}
-
}
-
}
}
日志如下:
还有一种更优雅的写法,将变量定义在environment部分
def createVersion(String BUILD_NUMBER)
{
-
return
new
Date().fromat(
'yyMM'
)
"-${BUILD_NUMBER}"
}
pipeline {
agent any
environment {
_version = createVersion(BUILD_NUMBER)
-
}
stages {
stage('Build')
{
steps {
echo "${_version}"
-
}
-
}
-
}
}
如果在一个Jenkinsfile定义一个函数,倒是无伤大雅。但是如果再20个Jenkinsfile中重复定义这个函数20遍,就有问题了。
二.共享库扩展
Jenkins pipeline提供了“共享库”(Shared library)技术,可以将重复代码定义在一个独立的代码控制仓库中,其他的Jenkins pipeline加载使用它。类似编程中的模块包(实际就是),可以引用其它方法,直接在当前pipeline使用。
创建共享库项目,目录结构如下
将代码推送到git仓库中,进入Jenkins的Manage Jenins-》Configure System -》Global Pipeline Libraries配置页面
配置项:
- Name :共享库的唯一标识,在Jenkinsfile中会使用到。. Default version :默认版本。可以是分支名、tag标签等。
- Load implicitly:隐式加载。如果勾选此项,将自动加载全局共享库,在Jenkinsfile中不需要显式引用,就可以直接使用。
- Allow default version to be overridden :如果勾选此项,则表示允许“Default version”被Jenk-insfile中的配置覆盖。
- lnclude@Library changes in job recent changes:如果勾选此项,那么共享库的最后变更信息会跟项目的变更信息一起被打印在构建日志中。 .- Retrieval method:获取共享库代码的方法。我们选择Modern SCM”选项,进而选择使用Git仓库。
提示:除了可以使用Git仓库托管共享库代码,还可以使用SVN仓库托管。使用不同的代码仓库托管,“Default version”的值的写法不一样。本书只介绍Git仓库托管方式。
共享库使用
在pipeline里调用
@Library(
'global-shared-library')_
pipeline {
agent any
stages {
stage('Build')
{
steps {
sayHello(
"world")
-
}
-
}
-
}
}
在Jenkins pipeline的顶部,使用@Library指定共享库。注意,global-shared-library就是我们在上一个步骤中定义的共享库标识符。
引入共享库后,我们可以直接在Jenkins pipeline中使用vars目录下的sayHello,和Jenkins pipeline的普通步骤的使用方式无异。
至此,一个共享库的完整定义和基本使用就介绍完了。总结下来就四步: 1.按照共享库约定的源码结构,实现自己的逻辑。
2.将共享库代码托管到代码仓库中。
3.在Jenkins全局配置中定义共享库,以让Jenkins知道如何获取共享库代码。
4.在Jenkinsfile中使用@Library引用共享库。
使用@Library注解可以指定共享库在代码仓库中的版本。
代码语言:javascript复制@Library('global-shared-library@<version>')_
<version>
可以是:
因为Jenkins支持同时添加多个共享库,所以@Library注解还允许我们同时引入多个共享库,如:@Library ( [‘global-shared-library’ , ‘otherlib@abc1234])。
需要注意的是,Jenkins处理多个共享库出现同名函数的方式是先定义者生效。也就是说,如果global-shared-library与otherlib存在同名的sayHello,而@Library引入时global-shared-library在otherlib前,那么就只有global-shared-library的sayHello生效。
共享库结构
回顾目录
首先看vars目录。 放在vars目录下的是可以是从pipeline直接调用的全局变量,变量的文件名即为在pipline中调用的函数名,文件名为驼峰式的。
使用vars目录下的全局变量可以调用Jenkins pipeline的步骤。正如sayHello.groovy脚本,直接使用echo步骤
def call(String name =
'human')
{
echo "Hello, ${name}."
}
当我们在Jenkins中写sysHello(“world”)时,它实际调用的是sysHello.groovy文件中的call函数。
call函数还支持接收闭包(Closure),下例中,我们定义了一个mvn全局变量。
// vars/mvn.groovy
def call(mvnExec)
{
configFileProvider([configFile(fileId:'maven-global-settings', variable:'MAVEN_GLOBAL_ENV')])
{
mvnExec("${MAVEN_GLOBAL_ENV}")
-
}
}
以上call函数里的内容就是将configFileProvider啰嗦的写法封装在mvn变量中。这样我们就可以更简洁的执行mvn命令了。
@Libray('global-shared-library@master') _
pipeline {
agent any
tools {
maven 'mvn-3.5.4
-
}
stages {
stage('Build')
{
steps {
mvn { settings ->
sh "mvn -s ${settings} clean install"
-
}
-
}
-
}
-
}
}