03. CI/CD - Jenkins Groovy(基本语法)
Groovy
Groovy 是一种基于 Java 平台的面向对象语言。在 Jenkins Pipeline 中通常用它来增强 Pipeline 的功能。
详细的语法可以参考:
字符串(String)
// 定义全局变量
num = 1
job_name = "Devops-demo-test"
pipeline {
agent any
stages {
stage('字符串类型') {
steps {
script {
// 输出变量,能够直接使用,不需要 $ 符号
println(num)
println(job_name)
// 定义局部变量并赋值
times = num
// 想要拼接内容,就需要用到 $ 引用变量
println("数字:${times}")
// 判断字符串开头结尾
println(job_name.startsWith("Dev"))
println(job_name.endsWith("test"))
// 转换成大小写
println(job_name.toUpperCase())
println(job_name.toLowerCase())
// 获取字符串长度
println(job_name.length())
println(job_name.size())
// 判断是否包含某个值,返回 true 或者 false
println(job_name.contains("Dev"))
println(job_name.contains("test"))
}
}
}
}
}
列表(list)
pipeline {
agent any
stages {
stage('列表类型') {
steps {
script {
job_name = "Devops-demo-test"
// 字符串切割,如果没有 toString 方法,返回的是 [Ljava.lang.String;@4554617c 格式的数据
job_list = job_name.split("-").toString()
// 打印列表
println(job_list)
// 自己定义列表
languages = ["python", "java", "golang"]
// 打印列表
println(languages)
// 获取列表中的元素
println("获取列表中的元素")
println(languages[0])
println(languages.get(0))
// 获取列表长度
println("获取列表长度")
println(languages.size())
// 判断列表是否为空
println("判断列表是否为空")
println(languages.isEmpty())
// 列表排序,会影响原始列表
println("列表排序")
println(languages.sort())
println(languages)
// 列表翻转,不会影响原始列表
println("列表翻转")
println(languages.reverse())
println(languages)
// 给列表添加元素
println("给列表添加元素")
languages.add("c")
println(languages)
// 判断列表是否包含元素
println("判断列表是否包含元素")
println(languages.contains("c"))
// 从列表中删除最后一个元素
println("从列表中删除最后一个元素")
println(languages.pop())
println(languages)
// 从列表中删除指定元素
println("从列表中删除指定元素")
println(languages.remove("python"))
println(languages)
}
}
}
}
}
映射(Map)
pipeline {
agent any
stages {
stage('Map 映射类型') {
steps {
script {
userInfo = ["id": 1, "name": "Dylan"]
// 输出
println(userInfo)
// 获取指定 Key 的值
println(userInfo["id"])
println(userInfo.id)
// 给 key 重新赋值
userInfo["name"] = "hello"
println(userInfo)
// 判断是否包含某个 Key
println(userInfo.containsKey("name"))
// 判断是否包含某个值
println(userInfo.containsValue("hello"))
// 获取所有 key,生成列表
println(userInfo.keySet())
// 移除某个 key
userInfo.remove("id")
println(userInfo)
}
}
}
}
}
条件判断(if / switch)
branchName = "test"
pipeline {
agent any
stages {
stage('条件判断') {
steps {
script {
// if
if (branchName == "dev") {
println("deploy dev")
} else if (branchName == "prod") {
println("deploy prod")
} else {
println("error")
}
// switch
switch(branchName) {
case "dev":
println("deploy dev")
break
case "prod":
println("deploy prod")
break
default:
println("error")
}
}
}
}
}
}
循环遍历(for/times/while)
pipeline {
agent any
stages {
stage('循环遍历') {
steps {
script {
users = [
["id": 1, "name": "hello"],
["id": 2, "name": "world"],
["id": 3, "name": "jenkins"]
]
names = []
// for 循环
for (i in users) {
println(i.id)
println(i.name)
// 将数据添加到列表
names.add(i.name)
}
// 打印数据
println(names)
// times 循环指定次数
3.times {
println("hello world")
}
// 获取索引
3.times {
i->
println(i)
}
// while 循环
a = 1
while(a < 5) {
println("while demo")
a++
}
}
}
}
}
}
异常处理(try/catch/finally)
pipeline {
agent any
stages {
stage('异常处理') {
steps {
script {
try {
println("hello world")
// 这里会报错
println(hello)
} catch(e) {
// 打印错误信息
println(e)
// 抛出异常,会在所以执行完成后抛出
error "异常是:${e}"
} finally {
println("处理完成")
}
}
}
}
}
}
函数(def)
users = [
["id": 1, "name": "hello"],
["id": 2, "name": "world"],
["id": 3, "name": "jenkins"],
]
pipeline {
agent any
stages {
stage('函数') {
steps {
script {
// 调用函数
name = GetNameById(4)
if (name == "null") {
println("你所查找的用户不存在")
} else {
println(name)
}
}
}
}
}
}
// 函数定义
def GetNameById(id) {
for (i in users) {
if (i.id == id) {
return i.name
}
}
return "null"
}
共享库
通过使用函数知道了可以在 Pipeline 中将很多公共方法抽离出来复用。但是这样的复用也只是单文件的复用。
这样会存在一个问题,随着功能的增加,这个单文件会越开越大。为了解决这个问题,就需要用到共享库的概念。
使用共享库需要用到 GitLab,由于本文是自己测试,就没用私有化部署的 GitLab,如果是公司产品,一定要注意。
创建一个项目,我这里叫 jenkinslib
:
README 可以根据自己需求看是否需要。
项目目录结构设计:
jenkinslib/
├── resources
├── src
│ └── org
│ └── devops
└── vars
目录说明:
src
:一般用于存放相关方法的包。resources
:一般用于存放资源对象。vars
:一般用于声明一些全局变量。
如图所示:
在 src/org/devops
下面定义一个 tools.groovy
的文件,该文件属于这个项目的 org.devops
包。并在里面定义了一个 GetNameById
函数。
此时就需要去 Jenkins 上面配置共享库:
具体配置如下:
注意,凭据需要自己添加自己 GitLab 的账号密码。
在 Pipeline 中使用共享库:
// 指定 jenkins 共享库
@Library("jenkinslib-devops") _
// 初始化
def libtools = new org.devops.tools()
pipeline {
agent any
stages {
stage('使用共享库') {
steps {
script {
// 调用函数
name = libtools.GetNameById(1)
println(name)
}
}
}
}
}
共享库加载 Resource
Jenkins 提供了读取 resources 下面资源的语法。先在 jenkinslib 项目的 resources 中添加 json 文件:
使用语法生成器加载 Resource:
在 Pipeline 中使用:
@Library("jenkinslib-devops") _
pipeline {
agent any
stages {
stage('使用共享库') {
steps {
script {
// 使用 resources 中的数据
data = libraryResource 'config/data.json'
println(data)
}
}
}
}
}
到此,Groovy 的基本用法就是这些。