03. Jenkins - Groovy(基本语法)

发布时间 2023-04-08 16:24:48作者: Dy1an

Groovy

Groovy 是一种基于 Java 平台的面向对象语言。在 Jenkins Pipeline 中通常用它来增强 Pipeline 的功能。

详细的语法可以参考:

https://www.w3cschool.cn/groovy/groovy_overview.html

字符串(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 的基本用法就是这些。