什么是groovy
Groovy是一种基于Java平台的编程语言,它是一种动态语言,同时也是一种脚本语言,可以与Java代码相互操作,其语法类似于Java,但是具有更强的灵活性和简洁性。
Groovy与Java之间的交互性非常好,可以直接使用Java的类和库,同时也可以在Java中使用Groovy编写的代码。Groovy提供了很多Java不具备的特性,如闭包、动态类型、DSL等。
Groovy还提供了一些简化Java编程的语法糖,如集合操作、字符串处理、正则表达式等。Groovy还支持元编程,即在运行时修改代码本身。
Groovy广泛应用于Java平台的开发领域,例如Gradle构建工具、Jenkins持续集成工具、Spock测试框架等。同时,Groovy也逐渐被用于Web开发、大数据分析和脚本编写等领域。
为什么要开发共享库
一个公司的不同项目之间可以流程大体相思,对于公共的部分开发成公共资源,省时省力,所以jenkins的核心是pipeline,pipeline的核心是groovy.
groovy语言特性
Groovy 是一种动态语言,它具有以下特性:
- 与 Java 互操作性:Groovy 运行在 JVM 上,可以直接调用 Java 类库,也可以被 Java 调用。因此 Groovy 可以很好地与 Java 代码集成,能够轻松地与现有的 Java 代码进行交互。
- 动态类型:Groovy 支持动态类型,它允许在运行时修改变量类型。这使得 Groovy 编程更加灵活,因为它不需要在编译时指定变量类型。
- 简化的语法:Groovy 具有简化的语法,它可以在很少的代码行中完成很多工作。例如,Groovy 可以省略语句结尾的分号,并且可以使用点符号来访问对象的属性和方法。
- 支持函数式编程:Groovy 支持闭包和函数式编程,它可以通过在代码中传递函数作为参数来简化代码。这使得 Groovy 更适合处理函数式编程任务。
- 字符串处理:Groovy 具有强大的字符串处理能力,它支持使用 GString(Groovy 字符串)来创建动态字符串。GString 可以在字符串中包含变量或表达式,并且这些变量或表达式会在字符串解析时被计算。
groovy基础语法
变量
Groovy中的变量声明可以省略类型,如:
def name = 'Tom'
int age = 18
控制语句
if语句
Groovy中的if语句与Java基本相同,如:
if (score > 90) {
println '优秀'
} else if (score > 60) {
println '及格'
} else {
println '不及格'
}
循环语句
Groovy中的循环语句也与Java基本相同,如:
for (i in 0..9) {
println i
}
while (i < 10) {
println i
i++
}
方法
Groovy中的方法定义也与Java基本相同,如:
def greet(name) {
println "Hello, $name!"
}
字符串
Groovy中的字符串支持使用单引号、双引号和三个单引号来定义,如:
def name = 'Tom'
def desc = "He's a boy."
def html = '''<html>
<head>
<title>Groovy</title>
</head>
<body>
Hello, world!
</body>
</html>'''
列表
Groovy中的列表使用方括号定义,如:
def list = [1, 2, 3]
list.each { println it }
Map
Groovy中的Map使用大括号定义,如:
def map = [name: 'Tom', age: 18]
println map.name
类
Groovy中的类定义与Java类似,如:
class Person {
def name
int age
def sayHello() {
println "Hello, I'm $name, $age years old."
}
}
def tom = new Person(name: 'Tom', age: 18)
tom.sayHello()
jenkins共享库结构
(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 目录应该看起来像标准的 Java 源目录结构。当执行流水线时,该目录被添加到类路径下。
vars 目录定义可从流水线访问的全局变量的脚本。 每个 *.groovy 文件的基名应该是一个 Groovy (~ Java) 标识符, 通常是 camelCased。 匹配 *.txt, 如果存在, 可以包含文档, 通过系统的配置标记格式化从处理 (所以可能是 HTML, Markdown 等,虽然 txt 扩展是必需的)。
这些目录中的 Groovy 源文件 在脚本化流水线中的 “CPS transformation” 一样。
resources 目录允许从外部库中使用 libraryResource 步骤来加载有关的非 Groovy 文件。 目前,内部库不支持该特性。
根目录下的其他目录被保留下来以便于将来的增强。注:src目录必须存在,其他可以没有。
如何使用grooby开发共享库
在Jenkins中使用Groovy开发Pipeline共享库有以下步骤:
- 创建共享库存储库
在代码托管平台(如GitHub、GitLab等)上创建一个新的存储库来存储你的共享库代码。 - 创建共享库目录结构
在存储库中创建以下目录结构:
vars/
yourFunction.groovy
src/
yourPackage/
yourClass.groovy
其中,vars/
目录中存放的是变量和方法定义的脚本,而 src/
目录中存放的是类定义的脚本。
3. 编写共享库脚本
在 vars/
目录中创建一个名为 yourFunction.groovy
的文件,并编写你的函数定义,如下所示:
def call(String param1, String param2) {
echo "Hello ${param1} and ${param2}"
}
在 src/
目录中创建一个名为 yourClass.groovy
的文件,并编写你的类定义,如下所示:
package yourPackage
class YourClass {
def sayHello() {
echo "Hello from YourClass"
}
}
- 提交代码到存储库
将代码提交到存储库并推送到git中。 - 加载共享库
Jenkins Dashboard–>系统管理–>系统配置–>Global Pipeline Libraries
在 Jenkins pipeline 中加载共享库,如下所示:
@Library('your-library-name') _
其中, your-library-name
是你的共享库的名称。在这里, _
是用于加载默认版本的共享库。
7. 调用共享库方法
在 Jenkinsfile 中调用共享库中的方法,如下所示:
yourFunction('John', 'Jane')
def yourClass = new yourPackage.YourClass()
yourClass.sayHello()
如果编写的代码是在vars目录下,使用的时候不需要实例化,如果编写在src目录下需要实例化
以上就是使用Groovy开发Jenkins Pipeline共享库的步骤。记得在开发和使用共享库时遵循最佳实践和安全措施,例如对代码进行测试、使用版本控制等。
7. 版本控制
在共享库开发过程中,建议使用版本控制工具(如Git)来管理代码的版本。在共享库的存储库中,创建一个或多个分支来管理开发、测试和发布不同版本的共享库。确保在每个版本中使用语义化版本控制规则(如1.0.0、1.1.0等),以便其他人能够轻松地识别不同版本的共享库。
8. 测试
与其他软件一样,共享库代码也需要进行测试。编写并运行单元测试、集成测试和端到端测试,以确保共享库代码的质量和可靠性。你可以使用Jenkins自带的测试框架,例如JUnit或Spock,或使用其他流行的测试框架,如JUnit、TestNG或Spock。
9. 共享库的发布和安装
将共享库发布到共享库管理器(如JFrog Artifactory、Sonatype Nexus等)中,以便其他用户可以安装和使用它。为共享库创建文档,包括如何安装、如何使用,以及示例用法。在发布共享库之前,确保共享库符合标准并已进行必要的测试。
10. 共享库的使用
其他用户可以在自己的Jenkinsfile中使用已发布的共享库。他们可以使用 @Library('your-library-name')
来加载共享库,并调用共享库中定义的函数或类。共享库管理器将自动从远程存储库中下载共享库代码,以便用户可以在Jenkins Pipeline中使用它。
jenkins实现CICD有哪几种触发策略
- 手工
- 自动定时(按照固定的周期,每天早上7点跑CICD)
- 自动轮询检查代码仓库,有代码变更,触发CICD
- webhook(勾子,将持续集成系统和代码仓库勾起来)
- 进入代码仓库,找到webhooks功能,把jenkins中路径配置在webhooks中
使用插件为流水线增加构建信息
可以使用插件调用插件中的共享库信息。如增加构建信息,可以jenkins->系统管理->插件管理 搜索插件"description setter"安装插件,插件管理器会将插件下载到jenkins服务器上的系统文件中,并将其安装到jenkins实例中,需要增加构建信息按照如下格式,更改描述信息即可。