Jenkins2 学习系列12 -- 创建和使用共享库
当有大量的pipeline项目构建任务,有很多代码是重复的,这时需要提取和复用共同的逻辑。 其实pipeline本质就是一个Groovy脚本,所以可以在pipeline中自定义函数,并使用Groovy语言自带的特性。 比如下面的Jenkinsfile,我们自定义了一个 createVersion 函数,并使用了内置的Date类。
pipeline {
agent any
stages {
stage ('build') {
steps {
// 输出 201907-4
echo "${createVersion(BUILD_NUMBER)}"
}
}
}
}
def createVersion(String BUILD_NUMBER) {
return new Date().format('yyyyMM') + "-${BUILD_NUMBER}"
}
还有一种更优雅的写法,将变量定义在environment内
pipeline {
agent any
environment {
_version = createVersion()
}
stages {
stage ('build') {
steps {
echo "${_version}"
}
}
}
}
def createVersion() {
return new Date().format('yyyyMM') + "-${env.BUILD_NUMBER}"
}
使用共享库
大致流程:
- 新建个Groovy仓库,里面包含共享库代码
这里已经建好 jenkins-shared-library,文件结构如下:
image.png
vars 目录下的全局变量可以直接在pipeline中使用,即当写sayHello('world')
,实际调用的是sayHello.groovy
中的call函数
src 目录是标准的Java源码结构,目录中的类被称为类库(Library class),而 @Library('global-shared-library@master')
就是一次性静态加载src目录下所有代码到classpath中。
src目录中的类,可以使用Groovy中的@Grab注解,自动下载第三方依赖包
- Jenkins 管理后台配置仓库地址和版本等 进入 Jenkins 的Manage Jenkins -> Configure System -> Global Pipeline Libraries 配置页面
image.png
- Jenkins 项目的pipeline中引入共享库(可以指定仓库版本和具体class) 新建一pipeline类型的job。 Pipeline内容如下:
@Library('global-shared-library@master') _
pipeline {
agent any
environment {
_version = createVersion()
}
stages {
stage ('build') {
steps {
script {
def util = new com.mafeifan.Utils()
def version = util.createVersion("${BUILD_NUMBER}")
echo "${version}"
sayHello 'yes'
echo "${_version}"
}
}
}
}
}
def createVersion() {
return new Date().format('yyyyMM') + "-${env.BUILD_NUMBER}"
}
查看构建日志,发现Jenkins首先拉取共享库代码,执行成功。
image.png
使用共享库实现Pipeline模板
// vars/generatePipeline.groovy
def call(String lang) {
if (lang == 'go') {
pipeline {
agent any
stages {
stage ('set go path') {
steps {
echo "GO path is ready"
}
}
}
}
} else if (lang == 'java') {
pipeline {
agent any
stages {
stage ('clean install') {
steps {
sh "mvn clean install"
}
}
}
}
}
// 其他语言
}
使用时,Jenkinsfile 只有两行
@Library['global-shared-library'] _
generatePipeline('go')
如果大多数项目都是标准化的,可以利用共享库的pipeline模块技术来降低维护成本。
这里只是抛砖引玉,想写出更强大的共享库需要多了解Groovy。
优先考虑使用自定义函数,如果此函数出现在了至少三个项目中,考虑移到共享库里,当发现项目的pipeline非常相似,考虑使用pipeline模块。
参考
https://jenkins.io/zh/doc/book/pipeline/shared-libraries/
- 验证 结构体指针与自增运算符
- Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失下篇
- ONOS1.3.0集群实验
- Spring Boot下的TDD(测试驱动开发)
- MySQL的索引是什么?怎么优化?
- C语言之函数
- ElasticSearch搜索引擎在SpringBoot中的实践
- 消费者驱动的微服务契约测试套件Spring Cloud Contract
- 使用Spring Boot开发一个Spring Mobile程序
- Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失
- 内网穿透工具-ittun
- Elastic-Job-Spring-Boot-Starter简化你的任务配置
- Spring Boot处理REST API错误的正确姿势
- C语言之位运算
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android开发第三讲,布局管理器
- Android 开发第四讲 TextView的基本使用
- Android 开发第五讲 学习Button了解Button属性
- Android开发第六讲EditText 编辑框
- Android 开发第七讲 RadioButton (单选按钮)
- linux内核写时复制机制源代码解读
- akka-grpc - 应用案例
- Python从入门到大师教程 | 二、搭建Jupyter Notebook环境
- 收益3583万?我是如何快速统计「李子柒」YouTube频道视频累计播放量并计算收益的
- mysql优化篇:where中的like和=的性能分析
- 557. 反转字符串中的单词 III
- 剑指 Offer 03. 数组中重复的数字
- 841. 钥匙和房间
- 一篇文章了解python常见内置异常报错
- 五分钟极速搭建kubernetes集群