流水线

This chapter covers all recommended aspects of Jenkins Pipeline functionality,including how to:

有关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中很容易对该场景进行建模:

Pipeline Flow

流水线概念

下面的概念是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)

  1. pipeline {
  2. agent any (1)
  3. stages {
  4. stage('Build') { (2)
  5. steps {
  6. // (3)
  7. }
  8. }
  9. stage('Test') { (4)
  10. steps {
  11. // (5)
  12. }
  13. }
  14. stage('Deploy') { (6)
  15. steps {
  16. // (7)
  17. }
  18. }
  19. }
  20. }
1在任何可用的代理上,执行流水线或它的任何阶段。
2定义 "Build" 阶段。
3执行与 "Build" 阶段相关的步骤。
4定义"Test" 阶段。
5执行与"Test" 阶段相关的步骤。
6定义 "Deploy" 阶段。
7执行与 "Deploy" 阶段相关的步骤。

脚本化流水线基础

在脚本化流水线语法中, 一个或多个 node 块在整个流水线中执行核心工作。 虽然这不是脚本化流水线语法的强制性要求, 但它限制了你的流水线的在node块内的工作做两件事:

  • 通过在Jenkins队列中添加一个项来调度块中包含的步骤。 节点上的执行器一空闲, 该步骤就会运行。

  • 创建一个工作区(特定为特定流水间建立的目录),其中工作可以在从源代码控制检出的文件上完成。Caution: 根据你的 Jenkins 配置,在一系列的空闲后,一些工作区可能不会自动清理 。参考JENKINS-2111 了解更多信息。

Jenkinsfile (Scripted Pipeline)

  1. node { (1)
  2. stage('Build') { (2)
  3. // (3)
  4. }
  5. stage('Test') { (4)
  6. // (5)
  7. }
  8. stage('Deploy') { (6)
  9. // (7)
  10. }
  11. }
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)

  1. pipeline { (1)
  2. agent any (2)
  3. stages {
  4. stage('Build') { (3)
  5. steps { (4)
  6. sh 'make' (5)
  7. }
  8. }
  9. stage('Test'){
  10. steps {
  11. sh 'make check'
  12. junit 'reports/**/*.xml' (6)
  13. }
  14. }
  15. stage('Deploy') {
  16. steps {
  17. sh 'make publish'
  18. }
  19. }
  20. }
  21. }

Toggle Scripted Pipeline(Advanced)

Jenkinsfile (Scripted Pipeline)

  1. node { (7)
  2. stage('Build') { (3)
  3. sh 'make' (5)
  4. }
  5. stage('Test') {
  6. sh 'make check'
  7. junit 'reports/**/*.xml' (6)
  8. }
  9. stage('Deploy') {
  10. sh 'make publish'
  11. }
  12. }
1pipeline 是声明式流水线的一种特定语法,他定义了包含执行整个流水线的所有内容和指令的 "block" 。
2agent是声明式流水线的一种特定语法,它指示 Jenkins 为整个流水线分配一个执行器 (在节点上)和工作区。
3stage 是一个描述stage of this Pipeline的语法块。在 Pipeline syntax 页面阅读更多有关声明式流水线语法的stage块的信息。如 above所述, 在脚本化流水线语法中,stage 块是可选的。
4steps 是声明式流水线的一种特定语法,它描述了在这个 stage 中要运行的步骤。
5sh 是一个执行给定的shell命令的流水线 step (由Pipeline: Nodes and Processes plugin提供) 。
6junit 是另一个聚合测试报告的流水线 step (由JUnit plugin提供)。
7node 是脚本化流水线的一种特定语法,它指示 Jenkins 在任何可用的代理/节点上执行流水线 (和包含在其中的任何阶段)这实际上等效于 声明式流水线特定语法的agent

Pipeline Syntax 页面阅读了解更多流水线语法的相关信息。

1. Domain-specific language

2. Source control management

3. Single source of truth

4. Additional plugins have been used to implement complex behaviors utilizing Freestyle Jobs such as the Copy Artifact, Parameterized Trigger, and Promoted Builds plugins

5. GitHub Organization Folder plugin

6. Blue Ocean, 流水线: 阶段查看插件