对应英文版请参见:https://jenkins.io/doc/book/pipeline/getting-started/
本系列主贴直达:https://testerhome.com/topics/11265

前言 (笔者自己添加部分)

最好的资料莫过于新版官方文档,旧文档不再维护,旧文档请参见这里
所以本文其实是翻译并实践学习 pipeline,对应的 pdf 文档,已上传到 csdn

本文直接从 Pipeline 开始,如果对 Jenkins 不熟悉,请参见 Jenkins 官方文档或者本系列的第一章 Installing Jenkins。

Pipeline

本章将会学习 Jenkins Pipeline 的所有特性,从运行 Pipeline 到写 Pipeline 代码,甚至扩展到 Pipeline 本身。

本章可以被 Jenkins 各个水平的用户使用,但是初学者可能要参考下本书” Using Jenkins” 的章节去理解本章的一些专有名词。

如果还没有熟悉最基本的 Jenkins 技术和特点,请从” Getting Started with Jenkins” 开始。

What is Jenkins Pipeline?

Jenkins Pipeline(或者简单用一个大写字母 P 代替” Pipeline”) 是一套插件,这套插件支持实现和整合持续集成 pipelines(continuous delivery pipelines) 到 Jenkins 中。

持续集成 Pipeline (continuous delivery pipelines) 是一个程序自动进行的过程, 用您的用户和客户的版本控制权获取软件。对软件的每次更改 (在源代码管理中提交) 经过一个复杂的过程, 用它的方式发布软件 (release)。这个过程包括以一个可靠地可重复的方式去构建软件,就像通过测试和发布 (deployment) 的多个步骤去构建 (build) 软件过程一样。

Pipeline 提供一套可扩展的工具集,用代码去模型化简单到复杂的 (simple-to-complex) 发布 pipelines,代码使用 Pipeline Domain Specific Language(DSL) 语法。

通常, Jenkins Pipeline 的定义被写入文本文件 (称为 Jenkinsfile),文件被放到项目的源代码管理存储库中 [3: Source Control Management]。这是 Pipeline 代码 (Pipeline-as-Code) 的基础;把持续集成作为应用的一部分用版本控制,并且像其他代码一样可以 review。创建 Jenkinsfile 有很多好处:

① agent 表明 Jenkins 要为 Pipeline 的这部分分配一个执行器和工作空间。
② stage 表明是这个 Pipeline 的一个 stage。
③ steps 这个 stage 将要运行的一个步骤。
④ sh 执行给与的 shell 语句。
⑤ junit 是一个 Pipeline 步骤,Junit 插件提供用来搜集测试报告。

Why Pipeline?

Jenkins 基本上是一个自动化引擎, 它支持许多自动化模式。Pipeline 添加了一套强有力的自动化工具集到 Jenkins,支持从简单持续集成到综合持续集成的用例,到 Pipeline。通过将一系列相关任务模型化,用户能充分利用 Pipeline 许多特性的优势。

虽然 Jenkins 一直允许基本形式的链接自由式 Jobs[5: Additional plugins have been used to implement complex behaviors utilizing Freestyle Jobs such as the Copy Artifact, Parameterized Trigger, and Promoted Builds plugins],一起执行顺序任务, Pipeline 使这个概念成为 Jenkins 的一流插件。
基于 Jenkins 可扩展的核心价值,Pipeline 同样是可扩展的。
下图是一个持续集成的例子,可以很容易被模型化。

Pipeline 关键字

Step

一个独立的任务;一般来说 steps 告诉 Jenkins 做什么。例如执行 shell 命令,用 sh 执
行 make:sh ‘make’。当插件扩展 Pipeline DSL,这意味着插件能执行一个新的 step。

Node

Pipeline 执行的大多数工作是在一个或多个声明的 Node 的上下文中完成的。限制 Node

步骤内的工作有两点:

(1).将块中包含的 steps,通过向 Jenkins 添加项来运行队列.一旦一个执行器在一个节点上是空闲的, 这些 steps 就会运行。

(2).创建工作区 (特定于该特定 Pipeline 的目录),在工作区里,工作能被完成。

注意:

取决于你的 Jenkins 配置,经过一段时间的不活动时期之后,一些工作区不能被自
动清除。可以查看 JENKINS-2111 得到更多的信息。

Stage

Stage 是定义整个 Pipeline 概念上子集的一个步骤,例如” Build”,” Test”,和” Deploy”,这被许多插件使用来可视化或者表现 pipeline 状态/进度。[5: Blue Ocean, Pipeline Stage View plugin]

开始 Pipeline(Getting Started with Pipeline)

Jenkins Pipeline 是一套支持持续集成的插件。Pipeline 提供扩展的工具,通过 Pipeline DSL 去模型化简单到复杂的代码发布 Pipeline。

本部分介绍一些 Jenkins Pipeline 的基本概念,例如基本的定义,用 Pipeline 执行任务。

前提条件

使用 Jenkins Pipeline,你会需要:

想知道怎样安装和管理,请参见 Managing Plugins。

定义 Pipeline

