本博在 Jenkins集成Gitlab实现自动化部署 一文中,利用 Jenkins 集成 GitLab 实现了自动化部署。本文在此基础上使用了更高级的 Pipeline 功能来实现自动化部署。
本质上,Jenkins 是一个自动化引擎,它支持许多自动模式。 Pipeline 向 Jenkins 中添加了一组强大的工具,支持从简单到复杂的持续集成。通过对一系列的相关任务进行建模,用户可以利用流水线的很多特性。Pipeline 是由 groovy 语言编写,支持 Jenkins 2.x 以上版本。相较于传统构建方式,Pipeline 构建方式配置起来简洁明了许多,使用起来非常简单。
阶段,一个 Pipeline 可以划分为若干个 Stage,每个 Stage 代表一组操作。
节点,一个 Node 就是一个 Jenkins 节点,或者是 Master,或者是 Slave,是执行 Step 的具体运行期环境。
步骤,Step 是最基本的操作单元,小到创建一个目录,大到构建一个 Docker 镜像,由各类 Jenkins Plugin 提供。
Pipeline 语法有两种:声明式流水线语法和 脚本化流水线语法;下面的流水线代码骨架说明了两种语法之间的根本差异。
Stage 和 Step 都是声明式和脚本化流水线语法的常见元素。
在声明式流水线语法中,Pipeline 块定义了整个流水线中完成的所有的工作。
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any ①
stages {
stage('Build') { ②
steps {
// ③
}
}
stage('Test') { ④
steps {
// ⑤
}
}
stage('Deploy') { ⑥
steps {
// ⑦
}
}
}
}
① 在任何可用的代理上,执行流水线或它的任何阶段。
② 定义 “Build” 阶段。
③ 执行与 “Build” 阶段相关的步骤。
④ 定义"Test" 阶段。
⑤ 执行与"Test" 阶段相关的步骤。
⑥ 定义 “Deploy” 阶段。
⑦执行与 “Deploy” 阶段相关的步骤。
在脚本化流水线语法中,一个或多个 node 块在整个流水线中执行核心工作。 虽然这不是脚本化流水线语法的强制性要求,但它限制了流水线的在 node 块内做两件事:
(1)通过在 Jenkins 队列中添加一个项来调度块中包含的步骤。 节点上的执行器一空闲, 该步骤就会运行。
(2)创建一个工作区(特定为特定流水间建立的目录),其中工作可以在从源代码控制检出的文件上完成。
Jenkinsfile (Scripted Pipeline)
node { ①
stage('Build') { ②
// ③
}
stage('Test') { ④
// ⑤
}
stage('Deploy') { ⑥
// ⑦
}
}
① 在任何可用的代理上,执行流水线或它的任何阶段。
② 定义 “Build” 阶段。 stage 块在脚本化流水线语法中是可选的。 然而,在脚本化流水 线中实现 stage 块 ,可以清楚的显示Jenkins UI中的每个 stage 的任务子集。
③ 执行与 “Build” 阶段相关的步骤。
④ 定义 “Test” 阶段。
⑤ 执行与 “Test” 阶段相关的步骤。
⑥ 定义 “Deploy” 阶段。
⑦ 执行与 “Deploy” 阶段相关的步骤。
这有一个使用声明式流水线的语法编写的 Jenkinsfile 文件:
Jenkinsfile (Declarative Pipeline)
pipeline { ①
agent any ②
stages {
stage('Build') { ③
steps { ④
sh 'make' ⑤
}
}
stage('Test'){
steps {
sh 'make check'
junit 'reports/**/*.xml' ⑥
}
}
stage('Deploy') {
steps {
sh 'make publish'
}
}
}
}
① pipeline 是声明式流水线的一种特定语法,他定义了包含执行整个流水线的所有内容和指令的 “block” 。
② agent是声明式流水线的一种特定语法,它指示 Jenkins 为整个流水线分配一个执行器 (在节点上)和工作区。
③ stage 是一个描述 stage of this Pipeline的语法块。在 Pipeline syntax 页面阅读更多有关声明式流水线语法的stage
块的信息。如 above所述, 在脚本化流水线语法中,stage 块是可选的。
④ steps 是声明式流水线的一种特定语法,它描述了在这个 stage 中要运行的步骤。
⑤ sh 是一个执行给定的shell命令的流水线 step (由 Pipeline: Nodes and Processes plugin提供) 。
⑥ junit 是另一个聚合测试报告的流水线 step (由 JUnit plugin提供)。
⑦ node 是脚本化流水线的一种特定语法,它指示 Jenkins 在任何可用的代理/节点上执行流水线 (和包含在其中的任何阶段)这实际上等效于 声明式流水线特定语法的agent
。
点击菜单项 “新建任务”,输入任务名称,选中 “流水线”,点击【确定】:
勾选“Build when a change is pushed to GitLab…”,记录下 GitLab webhook URL:http://192.168.1.58:8000/project/test-code-review-pipeline,后面在配置 GitLab webhook 时用到。点击【高级】,生成Secret token,将Secret token 记录下来,后面在配置 GitLab webhook 时用到:
配置流水线有两种方式:Pipeline script 和 Pipeline script from SCM。两种方式的不同在于:Pipeline script 方式直接写脚本;Pipeline script from SCM 方式将脚本存为 Jenkinsfile 文件,并上传 GitLab。Pipeline script 方式的配置如下:
Pipeline script from SCM 方式的配置如下:
可以通过点击【流水线语法】进入流水线语法,生成 Pipeline Script:
点击【流水线语法】后,进行生成 Pipeline Script 操作: