基础知识
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续自动的构建/测试软件项目、监控外部任务的运行。通常与版本管理工具构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。同时jenkins提供交互式配置和编码式配置。编码式配置又分为:脚本式语法、声明式语法。 而声明式流水线则更像Jenkins的传统实现方式,在Web表单的预定义字段中输入关键信息,代表了特定目标和预期行为。与传统的Web表单类似,当执行声明式流水线时,每一个段落定义了基于用户输入数据的执行内容和方式。
# 脚本式语法
脚本式流水线更像是一种脚本或编程语言,像其他命令式语言一样可以运行程序和处理逻辑,脚本式语法是Jenkins最开始实现的流水线即代码方式。这是一种命令式风格,也就是在流水线脚本中定义逻辑和程序流程。它也更依赖于Groovy语言和结构,特别是对于错误检查和异常处理来说。
node('worker_node1') {
stage('Source') {
// 从Git仓库中获取代码
git 'git@diyvb2:/home/git/repositories/workshop.git'
}
stage('Compile') {
// 运行Grable 进行编译和单元测试
sh 'grade clean compileJava test'
}
}
2
3
4
5
6
7
8
9
10
优点:
- 更少的代码段落和弱规范要求。
- 更强大的程序代码能力。
- 更像编写代码程序。
- 传统的流水线即代码模型,用户熟悉并向后兼容性。
- 更灵活的自定义代码操作。
- 能够构建更复杂的工作流和流水线。
缺点。
- 普遍要求更高的编程水平。
- 语法检查受限于Groovy语言及环境。
- 和传统Jenkins模型有很大差异。
- 与声明式流水线的实现相比,同一工作流会更复杂。
# 声明式语法
声明式语法(declarative syntax)是Jenkins提供的一种新的选择。声明式风格的流水线代码被编排在清晰的段落中,相对于只关注实现逻辑,这些流水线的主要区域描述(或“声明”)了我们所期望的流水线的状态和输出。
pipeline {
agent { label "worker_node1" }
stages {
# 获取代码
stage('Source') {
steps {
# 从git仓库中获取代码
git "git@diyvb2:/home/git/repositories/workshop.git"
}
steps('Compile') {
steps {
# 运行Gradle进行编译和单元测试
sh "gradle clean compilejava test"
}
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
优点:
- 更结构化,贴近传统的Jenkins Web表单形式。
- 更强大的声明内容能力,高可读性。
- 可以通过Blue Ocean图形化界面自动生成。
- 段落可映射到常见的Jenkins概念,比如通知。
- 更友好的语法检查和错误识别。
- 提升流水线间的一致性。
缺点:
- 对迭代逻辑支持较弱(相比程序而言)。
- 仍在开发完善中(对于传统Jenkins中的部分功能缺乏支持)。
- 更严格的结构(更难实现自定义流水线代码)。
- 目前对于复杂的流水线和工作流难以胜任。
简而言之,对于新用户和希望流水线具备传统Jenkins一样可读性的用户来说,声明式流水线更容易学习和维护。这是以灵活性为代价换取结构不支持的功能。 脚本式流水线更加灵活,提供了“超级用户”的选项,即允许用户不受结构约束实现更多功能。不过,总的来说,任何一种流水线类型对大多数场景而言都同样适用。