Pipeline 脚本是用 Groovy 语言撰写。于是本文会介绍一些相关的 Groovy 语法,理解 Groovy 是有帮助的,但并不是必需的。

一个基本的 Pipeline 能按照以下两种方式创建:

用任意方法定义 Pipeline 的语法是相同的, 但 Jenkins 支持将 Pipeline 直接输入到 web UI 中, 通常认为最好的做法是定义在 Jenkinsfile 的 Pipeline, Jenkins 将直接从源代码管理加载。

在 web UI 中定义一个 Pipeline

在 web UI 中创建一个基本的 Pipeline。跟随以下步骤:

注意:Jenkins 用 Pipeline 的名字在硬盘上创建目录。包含空格的 Pipeline 名字可能会有 bugs,脚本并不支持包含空格的路径。

上面的例子展示了一个成功的 Pipeline 运行情况,用了两步。

① node分配一个执行器和工作空间。
② echo在 Console Output 输出字符串。

在 SCM 中定义一个 Pipeline

复杂的 Pipeline 很难在 Pipeline 配置区域去写和维护。为了让这个更容易一些,Pipeline 同样可以用文本编辑器写并放到版本控制中,通过 Pipeline Script from SCM 选项,Jenkins 可以装载 Jenkinsfile 文件。

要做到这一点,当定义一个 Pipeline 时,选择” Pipeline Script from SCM” 选项。

随着” Pipeline Script from SCM” 选项被选择,在 Jenkins 界面上,你不能直接输入任何 Groovy 代码;你只能输入一个源代码路径,从这个路径可以找到 pipeline 文件。当更新代码库的时候,一个新的编译被触发,只要 Pipeline 被配置使用 SCM polling 触发。

提示:

Jenkinsfile 的第一行应该是 #!/usr/bing/env groovy,这样文本编辑器,IDEs,GitHub 等可以按照 Groovy 代码来语法高亮 Jenkinsfile 文件。

内建文档 (Built-in Documentation)

随着 Pipeline 一起发布的内建的文档,使得创建复杂的 Pipelines 更加容易。内建的文档可以根据安装在 Jenkins 实例中的插件,被自动生成和更新。

内建的文档可以通过链接被找到: localhost:8080/pipeline-syntax/。假设你已经有了一个正运行在本地 8080 端口上的实例。同样的文档可以连接到这里,通过任何项目的左边菜单” Pipeline Syntax”。

代码段生成器 (Snippet Generator)

内建的代码段生成器 (Snippet Generator) 功能对于以下功能很有帮助,创建独立步骤地代码,发现插件提供的新步骤,对于一个特定的步骤实验不同的参数。

代码段生成器是动态填充的, 其中列出了可供 Jenkins 使用的步骤。可用的步骤数取决于安装的插件, 它显式地公开了 Pipeline 可使用的步骤。

使用代码生成器,生成步骤

(1).导航到 Pipeline Syntax 链接。

(2).在 Sample Step 下达菜单中,选择需要的步骤。

(3).使用 Sample Step 下拉菜单下面的动态区域去配置选定的步骤。

(4).点击 Gemerate Pipeline Script 生成一个代码段,拷贝到 Pipeline 中。

存取选定步骤的附加信息,点击 Help 按钮 () 上图红色箭头所指部分。

Global Variable Reference

除了代码段生成器 (Snippet Generator) 只能生成步骤之外,Pipeline 同样提供了一个内建的” Global Variable Reference”。像代码段生成器 (Snippet Generator) 一样,它也是被插件动态生成的。不像代码段生成器 (Snippet Generator) 的是,Global Variable Reference 仅仅包含 Pipeline 或者插件提供的变量文档,只对 Pipeline 有效。

Pipeline 默认提供的变量有:

env

环境变量可以被 Pipeline 脚本,例如 env.PATH 或者 env.BUILD_ID。可以到 Global Variable Reference 寻找,到目前为止,完整的,最新的,Pipeline 中可以使用的变量列表。

params

将为 Pipeline 定义的所有参数公开为只读映射, 例如:params.MY_PARAM_NAME

currentBuild

可以被用来发现当前正在执行的 Pipeline 的相关信息,例如 currentBuild.result,currentBuild.displayName 等等。可以到 Global Variable Reference 寻找,到目前为止,完整的,最新的,可以用的 currentBuild 列表。

Further Reading

本章节仅仅只说出了 Jenkins Pipeline 能做的一小部分,但已经为你提供了足够多的基础,去开始实验 Jenkins 实例。

下一节 Jenkinsfile,更多的 Pipeline 步骤将被讨论。

Additional Resources

参考资料:

  1. https://jenkins.io/doc/book/pipeline/
  2. https://en.wikipedia.org/wiki/Domain-specific_language
  3. https://en.wikipedia.org/wiki/Version_control
  4. https://en.wikipedia.org/wiki/Single_source_of_truth
  5. https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Stage+View+Plugin
  6. https://plugins.jenkins.io/workflow-aggregator
  7. ../managing/plugins.pdf

本系列主贴直达:https://testerhome.com/topics/11265


↙↙↙阅读原文可查看相关链接,并与作者交流