【CI/CD】Jenkins
    Pipeline
    本章涵盖了 Jenkins Pipeline 功能的所有推荐方面,包括如何:
    开始使用 Pipeline - 涵盖如何通过 Blue Ocean经典 UISCM定义一个 Jenkins Pipeline(即您的Pipeline ) ,
    创建和使用 Jenkinsfile - 涵盖有关如何制作和构建您的Jenkinsfile文件,
    使用分支和拉取请求
    使用 Docker 和 Pipeline - 介绍 Jenkins 如何调用代理/节点上的 Docker 容器(从Jenkinsfile文件)来构建您的 Pipeline 项目,
    使用共享库扩展管道
    使用不同的开发工具来更容易地创建你的管道,以及
    使用管道语法- 此页面是所有声明的管道语法的综合参考。
    有关 Jenkins 用户手册中内容的概述,请参阅 用户手册概述

    一、什么是Jenkins Pipeline?
    Jenkins Pipeline(或简称为“Pipeline”,带有大写字母“P”)是一套插件,支持实现和集成持续交付管道到 Jenkins 中。
    持续交付 (CD) 管道是您将软件从版本控制到用户和客户端的过程的自动化表达。对软件的每一次更改(在源代码管理中提交)在发布的过程中都会经历一个复杂的过程。此过程涉及以可靠和可重复的方式构建软件,以及通过多个测试和部署阶段推进构建的软件(称为“构建”)。
    Pipeline 提供了一组可扩展的工具, 通过Pipeline 领域特定语言 (DSL) 语法[ 1 ]对简单到复杂的交付管道“像代码一样”进行建模 。
    Jenkins Pipeline 的定义被写入一个文本文件(称之为 Jenkinsfile),该文件又可以提交到项目的源代码控制存储库。 [ 2 ]这是“管道即代码”的基础;将 CD 管道作为应用程序的一部分进行版本控制和审查,就像任何其他代码一样。
    创建 Jenkinsfile并将其提交到源代码管理可带来许多好处:
    自动为所有分支和拉取请求创建管道构建过程。
    管道上的代码审查/迭代(以及剩余的源代码)。
    管道的审计跟踪。
    管道的单一真实来源 [ 3 ] ,可由项目的多个成员查看和编辑。
    虽然在 Web UI 和Jenkinsfile中使用定义管道的语法是相同的,但通常认为最佳实践是在 Jenkinsfile中定义管道并将其加入到源代码管理中。
    声明式与脚本式管道语法
    Jenkinsfile可以使用两种类型的语法来编写 - 声明式和脚本式。
    声明式管道和脚本式管道的构造根本不同。声明式管道流是 Jenkins 管道流的一个更新的特性:
    提供比脚本式管道语法更丰富的语法特性,并且
    旨在使编写和阅读管道代码更容易。
    许多写在Jenkinsfile中的单独的语法组件(或“步骤”) 对于声明式和脚本式管道都是通用的。
    在下面的管道流概念管道流语法概述中阅读有关这两种语法差异的更多信息。
    为什么是管道?
    Jenkins 从根本上说是一个支持多种自动化模式的自动化引擎。Pipeline 在 Jenkins 上添加了一组强大的自动化工具,支持从简单的持续集成到全面的 CD 管道的用例。通过对一系列相关任务进行建模,用户可以利用 Pipeline 的众多特性:
    代码:管道在代码中实现,通常检查到源代码控制中,使团队能够编辑、审查和迭代他们的交付管道。
    耐用:管道可以在 Jenkins 控制器的计划和计划外重启中幸存下来。
    可暂停:管道可以选择停止并等待人工输入或批准,然后再继续管道运行。
    通用性:管道支持复杂的实际 CD 需求,包括分支/合并、循环和并行执行工作的能力。
    可扩展:Pipeline 插件支持对其 DSL [ 1 ]的自定义扩展以及与其他插件集成的多种选项。
    虽然 Jenkins 一直允许将任意格式的工作以基本格式链接在一起以执行顺序的任务,但 [ 4 ] Pipeline 使这个概念成为 Jenkins 的一等公民。
    基于 Jenkins 的可扩展性核心价值,Pipeline 也可以由拥有管道流共享库的用户和插件开发人员进行扩展。 [ 5 ]
    下面的流程图是在 Jenkins Pipeline 中轻松建模的一个 CD 场景的示例:
    Jenkins - 图1
    管道概念
    以下概念是 Jenkins Pipeline 的关键部分,它们与 Pipeline 语法密切相关(请参阅下面的概述)。
    管道
    管道是一个由用户定义的CD管道模型。管道的代码定义了整个构建的过程,通常包括构建应用程序、测试应用程序和发布应用程序的阶段。
    此外,pipeline代码块是 声明式管道语法的关键部分
    节点
    节点是一台机器,它是 Jenkins 环境的一部分,能够执行管道。
    此外,node代码块是 脚本式管道流语法的关键部分
    阶段
    stage代码块定义了整个管道上不同子集的执行任务的概念(例如“构建”、“测试”和“部署”阶段),许多插件使用它来可视化或呈现 Jenkins 管道流状态/进度 。[ 6 ]
    步骤
    一个单一的任务。从根本上说,一个步骤告诉Jenkins在特定时间点需要做什么(或过程中的“步骤”)。例如,要执行 shell 命令make使用sh步骤:sh ‘make’。当插件扩展 Pipeline DSL 时,[1]这通常意味着插件已经实现了一个新步骤。
    管道语法概述
    以下管道流代码框架说明了声明式管道流语法脚本式管道流语法之间的根本区别。
    请注意,阶段步骤(上面的)是声明式和脚本式管道语法的共同元素。
    声明式管道基础
    在声明式管道语法中,pipeline代码块定义了整个管道中完成的所有工作。

    TypeScript
    Jenkinsfile (Declarative Pipeline)
    pipeline {
    agent any 1️⃣
    stages {
    stage(‘Build’) { 2️⃣
    steps {
    // 3️⃣
    }
    }
    stage(‘Test’) { 4️⃣️️
    steps {
    // 5️⃣
    }
    }
    stage(‘Deploy’) { 6️⃣
    steps {
    // 7️⃣
    }
    }
    }
    }

    在任意可用代理上执行此管道或其任何阶段。
    定义“构建”阶段。
    执行一些与“构建”阶段相关的步骤。
    定义“测试”阶段。
    执行一些与“测试”阶段相关的步骤。
    定义“部署”阶段。
    执行一些与“部署”阶段相关的步骤。
    脚本式管道基础
    在脚本式管道流语法中,一个或多个node代码块在整个管道流中完成核心工作。尽管这不是脚本式管道流语法的强制性要求,但将 Pipeline 的工作限制在node代码块内会做两件事:
    通过将项目添加到 Jenkins 队列来安排代码块中包含的步骤以运行。一旦节点上的执行器有空闲,这些步骤就会运行。
    创建一个工作区(针对于特定管道的目录),可以在其中对从源代码管理签出的文件进行工作。
    警告:根据您的 Jenkins 配置,某些工作区在一段时间不活动后可能不会自动清理。有关更多信息,请参阅JENKINS-2111链接的贴子和讨论 。

    JavaScript
    Jenkinsfile (Scripted Pipeline)
    node { 1️⃣
    stage(‘Build’) { 2️⃣
    // 3️⃣
    }
    stage(‘Test’) { 4️⃣
    // 5️⃣
    }
    stage(‘Deploy’) { 6️⃣
    // 7️⃣
    }
    }

    任何可用代理上执行此管道或其任何阶段。
    定义“构建”阶段。stage块在脚本管道语法中是可选的。但是,stage在 Scripted Pipeline 中实现块可以更清晰地显示 Jenkins UI 中每个“阶段”的任务/步骤子集。
    执行一些与“构建”阶段相关的步骤。
    定义“测试”阶段。
    执行一些与“测试”阶段相关的步骤。
    定义“部署”阶段。
    执行一些与“部署”阶段相关的步骤。
    管道示例
    这是Jenkinsfile使用声明式管道语法的示例 - 可以通过单击下面的切换脚本式管道链接访问其脚本式语法的等效项:

    TypeScript
    Jenkinsfile (Declarative Pipeline)
    pipeline { 1️⃣
    agent any 2️⃣
    options {
    skipStagesAfterUnstable()
    }
    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’
    }
    }
    }
    }

    切换脚本式管道 (高级)
    pipeline是声明性流水线特定的语法,它定义了一个“块”,其中包含用于执行整个流水线的所有内容和指令。
    agent是声明式流水线特定的语法,它指示 Jenkins 为整个流水线分配一个执行器(在一个节点上)和工作空间。
    stage是描述此 Pipeline 阶段的语法块。在管道语法页面上阅读有关stage代码在声明式管道语法中的更多信息。如上所述,stage代码块在脚本式管道语法中是可选的。
    steps是声明式管道特定的语法,描述了在这个stage中运行的步骤。
    sh是管道step中给定 shell 执行命令(由 Pipeline: Nodes and Processes 插件提供)。
    junit是另一个管道step用来聚合测试报告的(由 JUnit 插件提供)。
    node是脚本化流水线特定的语法,它指示 Jenkins 在任何可用的代理/节点上执行此流水线(以及其中包含的任何阶段)。这实际上等效于声明式管道特定语法中的agent。
    管道语法页面上阅读有关管道语法的更多信息。

    参考:
    领域特定语言
    源代码控制管理
    单一事实来源
    额外的插件利用 Freestyle Jobs 实现复杂的行为,例如 Copy Artifact、Parameterized Trigger 和 Promoted Builds 插件
    GitHub 组织文件夹插件
    Blue Ocean , Pipeline: Stage View 插件

    二、管道入门
    前提条件
    要使用 Jenkins Pipeline,您需要:
    Jenkins 2.x 或更高版本( 1.642.3 的旧版本可能有效,但不推荐)
    管道插件,[ 2 ] ,作为“建议插件”的一部分安装(在安装 Jenkins 后通过运行安装后的设置向导时进行指定)。
    管理插件中阅读有关如何安装和管理插件的更多信息 。
    定义管道
    声明式和脚本式管道都是 DSL [ 1 ],用于描述软件交付管道的各个部分。脚本式管道是用限定的 Groovy 语法形式编写的。
    本文档将根据需要介绍 Groovy 语法的相关组件,因此虽然了解 Groovy 是有帮助的,但对于使用Pipeline并不是必需的。
    可以通过以下方式之一创建管道:
    通过 Blue Ocean - 在 Blue Ocean 中设置 Pipeline 项目后,Blue Ocean UI 可帮助您编写 PipelineJenkinsfile并将其提交到源代码管理。
    通过经典 UI - 你可以通过经典 UI 直接在 Jenkins 中输入一个基本的管道流。
    在 SCM中 - 您可以手动编写一个Jenkinsfile ,您可以将其提交到项目的源代码控制存储库。 [ 3 ]
    使用任何一种方法定义管道流的语法是相同的,虽然 Jenkins 支持将流水线直接输入到经典 UI 中,但通常认为最佳实践是定义管道流在Jenkinsfile中,然后 Jenkins 将直接从源代码控制中加载该管道流。
    通过Blue Ocean
    如果您是 Jenkins Pipeline 的新手,Blue Ocean UI 可以帮助您 设置您的 Pipeline 项目,并通过图形化的 Pipeline 编辑器自动为您创建和编写您的 Pipeline(即Jenkinsfile)。
    作为在 Blue Ocean 中设置 Pipeline 项目的一部分,Jenkins 配置了与项目源代码控制存储库安全且经过适当身份验证的连接。因此,您对通过Blue Ocean 编辑器对Jenkinsfile所做的任何更改都会自动保存并提交到源代码管理中。
    Blue Ocean章节和 Blue Ocean入门页面中阅读有关 Blue Ocean 的更多信息。
    通过经典UI
    使用经典 UI 创建的Jenkinsfile由 Jenkins 本身存储(在 Jenkins 主目录中)。
    通过 Jenkins 经典 UI 创建基本管道流:
    如果需要,请确保您已登录 Jenkins。
    在 Jenkins 主页(即 Jenkins 经典 UI 的 Dashboard)中,单击左上角的New Item 。
    Jenkins - 图2
    输入项目名称字段中,指定新管道项目的名称。
    注意: Jenkins 使用此项目名称在磁盘上创建目录。建议避免在项目名称中使用空格,因为这样做可能会发现脚本中无法正确处理目录路径中的空格的错误。
    向下滚动并单击Pipeline,然后单击页面末尾的OK以打开 Pipeline 配置页面(已选择其General选项卡)。
    Jenkins - 图3
    单击页面顶部 的Pipeline选项卡以向下滚动到Pipeline部分。
    注意:如果您要定义Jenkinsfile到源代码控制中,请按照下面的In SCM中的说明进行操作。
    Pipeline部分中,确保Definition字段指向 Pipeline script选项。
    Script文本区域中输入您的管道代码。
    例如,复制以下声明式示例管道代码(在 Jenkinsfile (…)标题下方)或其脚本式的等效版本并将其粘贴到Script文本区域。(下面的声明式示例在此过程的其余部分中使用。)

    TypeScript
    Jenkinsfile (Declarative Pipeline)
    pipeline {
    agent any 1️⃣
    stages {
    stage(‘Stage 1’) {
    steps {
    echo ‘Hello world!’ 2️⃣
    }
    }
    }
    }

    1)agent指示 Jenkins 为整个管道流分配一个执行器(在 Jenkins 环境中的任何可用代理/节点上)和工作区。
    2)echo在控制台输出中写入简单字符串。
    3)node与agent(上面)的作用相同。
    Jenkins - 图4
    注意:您还可以从Script 文本区域右上角的try sample Pipeline选项中选择预制的脚本式管道示例。请注意,该字段没有可用的预制的声明式管道示例。
    单击Save以打开管道项目/项目视图页面。
    在此页面上,单击左侧的Build Now以运行 Pipeline
    Jenkins - 图5
    在左侧的Build History单击#1以访问此特定 Pipeline 运行的详细信息。
    单击Console Output以查看管道运行的完整输出。以下输出显示了管道的成功运行。
    Jenkins - 图6
    注意:
    您还可以通过单击构建编号(例如#1)左侧的彩色球直接从仪表板访问控制台输出。
    通过经典 UI 定义管道便于测试管道代码片段,或处理简单的管道或不需要从存储库签出/克隆源代码的管道。如上所述,与您通过 Blue Ocean()或源代码管理()定义的Jenkinsfile不同,输入到 Pipeline 项目的Script文本区域的Jenkinsfile 由 Jenkins存储在 Jenkins 主目录中。因此,为了更好地控制和灵活地控制您的 Pipeline,特别是对于可能变得复杂的源代码控制项目,建议您使用 Blue Ocean源代码控制来定义您的Jenkinsfile.
    通过SCM(软件配置管理)
    复杂的管道很难在管道配置页面的 经典 UI 脚本文本区域中编写和维护。
    为了使这更容易,您的管道的Jenkinsfile可以在文本编辑器或集成开发环境 (IDE) 中编写,并提交到源代码控制[ 3 ](可选择使用 Jenkins 将构建的应用程序代码)。然后,Jenkins 可以从源代码控制中检出你的Jenkinsfile作为您的管道项目构建过程的一部分,然后继续执行您的管道。
    要将 Pipeline 项目配置为从源代码控制中使用Jenkinsfile:
    按照上述过程 通过经典 UI定义您的流水线,直到您到达第 5 步(访问流水线配置页面上的Pipeline部分)
    Definition字段中,选择Pipeline script from SCM选项。
    SCM字段中,选择包含您的Jenkinsfile的存储库的源代码控制系统类型。
    填写您的存储库的源代码控制系统的特地字段。
    提示:如果您不确定要为给定字段指定什么值,请单击其右侧的? 图标了解更多信息。
    Script Path字段,指定你的Jenkinsfile的位置(和名称)。这个位置是 Jenkins 签出/克隆包含你Jenkinsfile的存储库的位置,它应该与存储库的文件结构相匹配。此字段的默认值为假设你的Jenkinsfile名称为“Jenkinsfile”并且位于存储库的根目录中。
    当您更新指定的存储库时,只要为流水线配置了 SCM 轮询触发器,就会触发新的构建。
    提示:由于管道代码(尤其是脚本式管道)是用类似Groovy的语法编写的,如果您的 IDE 没有对您的Jenkinsfile正确地高亮语法,尝试在Jenkinsfile的顶部插入#! /usr/bin/env groovy,[4]footnotergroovy_shebang:[Shebang line (Groovy syntax)]可以纠正这个问题。
    内置文档
    Pipeline 带有内置的文档功能,可以更轻松地创建各种复杂性的 Pipelines。这个内置文档是根据 Jenkins 实例中安装的插件自动生成和更新的。
    内置文档可在${YOUR_JENKINS_URL}/pipeline-syntax全局范围内找到。对于任何已配置的 Pipeline 项目,相同的文档也链接在侧边栏的Pipeline Syntax
    Jenkins - 图7
    片段代码生成器(Snippet Generator)
    内置的“片段代码生成器”功能有助于为各个步骤创建代码块、发现插件提供的新步骤或为特定步骤尝试使用不同的参数。
    Snippet Generator 会动态填充 Jenkins 实例可用的步骤列表。可用步骤的数量取决于安装的插件,这些插件明确公开了在 Pipeline 中使用的步骤。
    要使用片段代码生成器生成一个步骤的代码片段:
    从配置好的Pipeline或者在${YOUR_JENKINS_URL}/ pipeline - Syntax上导航到Pipeline语法链接(上面提到过)。
    Sample Step下拉菜单中选择所需的步骤
    使用Sample Step下拉列表下方的动态填充区域来配置所选步骤。
    单击Generate Pipeline Script创建一个 Pipeline 片段,可以将其复制并粘贴到 Pipeline 中。
    Jenkins - 图8
    要访问有关所选步骤的其他信息和/或文档,请单击帮助图标(上图红色箭头所指)。

    全局变量引用(Global Variable Reference)
    除了仅用于步骤的 Snippet Generator 之外,Pipeline 还提供了内置的“全局变量引用”。与 Snippet Generator 一样,它也由插件动态填充。然而,与 Snippet Generator 不同的是,全局变量引用仅包含 Pipeline 或插件提供的变量的文档,这些变量可用于 Pipelines。
    Pipeline 中默认提供的变量有:
    env
    公开环境变量,例如: env.PATH或env.BUILD_ID。有关Pipeline 中可用的完整且最新的环境变量列表,请参阅${YOUR_JENKINS_URL}/pipeline-syntax/globals#env中内置的全局变量引用 。
    params
    公开所有为 Pipeline 定义的参数为只读 Map,例如:params.MY_PARAM_NAME。
    currentBuild
    可用于发现有关当前正在执行的 Pipeline 的信息,作为属性,例如:currentBuild.result,currentBuild.displayName。请在${YOUR_JENKINS_URL}/pipeline-syntax/globals中查阅内置的全局变量引用,以获取currentBuild上可用的完整且最新的属性列表。
    声明式指令生成器
    虽然片段代码生成器有助于为脚本式管道或声明式管道中的stage中的steps代码块生成步骤,但它不包括用于定义声明式管道的sectionsdirectives。“声明性指令生成器”功能则用于此。与Snippet Generator类似,Directive Generator允许您选择声明式指令,在表单中对其进行配置,并为该指令生成配置,然后您可以在声明式管道中使用该配置。
    要使用声明式指令生成器生成声明式指令:
    从配置的 Pipeline导航到Pipeline Syntax链接(如上所述),然后单击侧面板中的Declarative Directive Generator链接,或直接转到${YOUR_JENKINS_URL}/directive-generator。
    在下拉菜单中选择所需的指令
    使用下拉列表下方的动态填充区域来配置所选指令。
    单击Generate Directive以创建指令的配置以复制到您的管道中。
    指令生成器可以为嵌套指令生成配置,例如when指令内的条件,但它不能生成管道步骤。对于包含步骤的指令的内容,例如stage 中的steps或者是条件比如always或者post中的failure,指令生成器会添加一个占位符注释。您仍然需要手动向您的管道添加步骤。

    JavaScript
    Jenkinsfile (Declarative Pipeline)
    stage(‘Stage 1’) {
    steps {
    // One or more steps need to be included within the steps block.
    }
    }

    延伸阅读
    本节仅触及 Jenkins Pipeline 可以完成的工作的表面,但应该为您开始尝试使用 Jenkins 实例提供了足够的基础。
    在下一部分Jenkinsfile中,将讨论更多管道步骤以及成功实现的真实的 Jenkins 管道模式。
    其它资源
    Pipeline Steps Reference,包含 Jenkins 更新中心中分布的插件提供的所有步骤。
    Pipeline Examples,一个由社区收集的可复制的 Pipeline 示例集合。

    参考:
    Domain-specific language(领域特定语言)
    Pipeline plugin(管道插件)
    Source control management(源代码控制管理)
    Shebang (general definition))(Shebang(一般定义))

    三、使用Jenkinsfile
    本节以Pipeline 入门中介绍的信息为基础 ,介绍了更多有用的步骤、常见模式,并演示了一些重要的Jenkinsfile示例。
    创建一个被检入源代码控制 [ 1 ]的 Jenkinsfile,提供了许多直接的好处:
    管道上的代码审查/迭代
    管道的审计跟踪
    管道的单一真实来源 [ 2 ] ,可由项目的多个成员查看和编辑。

    创建 Jenkinsfile
    正如在SCM中定义Pipline中所讨论的,Jenkinsfile是一个文本文件,其中包含了Jenkins Pipeline的定义,并且被检入到了源码控制中。讨论以下实现了基础的3个阶段的持续交付管道的Pipeline。

    | TypeScript
    Jenkinsfile (Declarative Pipeline)
    pipeline {
    agent any

    1. stages {<br /> stage('Build') {<br /> steps {<br /> echo 'Building..'<br /> }<br /> }<br /> stage('Test') {<br /> steps {<br /> echo 'Testing..'<br /> }<br /> }<br /> stage('Deploy') {<br /> steps {<br /> echo 'Deploying....'<br /> }<br /> }<br /> }<br />} |

    | —- |

    不是所有的Pipeline都具有相同的3个阶段,但对于大多数项目来说都是一个好的开始。下面的章节将演示在 Jenkins 的测试装置中创建和执行一个简单的管道。
    注:假设已经为项目设置了一个源代码控制存储库,并且已经按照这些说明在 Jenkins 中定义了一个管道。
    使用一个文本编辑器,最好是支持 Groovy语法高亮的,在项目的根目录中创建一个新的Jenkinsfile。
    上面的声明式管道示例包含实现持续交付管道的最低要求的结构。代理指令是必需的,它指示 Jenkins 为管道分配一个执行器和工作区。如果没有agent指令,声明式管道不仅无效,而且无法完成任何工作!默认情况下,agent指令确保源码存储库已签出并可用于后续阶段的步骤。
    对于有效的声明式管道stage 指令steps 指令也是必须的,因为它们指示 Jenkins 执行什么以及应该在哪个阶段执行。
    对于脚本式Pipeline的更高级用法,上面示例的node是关键的第一步,因为它为 Pipeline 分配了执行器和工作区。本质上,没有node, Pipeline 不能做任何工作!从node内部开始,首要任务是检出该项目的源代码。由于Jenkinsfile直接从源代码控制中提取,Pipeline 提供了一种快速简便的方法来访问源代码的正确版本。

    Nginx
    Jenkinsfile (Scripted Pipeline)
    node {
    checkout scm 1️⃣
    / .. snip .. /
    }

    1、checkout步骤将从源代码管理中检出代码;scm 是一个特殊变量,它指示checkout步骤克隆触发此管道运行的特定版本。

    构建
    对于许多项目来说,管道中“工作”的开始将会是“构建”阶段。通常,管道的这个阶段是源代码汇编、编译或打包的地方。它不是Jenkinsfile现有构建工具(如:GNU/Make、Maven、Gradle 等)的替代品,而是可以被视为绑定项目开发生命周期(构建、测试、部署等)的多个阶段的粘合剂。
    Jenkins 有许多插件可以调用几乎所有通用的构建工具,但这个示例将简单地从 shell 步骤 ( sh)调用make 。sh步骤假定系统是基于 Unix/Linux 的,对于基于 Windows 的系统,可以用bat代替。

    | TypeScript
    Jenkinsfile (Declarative Pipeline)
    pipeline {
    agent any

    1. stages {<br /> stage('Build') {<br /> steps {<br /> sh 'make' 1️⃣<br /> archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true 2️⃣ <br /> }<br /> }<br /> }<br />} |

    | —- |

    1、sh步骤调用make命令,并且仅在命令返回一个退出代码零时才会继续。任何非零的退出代码都会使管道失败。
    2、archiveArtifacts捕获匹配具有包含 ( */target/.jar)格式的构建后的文件并将它们保存到 Jenkins 控制器以供后续检索。
    注:归档构件不能作为所使用的外部构件存储库的替代,如 Artifactory 或 Nexus,仅应考虑用于基本的报告和文件的归档。

    测试
    运行自动化测试是所有成功的持续交付流程的关键组成部分。因此,Jenkins 有许多由许多插件提供的测试记录、报告和可视化工具。从根本上说,当测试失败时,让 Jenkins 记录失败以用于在 Web UI 中报告和可视化是很有用的。下面的示例使用JUnit 插件提供的junit步骤 。
    在下面的示例中,如果测试失败,管道将被标记为“不稳定”,如 Web UI 中的黄色球所示。根据记录的测试报告,Jenkins 还可以提供历史趋势分析和可视化。

    | TypeScript
    Jenkinsfile (Declarative Pipeline)
    pipeline {
    agent any

    1. stages {<br /> stage('Test') {<br /> steps {<br /> /* `make check` returns non-zero on test failures,<br /> * using `true` to allow the Pipeline to continue nonetheless<br /> */<br /> sh 'make check &#124;&#124; true' 1️⃣<br /> junit '**/target/*.xml' 2️⃣<br /> }<br /> }<br /> }<br />} |

    | —- |

    1、使用内联 shell 条件 ( sh ‘make check || true’) 可确保该 sh步骤始终返回退出代码:零,从而使junit 步骤有机会捕获和处理测试报告。下面的处理失败部分更详细地介绍了替代方案。
    2、junit捕获并关联匹配包含 ( */target/.xml) 格式的 JUnit XML 文件。

    部署
    部署可能意味着各种步骤,具体取决于项目或组织的要求,并且可能是从将构建的工件发布到 Artifactory 服务器到将代码推送到生产系统的任何步骤。
    在示例管道的这个阶段中,“构建”和“测试”阶段都已成功执行。本质上,“部署”阶段只会在之前的阶段成功完成的情况下执行,否则管道会提前退出。

    | TypeScript
    Jenkinsfile (Declarative Pipeline)
    pipeline {
    agent any

    1. stages {<br /> stage('Deploy') {<br /> when {<br /> expression {<br /> currentBuild.result == null &#124;&#124; currentBuild.result == 'SUCCESS' 1️⃣<br /> }<br /> }<br /> steps {<br /> sh 'make publish'<br /> }<br /> }<br /> }<br />} |

    | —- |

    1、访问currentBuild.result变量允许 Pipeline 确定是否有任何测试失败。如果有的话,管道将标记为 UNSTABLE(不稳定)。
    假设在示例 Jenkins Pipeline 中一切都已成功执行,每次成功的 Pipeline 运行都将归档相关的构建工件、报告测试结果和完整的控制台输出,所有这些都在 Jenkins 中。
    脚本化管道可以包括条件测试(如上所示)、循环、try/catch/finally 块甚至函数。下一节将更详细地介绍这种高级脚本化管道语法。
    使用您的Jenkinsfile
    使用环境变量
    设置环境变量
    动态设置环境变量
    处理凭证
    用于机密文本、用户名和密码以及机密文件
    密文文本
    用户名和密码
    机密文件
    其它凭证类型
    一步合并凭证
    字符串插值
    敏感环境变量的插值
    通过插值注入
    处理参数
    处理失败
    使用多个代理
    可选步骤参数
    高级脚本流水线
    并行执行