流水线
子章节
This chapter covers all recommended aspects of Jenkins Pipeline functionality, including how to:
get started with Pipeline - covers how to define a Jenkins Pipeline (i.e. your
Pipeline
) through Blue Ocean, through the classic UI or in SCM,create and use a
Jenkinsfile
- covers use-case scenarios on how to craft and construct yourJenkinsfile
,work with branches and pull reqeusts,
use Docker with Pipeline - covers how Jenkins can invoke Docker containers on agents/nodes (from a
Jenkinsfile
) to build your Pipeline projects,use different development tools to facilitate the creation of your Pipeline, and
work with Pipeline syntax - this page is a comprehensive reference of all Declarative Pipeline syntax.
有关Jenkins用户手册的内容的概述, 请前往 用户手册概述。
什么是Jenkins的流水线?
Jenkins 流水线 (或简单的带有大写”P”的”Pipeline”) 是一套插件,它支持实现和集成 continuous delivery pipelines 到Jenkins。
_continuous delivery (CD) pipeline_是你的进程的自动表达,用于从版本控制向用户和客户获取软件。 你的软件的每次的变更 (在源代码控制中提交)在它被释放的路上都经历了一个复杂的过程 on its way to being released. 这个过程包括以一种可靠并可重复的方式构建软件, 以及通过多个测试和部署阶段来开发构建好的软件 (c成为 “build”) 。
流水线提供了一组可扩展的工具,通过 Pipeline domain-specific language (DSL) syntax. [1]对从简单到复杂的交付流水线 “作为代码” 进行建模。
对Jenkins 流水线的定义被写在一个文本文件中 (成为 Jenkinsfile
),该文件可以被提交到项目的源代码的控制仓库。 [2] 这是”流水线即代码”的基础; 将CD 流水线作为应用程序的一部分,像其他代码一样进行版本化和审查。 创建 `Jenkinsfile`并提交它到源代码控制中提供了一些即时的好处:
自动地为所有分支创建流水线构建过程并拉取请求。
在流水线上代码复查/迭代 (以及剩余的源代码)。
对流水线进行审计跟踪。
该流水线的真正的源代码 [3], 可以被项目的多个成员查看和编辑。
While定义流水线的语法, 无论是在 web UI 还是在 Jenkinsfile
中都是相同的, 通常认为在`Jenkinsfile` 中定义并检查源代码控制是最佳实践。
声明式和脚本化的流水线语法
Jenkinsfile
能使用两种语法进行编写 - 声明式和脚本化。
声明式和脚本化的流水线从根本上是不同的。 声明式流水线的是 Jenkins 流水线更近的特性:
相比脚本化的流水线语法,它提供更丰富的语法特性,
是为了使编写和读取流水线代码更容易而设计的。
然而,写到`Jenkinsfile`中的许多单独的语法组件(或者 “步骤”), 通常都是声明式和脚本化相结合的流水线。 在下面的 [pipeline-concepts] 和 [pipeline-syntax-overview] 了解更多这两种语法的不同。
Why Pipeline?
本质上,Jenkins 是一个自动化引擎,它支持许多自动模式。 流水线向Jenkins中添加了一组强大的工具, 支持用例 简单的持续集成到全面的CD流水线。通过对一系列的相关任务进行建模, 用户可以利用流水线的很多特性:
Code: 流水线是在代码中实现的,通常会检查到源代码控制, 使团队有编辑, 审查和迭代他们的交付流水线的能力。
Durable: 流水线可以从Jenkins的主分支的计划内和计划外的重启中存活下来。
Pausable: 流水线可以有选择的停止或等待人工输入或批准,然后才能继续运行流水线。
Versatile: 流水线支持复杂的现实世界的 CD 需求, 包括fork/join, 循环, 并行执行工作的能力。
Extensible:流水线插件支持扩展到它的DSL [1]的惯例和与其他插件集成的多个选项。
然而, Jenkins一直允许以将自由式工作链接到一起的初级形式来执行顺序任务, [4] 流水线使这个概念成为了Jenkins的头等公民。
构建一个的可扩展的核心Jenkins值, 流水线也可以通过 Pipeline Shared Libraries 的用户和插件开发人员来扩展。 [5]
下面的流程图是一个 CD 场景的示例,在Jenkins中很容易对该场景进行建模:
流水线概念
下面的概念是Jenkins流水线很关键的一方面 , 它与流水线语法紧密相连 (参考 overview below).
流水线
流水线是用户定义的一个CD流水线模型 。流水线的代码定义了整个的构建过程, 他通常包括构建, 测试和交付应用程序的阶段 。
另外 , pipeline
块是 声明式流水线语法的关键部分.
节点
节点是一个机器 ,它是Jenkins环境的一部分 and is capable of执行流水线。
另外, `node`块是 脚本化流水线语法的关键部分.
阶段
stage
块定义了在整个流水线的执行任务的概念性地不同的的子集(比如 “Build”, “Test” 和 “Deploy” 阶段), 它被许多插件用于可视化 或Jenkins流水线目前的 状态/进展. [6]
步骤
本质上 ,一个单一的任务, a step 告诉Jenkins 在特定的时间点要做_what_ (或过程中的 “step”)。 举个例子,要执行shell命令 ,请使用 sh
步骤: sh 'make'
。当一个插件扩展了流水线DSL, [1] 通常意味着插件已经实现了一个新的 step。
流水线语法概述
下面的流水线代码骨架说明了声明式流水线语法和 脚本化流水线语法之间的根本差异。
请注意 阶段 and 步骤 (上面的) 都是声明式和脚本化流水线语法的常见元素。
声明式流水线基础
在声明式流水线语法中, pipeline
块定义了整个流水线中完成的所有的工作。
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any (1)
stages {
stage('Build') { (2)
steps {
// (3)
}
}
stage('Test') { (4)
steps {
// (5)
}
}
stage('Deploy') { (6)
steps {
// (7)
}
}
}
}
1 | 在任何可用的代理上,执行流水线或它的任何阶段。 |
2 | 定义 “Build” 阶段。 |
3 | 执行与 “Build” 阶段相关的步骤。 |
4 | 定义”Test” 阶段。 |
5 | 执行与”Test” 阶段相关的步骤。 |
6 | 定义 “Deploy” 阶段。 |
7 | 执行与 “Deploy” 阶段相关的步骤。 |
脚本化流水线基础
在脚本化流水线语法中, 一个或多个 node
块在整个流水线中执行核心工作。 虽然这不是脚本化流水线语法的强制性要求, 但它限制了你的流水线的在`node`块内的工作做两件事:
通过在Jenkins队列中添加一个项来调度块中包含的步骤。 节点上的执行器一空闲, 该步骤就会运行。
创建一个工作区(特定为特定流水间建立的目录),其中工作可以在从源代码控制检出的文件上完成。
Caution: 根据你的 Jenkins 配置,在一系列的空闲后,一些工作区可能不会自动清理 。参考 JENKINS-2111 了解更多信息。
Jenkinsfile (Scripted Pipeline)
node { (1)
stage('Build') { (2)
// (3)
}
stage('Test') { (4)
// (5)
}
stage('Deploy') { (6)
// (7)
}
}
1 | 在任何可用的代理上,执行流水线或它的任何阶段。 |
2 | 定义 “Build” 阶段。 stage 块 在脚本化流水线语法中是可选的。 然而, 在脚本化流水线中实现 stage 块 ,可以清楚的显示Jenkins UI中的每个 stage 的任务子集。 |
3 | 执行与 “Build” 阶段相关的步骤。 |
4 | 定义 “Test” 阶段。 |
5 | 执行与 “Test” 阶段相关的步骤。 |
6 | 定义 “Deploy” 阶段。 |
7 | 执行与 “Deploy” 阶段相关的步骤。 |
流水线示例
这有一个使用声明式流水线的语法编写的 Jenkinsfile
文件 - 可以通过点击下面 Toggle Scripted Pipeline 链接来访问它的等效的脚本化语法:
Jenkinsfile (Declarative Pipeline)
pipeline { (1)
agent any (2)
stages {
stage('Build') { (3)
steps { (4)
sh 'make' (5)
}
}
stage('Test'){
steps {
sh 'make check'
junit 'reports/**/*.xml' (6)
}
}
stage('Deploy') {
steps {
sh 'make publish'
}
}
}
}
Toggle Scripted Pipeline (Advanced)
Jenkinsfile (Scripted Pipeline)
node { (7)
stage('Build') { (3)
sh 'make' (5)
}
stage('Test') {
sh 'make check'
junit 'reports/**/*.xml' (6)
}
stage('Deploy') {
sh 'make publish'
}
}
1 | pipeline 是声明式流水线的一种特定语法,他定义了包含执行整个流水线的所有内容和指令的 “block” 。 |
2 | agent 是声明式流水线的一种特定语法,它指示 Jenkins 为整个流水线分配一个执行器 (在节点上)和工作区。 |
3 | stage 是一个描述 stage of this Pipeline的语法块。在 Pipeline syntax 页面阅读更多有关声明式流水线语法的stage 块的信息。如 above所述, 在脚本化流水线语法中,stage 块是可选的。 |
4 | steps 是声明式流水线的一种特定语法,它描述了在这个 stage 中要运行的步骤。 |
5 | sh 是一个执行给定的shell命令的流水线 step (由 Pipeline: Nodes and Processes plugin提供) 。 |
6 | junit 是另一个聚合测试报告的流水线 step (由 JUnit plugin提供)。 |
7 | node 是脚本化流水线的一种特定语法,它指示 Jenkins 在任何可用的代理/节点上执行流水线 (和包含在其中的任何阶段)这实际上等效于 声明式流水线特定语法的agent 。 |
在 Pipeline Syntax 页面阅读了解更多流水线语法的相关信息。
4. Additional plugins have been used to implement complex behaviors utilizing Freestyle Jobs such as the Copy Artifact, Parameterized Trigger, and Promoted Builds plugins