文章目录
使用jenkins共享库
1、由来与演进
在Jenkins 1.x中,对于job的配置大多是基于图形界面的,也就是说,要在GUI页面手动设置相关的job参数。随着不同类型和用途的job越来越多,参数越来越复杂,难以有效地管理数量庞大的图形界面配置信息,也无法有效追踪和记录配置的更改。
在Jenkins 2.0中,基于Pipeline,用户可以在一个 JenkinsFile 中快速实现一个项目的从构建、测试以到发布的完整流程,灵活方便地实现持续交付。并且通过“pipeline script from SCM”方式,可以保存这个流水线的定义,进行版本化管理。
在实际使用中,一开始大都会制作一个尽可能通用的pipeline脚本样例,让搭建者只需要修改几个赋值参数就可以在项目中应用。但不可避免的是,不同的项目往往有不同的需求,随着定制化需求越来越多,加入了不同的功能实现代码,导致pipeline也会越来越复杂,可读性差,也不利于维护。而且随着pipeline数目不断的增多,将会发现同一类型和用途的pipeline,它们的很多功能其实是相同的,这时如果对某个功能做改动,往往需要更新数量众多的JenkinsFile。
针对pipeline的扩展和管理问题,共享库功能(Shared Libraries)应运而生。共享库可以将整个pipeline脚本的实现和复杂度封装到Shared Library中,在各种项目之间共享pipeline核心实现,减少冗余代码。也就是说,Shared Libraries的方式抽象了各种项目之间共享的代码(甚至整条完整的pipeline),有效降低了使用pipeline的复杂度。而且通过外部源代码控制(SCM)的方式,保证所有job在构建的时候会调用最新的共享库代码。
2、创建一个共享库
2.1 创建共享库
可以直接在github中创建一个公开类型的仓库,也可以创建私有类型的gitlab仓库,需要提前配置好仓库的认证凭据,这里使用gitlab创建了一个名为jenkinslib的项目作为共享库,并创建类文件和Jenkinsfile文件 /src/org/devops/tools.groovy 和Jenkinsfile:
2.2 定义类方法
如在tools.groovy中定义PrintMsg(msg)
pacakge org.devops
//打印信息
def PrintMsg(msg){
println(msg)
}
2.3 Jenkinsfile引用类
在Jenkinsfile中使用 @Library(‘jenkinslib’) _ 来加载共享库,注意后面符号 _ 用于加载,类的实例化 def mytools = new org.devops.tools(),使用上面Groovy类文件中的方法 PrintMsg(msg)
,如下:
@Library('jenkinslib') _
def tools = new org.devops.tools()
pipeline {
agent { label "master" }
stages {
stage("build"){
steps{
script{
msg = "hello jenkins"
tools.PrintMsg(msg)
}
}
}
}
}
3、在Jenkins中使用共享库
3.1 在Jenkins中配置共享库
Jenkins系统配置 -> Global Pipeline Libraries
首先,为共享库设置一个名称 jenkinslib (自定义,无需与gitlab仓库一致),注意这个名称后续在Jenkinsfile中引用,再设置一个默认的版本,这里的版本是分支的名称,我这配置的是master版本。
jenkins配置->系统配置
3.2 在pipeline使用共享库
在pipeline使用共享库,流水线定义为 pipeline script from SCM方式,在URL中配置共享库的仓库地址,我的仓库在gitlab中,所以这里填写的是gitlab的项目地址,(如果你用的是github可以使用github方式),如果仓库是私有的方式,需要在jenkins的凭据中添加一个账号用于下载共享库。
保存Jenkins配置,执行pipeline,控制台输出:打印msg(hello Jenkins)
4、项目中定义的vars的作用
def call(){
println("hello,test vars")
}
**hello在任意位置调用**
@Library('jenkinslib') _
def tools = new org.devops.tools()
hello()
pipeline {
agent any
stages {
stage("build"){
steps{
script{
msg = "hello jenkins"
tools.PrintMsg(msg)
}
}
}
}
}
5、日志彩色显示
示例:这里用到ansiColor插件,在Jenkins输出有颜色的日志信息
- 流水线语法的生成
ansiColor('xterm') {
// some block
}
tools.groovy
pacakge org.devops
//带颜色打印信息
def Post(value,color){
colors = ['red' : "\033[40;31m >>>>>>>>>>>${value}<<<<<<<<<<< \033[0m",
'blue' : "\033[47;34m ${value} \033[0m",
'green' : "\033[40;32m >>>>>>>>>>>${value}<<<<<<<<<<< \033[0m" ]
ansiColor('xterm') {
println(colors[color])
}
}
Jenkinsfile
@Library('jenkinslib') _
def tools = new org.devops.tools()
pipeline {
agent any
stages {
stage("hello"){
steps{
script{
tools.Post("success",'green')
}
}
}
}
}