文章目录
-
1 什么是Jenkins管道(流水线)
- 2 什么是持续交付管道?它是如何工作的?
- 3 什么是JenkinsFile?
- 4 实现JenkinsFile的两种语法
-
4.1 声明式(Declarative)
* 4.2 脚本化(Scripted)- 5 为什么使用Jenkins管道?
- 6 Jenkins管道相关概念
- 7 如何创建Jenkins管道
-
7.1 示例1之HelloWorld
* 7.2 示例2之执行Github远程仓库任务- 8 Freestyle与Pipeline区别
- 9 总结
- 10 参考
1 什么是Jenkins管道(流水线)
以下管道和流水线为同指一个概念。
在Jenkins中,管道(Pipeline)是一组事件或任务,它们按顺序相互链接。简单来说,Jenkins Pipeline是一个插件组合,支持使用Jenkins集成和实现持续交付管道。管道具有可扩展的自动化服务器,用于通过管道DSL(特定领域语言)“作为代码”创建简单或复杂的交付管道,即将所有子任务进行流水线化。
Pipeline是Jenkins2.X的最核心的特性,帮助Jenkins实现从CI到CD与DevOps的转变。
2 什么是持续交付管道?它是如何工作的?
在Jenkins管道中,每个任务或事件都至少对一个或多个事件具有某种依赖性。
上图代表Jenkins的连续交付管道。它包含一组称为构建,部署,测试和发布的状态。这些状态彼此相互关联,每个状态都有自己的事件,这些事件按照称为连续交付管道的顺序工作。连续交付管道是一个自动表达式,用于显示获取版本控制软件的过程。因此,软件中所做的每一个更改在发布过程中都会经历许多复杂的过程。它还涉及以可靠和可重复的方式开发软件,以及通过测试和部署的多个阶段对构建的软件进行升级。
在本节中,你将学到:
- 什么是Jenkins管道?
- 什么是JenkinsFile?
- 为什么使用Jenkins管道?
- Jenkins管道相关概念
- 如何创建Jenkins管道?
- 运行Jenkins管道
- 使用Jenkins管道的最佳实践
- Freestyle与Pipeline的区别
3 什么是JenkinsFile?
可以使用名称为JenkinsFile的文本文件定义Jenkins管道。您可以使用JenkinsFile将管道用代码实现,可以通过使用特定领域语言(DSL)来书写代码。使用JenkinsFile,你可以编写运行Jenkins管道所需的步骤。
使用JenkinsFile的好处:
- 你可以为所有分支自动创建管道,并仅使用一个JenkinsFile执行拉取请求。
- 你可以在管道上查看代码
- 你可以审核你的Jenkins管道
- 作为管道的唯一源头,可以由多个用户修改操作
JenkinsFile可以在WEB UI端或者直接使用JenkinsFile来定义。
4 实现JenkinsFile的两种语法
有两种类型的语法用于定义JenkinsFile:声明式(Declarative)与脚本化(Scripted)管道语法。推荐使用声明式语法。
4.1 声明式(Declarative)
Jenkins2.5后支持,声明性管道语法提供了一种创建管道的简便方法。它包含用于创建Jenkins管道的预定义层次结构,它使你能够以简单,直接的方式控制管道执行的所有方面。
特点:
- 最外层必须由pipline{ //do something }来进行包裹
- 不需要分好作为分隔符,每个语句必须在一行内
- 不能直接使用groovy语句(例如循环判断等),需要被script {}包裹
4.2 脚本化(Scripted)
脚本化管道语法在轻量级执行程序的帮助下在Jenkins主机上运行。它使用非常少的资源将管道转换为原子命令。声明式和脚本化语法彼此不同,并且有着完全不同地定义。
特点:
- 最外层有node{}包裹
- 可直接使用groovy语句
5 为什么使用Jenkins管道?
Jenkins是一个开放的持续集成服务器,能够支持软件开发过程的自动化。可以在用例的帮助下创建多个自动化作业,并将它们作为Jenkins管道来运行。
以下是使用Jenkins管道的原因:
- 代码方便:Jenkins管道可以用代码来实现,允许多个用户编辑和执行管道流程
- 可持续性:管道非常强大。如果你的服务器经历了无法预料的重启,管道将自动恢复
- 交互:你可以暂停管道进程并使其等待恢复,直到有来自用户的输入
- 多任务:Jenkins Pipelines支持大项目。你可以运行多个任务(job),甚至可以在循环中使用管道
6 Jenkins管道相关概念
master
Jenkins 安装和运行的地方,它负责解析 job 脚本,处理任务,调度计算资源
agent
负责处理从 master 分发的任务,操作实际上是通过 executor 来执行的。在声明式语法中,agent块为必选。
executor
执行任务的计算资源,它可以在 master 或者 agent 上运行。多个 executor 也可以合作执行一些任务。
Groovy
Groovy 是一门动态语言,支持在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同。声明式Pipeline语法可以使用Groovy语法,脚本式Pipeline语法可以使用大多数Groovy语法。
Pipeline
管道是以代码形式给出的一组指令,用于持续交付,并包含整个构建过程所需的指令。使用管道,你可以构建,测试和交付应用程序。一个Pipeline可以划分成若干个Stage,每个Stage代表一组操作(Build/Test/Deploy)
Node
Jenkins运行的机器称为节点。节点块(a node block)主要用于脚本化管道语法,是Step的具体运行环境,安装有Jenkins的主机默认节点为master
Stage
阶段块(stage block)包含管道中的一系列步骤。也就是说,构建,测试和部署过程都在一个阶段汇集在一起。通常,阶段块用于可视化Jenkins管道过程。在声明式语法中,stages块为必选,stage必须有一个。
Step
Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,步骤只是在定义的时间执行特定进程的单个任务。当一个步骤运行成功时继续运行下一个步骤。 当任何一个步骤执行失败时,Pipeline 的执行结果也为失败。当所有的步骤都执行完成并且为成功时,Pipeline 的执行结果为成功。在声明式语法中,steps块为必选。
其他常用概念和语法(以声明式方式):
-
在 Linux、BSD 和 Mac OS(类 Unix) 系统中的 shell 命令, 对应于 Pipeline 中的一个 sh 步骤(step)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 1// Jenkinsfile (Declarative Pipeline)
2pipeline {
3 agent any
4 stages {
5 stage('Build') {
6 steps {
7 sh 'echo "Hello World"'
8 sh '''
9 echo "Multiline shell steps works too"
10 ls -lah
11 '''
12 }
13 }
14 }
15}
16
17
-
基于 Windows 的系统使用bat步骤表示执行批处理命令。
1
2
3
4
5
6
7
8
9
10
11
12
13 1// Jenkinsfile (Declarative Pipeline)
2pipeline {
3 agent any
4 stages {
5 stage('Build') {
6 steps {
7 bat 'set'
8 }
9 }
10 }
11}
12
13
-
超时,重试,完成时动作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 1// Jenkinsfile (Declarative Pipeline)
2pipeline {
3 agent any
4 stages {
5 stage('Deploy') {
6 steps {
7 // “Deploy”阶段(stage)重复执行 flakey-deploy.sh 脚本3次
8 retry(3) {
9 sh './flakey-deploy.sh'
10 }
11 // 上面执行完成后,然后等待 health-check.sh 脚本最长执行3分钟,超时的话Deploy会失败
12 timeout(time: 3, unit: 'MINUTES') {
13 sh './health-check.sh'
14 }
15 // 重试部署任务 5 次,但是总共花费的时间不能超过 3 分钟
16 timeout(time: 3, unit: 'MINUTES') {
17 retry(5) {
18 sh './flakey-deploy.sh'
19 }
20 }
21 }
22 }
23 }
24 // 当 Pipeline 运行完成时,你可能需要做一些清理工作或者基于
25 // Pipeline 的运行结果执行不同的操作, 这些操作可以放在 post 部分。
26 post {
27 always {
28 // 不管成功与否都会执行
29 echo 'This will always run'
30 }
31 success {
32 echo 'This will run only if successful'
33 }
34 failure {
35 echo 'This will run only if failed'
36 }
37 unstable {
38 echo 'This will run only if the run was marked as unstable'
39 }
40 changed {
41 echo 'This will run only if the state of the Pipeline has changed'
42 echo 'For example, if the Pipeline was previously failing but is now successful'
43 }
44 }
45}
46
47
7 如何创建Jenkins管道
7.1 示例1之HelloWorld
-
首页->New Item->输入项目名称并选择Pipeline类型,然后点击Ok
-
自动跳转到Pipeline项目配置项,Advanced Project Options中输入Pipeline语法任务
-
点击Save,然后点击Build Now,开始执行Pipeline
-
执行成功后,在Build History面板上出现历史操作编号,点击编号可以进入详情
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JReqOjYh-1574051579410)(https://www.xiaobaiai.net/imgs/20191107132715.png)]
7.2 示例2之执行Github远程仓库任务
-
在Git项目中建立Jenkinsfile
1
2
3
4
5
6
7
8
9
10
11
12
13 1pipeline {
2 agent any
3 stages {
4 stage('Build') {
5 steps {
6 sh 'javac HelloWorld.java'
7 sh 'java HelloWorld'
8 }
9 }
10 }
11}
12
13
-
按示例1建立Pipeline项目
-
在项目配置Advanced Project Options面板中设置Pipeline,指定远程仓库
-
点击保存
-
编译并查看记录
8 Freestyle与Pipeline区别
调度方式:
- pipeline:通过结构化pipeline 语法进行调度,易于理解与阅读
- freestyle:通过jenkins api或者cli进行调度
显示方式:
- pipline:提供上帝视角(全局视图)
- freestyle:没有视图
9 总结
本文从零基础介绍了Jenkins的Pipeline及Jenkinsfile相关概念,并通过实例操作去了解如何结合具体项目实现Pipeline项目。读完本篇,相信可以去了解更多的Pipeline操作知识,而且实现更强大更复杂的Pipeline操作,从而简化我们项目开发中的各种流程,提高效率。