devops Pipeline Doc 中文版-1-Getting-Started-With-Pipeline

rocl · 2017年12月15日 · 最后由 rocl 回复于 2018年09月13日 · 2535 次阅读

对应英文版请参见: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 有很多好处:

  • 自动为所有的分支和 pull requests 创建 Pipelines
  • 在 Pipeline 中进行代码审查和迭代 (review/iteration)
  • Pipeline 的审核和跟踪
  • Pipeline 唯一的真相源 [4: en.wikipediaorg/wiki/Single_Source_of_Truth],可以由项目的多个成员查看和编辑。 定义 Pipeline 的语句,要么在 web UI 中,要么在一个 Jenkinsfile 文件中,一般认为最好的体验是,定义 Pipeline 在 Jenkinsfile 文件中,并且放到源代码版本控制中 (例如 git,svn 等)。 这是一个 Jenkinsfile 文件例子:

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

Why Pipeline?

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

  • Code:Pipeline 是用代码实现,能做版本控制,可以给团队编辑/检查/迭代 Pipeline 的能力。
  • Durable:Pipeline 可以在计划的和未计划的 Jenkins 主机重启中不受影响。
  • Pausable:Pipeline 在继续运行之前,可以选择停止/等待输入或者批准。
  • Versatile:Pipeline 能满足现实世界复杂的持续集成需求,包括并行执行 fork/join/loop。
  • Extensible:Pipeline 插件支持定制化的扩展到它自己的 DSL[2: Domain-Specific Language]。

虽然 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,你会需要:

  • Jenkins 2.x 或者更高版本 (更老版本 1.642.3 可能可以,但是不推荐)
  • Pipeline 插件 [6: Pipeline plugin]

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

定义 Pipeline

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

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

  • Jenkins web UI 上直接输入脚本
  • 创建一个 Jenkinsfile 文件,这个能被放到代码版本控制软件中。

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

在 web UI 中定义一个 Pipeline

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

  • 点击 Jenkins 首页上的” New Item”。

  • 为 Pipeline 输入一个名字,选择 Pipeline,然后点击 OK。

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

  • 在 Script 区域,输入一个 Pipeline,然后点击 Save。

  • 点击” Build Now” 去运行 Pipeline。

  • 点击” build History” 下的 #1,然后点击 Console Output 去查看 Pipeline 完整的输出。

上面的例子展示了一个成功的 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

  • Pipeline Steps Reference, 包含发布插件提供的所有步骤
  • Pipeline Examples,可拷贝社区版的 Pipeline 例子集合。

参考资料:

  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

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 2 条回复 时间 点赞
rocl [Jenkins Pipeline 插件] Pipeline Doc 中文版合集 中提及了此贴 12月18日 10:43
rocl 如何攻破 Web 软件 (How to break web software) 中提及了此贴 05月09日 11:32
仅楼主可见
rocl #4 · 2018年09月13日 Author
刘大头 回复

这句话,我的理解:jenkins 可以有 master 和 agent,他们是通过 agent 连接,master 重启的话并不影响 agent 上的 project 的运行

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册