
说实话,对于共享库这种功能扩展的特性,刚开始没接触太多groovy语法的很多运维都会有点不知所措,包括博主自己。其最核心的因素就是groovy在jeknins中的各种使用方式。博主当时在用pipeline常用的语法完成任务时,也没想太多groovy的使用,开始:只会写pipeline块中的内容》在pipeline块上方中使用简单groovy变量》在pipeline块上写方法》抽离方法至共享库》花里胡哨大杂烩
从上一篇文章:**Jenkins share-library共享库**,可以看出共享库的作用,那么如何写自己的共享库?此篇文章,博主在这里简单介绍一点规范,避免其他运维新人踩坑。踩坑不要怕,踩坑得出来得经验更深刻。。。。
共享库目录结构
官方的结构如下:
1 2 3 4 5 6 7 8 9 10 11 12
| (root) +- src # Groovy source files +- org +- foo +- Bar.groovy # for org.foo.Bar class +- vars +- foo.groovy # for global 'foo' variable +- foo.txt # help for 'foo' variable +- resources # resource files (external libraries only) +- org +- foo +- bar.json # static helper data for org.foo.Bar
|
我们一般需要创建三个目录:
- src:里面用来定义助类
- vars:定义可从流水线访问的全局变量的脚本
- resources:目录允许从外部库中使用
libraryResource 步骤来加载有关的非 Groovy 文件,一般用来放置其他类型文件,如json,yaml或其他ini配置文件等
创建第一个方法
未使用共享库时,在pipeline中用groovy定义方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| def sayHelloWorld(){ println("Hello Worldddddddddd") } pipeline { agent any
stages { stage('Hello') { steps { echo 'Hello World' script { sayHelloWorld() } } } } }
|
尝试把sayHelloWorld函数提取到共享库src助类中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| [root@jenkins-manager ops-share-library]# pwd /usr/local/src/ops-share-library [root@jenkins-manager ops-share-library]# tree . ├── README.md ├── src │ └── io │ └── gitlab │ └── devops │ └── ws │ └── saySomething.groovy └── vars
[root@jenkins-manager ops-share-library]# cat src/io/gitea/devops/ws/saySomething.groovy package io.gitlab.devops.ws; def sayHelloWorld() { println("Hello Worldddddddddd") } def sayHello(name) { println("Hello, ${name}") }
|
此时pipeline为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| // 引入共享库 @Library('ops-share-library@main') _ // 调用src内的函数和方法,需要实例化 def saysomething = new io.gitlab.devops.ws.saySomething()
pipeline { agent any options { timestamps() } stages { stage('Demo') { steps { script { echo 'eeee' saysomething.sayHelloWorld() saysomething.sayHello("xadocker") } } } } }
|
尝试把sayHelloWorld函数提取到共享库中的vars中
1 2 3 4 5 6 7 8 9 10 11 12 13
| [root@jenkins-manager ops-share-library]# pwd /usr/local/src/ops-share-library [root@jenkins-manager ops-share-library]# tree . ├── README.md ├── src │ └── io │ └── gitlab │ └── devops │ └── ws │ └── saySomething.groovy └── vars └── say.groovy
|
此时的pipeline:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| // 引入共享库 @Library('ops-share-library@main') _ // 调用vars中方法不需要实例化,但是要实现call方法 // def saysomething = new io.gitlab.devops.ws.saySomething()
pipeline { agent any options { timestamps() } stages { stage('Demo') { steps { script { echo 'eeee' // saysomething.sayHelloWorld() // saysomething.sayHello("xadocker") say() say("xadocker") } } } } }
|
在vars中调用src助类中的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [root@jenkins-manager ops-share-library]# cat src/io/gitea/devops/ws/myFunc.groovy package io.gitlab.devops.ws;
def Func1() { sh returnStdout: true, script: 'date +%Y%m%d%H%M%S' }
[root@jenkins-manager ops-share-library]# cat vars/myfunc.groovy import io.gitlab.devops.ws.myFunc;
def func1() { new myFunc().Func1() }
|
对应的pipeline如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| // 引入共享库 @Library('ops-share-library@main') _
pipeline { agent any options { timestamps() } stages { stage('Demo') { steps { script { echo 'eeee' // saysomething.sayHelloWorld() // saysomething.sayHello("xadocker") // say() // say("xadocker") def t = myfunc.func1() echo t } } } } }
|