Jenkins 2.x实践指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.7 pipeline内置基础步骤

本节介绍pipeline内置的一些步骤。作为参考内容,跳过本节不影响本书整体阅读。建议初学者跳过。

3.7.1 文件目录相关步骤

deleteDir:删除当前目录

deleteDir是一个无参步骤,删除的是当前工作目录。通常它与dir步骤一起使用,用于删除指定目录下的内容。

dir:切换到目录

默认pipeline工作在工作空间目录下,dir步骤可以让我们切换到其他目录。使用方法如下:

fileExists:判断文件是否存在

fileExists('/tmp/a.jar')判断/tmp/a.jar文件是否存在。如果参数是相对路径,则判断在相对当前工作目录下,该文件是否存在。结果返回布尔类型。

isUnix:判断是否为类UNIX系统

如果当前pipeline运行在一个类UNIX系统上,则返回true。

pwd:确认当前目录

pwd与Linux的pwd命令一样,返回当前所在目录。它有一个布尔类型的可选参数:tmp,如果参数值为true,则返回与当前工作空间关联的临时目录。

writeFile:将内容写入指定文件中

writeFile支持的参数有:

• file:文件路径,可以是绝对路径,也可以是相对路径。

• text:要写入的文件内容。

• encoding(可选):目标文件的编码。如果留空,则使用操作系统默认的编码。如果写的是Base64的数据,则可以使用Base64编码。

readFile:读取文件内容

读取指定文件的内容,以文本返回。readFile支持的参数有:

• file:路径,可以是绝对路径,也可以是相对路径。

• encoding(可选):读取文件时使用的编码。

示例如下:

3.7.2 制品相关步骤

stash:保存临时文件

stash步骤可以将一些文件保存起来,以便被同一次构建的其他步骤或阶段使用。如果整个pipeline的所有阶段在同一台机器上执行,则stash步骤是多余的。所以,通常需要stash的文件都是要跨Jenkins node使用的。关于Jenkins node的相关概念,我们会在第14章中进行介绍。

stash步骤会将文件存储在tar文件中,对于大文件的stash操作将会消耗Jenkins master的计算资源。Jenkins官方文档推荐,当文件大小为5∼100MB时,应该考虑使用其他替代方案。

stash步骤的参数列表如下:

• name:字符串类型,保存文件的集合的唯一标识。

• allowEmpty:布尔类型,允许stash内容为空。

• excludes:字符串类型,将哪些文件排除。如果排除多个文件,则使用逗号分隔。留空代表不排除任何文件。

• includes:字符串类型,stash哪些文件,留空代表当前文件夹下的所有文件。

• useDefaultExcludes:布尔类型,如果为true,则代表使用Ant风格路径默认排除文件列表。

除了name参数,其他参数都是可选的。excludes和includes使用的是Ant风格路径表达式。在3.7.5节中将简单介绍该表达式写法。

unstash:取出之前stash的文件

unstash步骤只有一个name参数,即stash时的唯一标识。通常stash与unstash步骤同时使用。以下是完整示例。

stash步骤在master节点上执行,而unstash步骤在node2节点上执行。

3.7.3 命令相关步骤

与命令相关的步骤其实是Pipeline:Nodes and Processes插件提供的步骤。由于它是Pipeline插件的一个组件,所以基本不需要单独安装。

sh:执行shell命令

sh步骤支持的参数有:

• script:将要执行的shell脚本,通常在类UNIX系统上可以是多行脚本。

• encoding:脚本执行后输出日志的编码,默认值为脚本运行所在系统的编码。

• returnStatus:布尔类型,默认脚本返回的是状态码,如果是一个非零的状态码,则会引发pipeline执行失败。如果returnStatus参数为true,则不论状态码是什么,pipeline的执行都不会受影响。

• returnStdout:布尔类型,如果为true,则任务的标准输出将作为步骤的返回值,而不是打印到构建日志中(如果有错误,则依然会打印到日志中)。除了script参数,其他参数都是可选的。

returnStatus与returnStdout参数一般不会同时使用,因为返回值只能有一个。如果同时使用,则只有returnStatus参数生效。

bat、powershell步骤

bat步骤执行的是Windows的批处理命令。powershell步骤执行的是PowerShell脚本,支持3+版本。这两个步骤支持的参数与sh步骤的一样,这里就不重复介绍了。

3.7.4 其他步骤

error:主动报错,中止当前pipeline

error 步骤的执行类似于抛出一个异常。它只有一个必需参数:message。通常省略参数:error("there's an error")。

tool:使用预定义的工具

如果在Global Tool Configuration(全局工具配置)中配置了工具,如图3-4所示,比如配置了Docker,那么可以通过tool步骤得到工具路径。

图3-4 Docker installations

tool步骤支持的参数有:

• name:工具名称。

• type(可选):工具类型,指该工具安装类的全路径类名。

每个插件的type值都不一样,而且绝大多数插件的文档根本不写type值。除了到该插件的源码中查找,还有一种方法可以让我们快速找到type值,就是前往Jenkins pipeline代码片段生成器中生成该tool步骤的代码即可,如图3-5所示。

图3-5 生成tool步骤代码

timeout:代码块超时时间

为timeout步骤闭包内运行的代码设置超时时间限制。如果超时,将抛出一个org.jenkinsci.plugins.workflow.steps.FlowInterruptedException异常。timeout步骤支持如下参数:

• time:整型,超时时间。

• unit(可选):时间单位,支持的值有NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS、MINUTES(默认)、HOURS、DAYS。

• activity(可选):布尔类型,如果值为true,则只有当日志没有活动后,才真正算作超时。

waitUntil:等待条件满足

不断重复waitUntil块内的代码,直到条件为true。waitUntil不负责处理块内代码的异常,遇到异常时直接向外抛出。waitUntil步骤最好与timeout步骤共同使用,避免死循环。示例如下:

retry:重复执行块

执行N 次闭包内的脚本。如果其中某次执行抛出异常,则只中止本次执行,并不会中止整个retry的执行。同时,在执行retry的过程中,用户是无法中止pipeline的。

sleep:让pipeline休眠一段时间

sleep步骤可用于简单地暂停pipeline,其支持的参数有:

• time:整型,休眠时间。

• unit(可选):时间单位,支持的值有NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS(默认)、MINUTES、HOURS、DAYS。

示例如下:

3.7.5 小贴士

使用pipeline代码片段生成器学习

对于初学Jenkins pipeline的新人来说,如何开始写pipeline是一个坎儿。好在Jenkins提供了一个pipeline代码片段生成器,通过界面操作就可以生成代码。

进入 pipeline 项目后,单击左边的“Pipeline Syntax”菜单项(只有 pipeline 项目有),如图3-6所示。

进入“Pipeline Syntax”页面后,在右边的“Sample Step”下拉框中选择需要生成代码的步骤,并根据提示填入参数,然后单击“Generate Pipeline Script”按钮,就可以生成代码了,如图3-7所示。

图3-6 Pipeline Syntax菜单

图3-7 生成pipeline代码

使用VS Code扩展校验Jenkinsfile

不像Java语言有各种开发工具支持,Jenkinsfile从诞生以来就没有很好的工具支持,无奈只能使用VS Code文本编辑器+Groovy语法高亮进行开发。对语法的校验全凭自己对Jenkinsfile的熟悉程度。

2018年11月初,Jenkins官方博客介绍了一个VS Code扩展:Jenkins Pipeline Linter Connector,实现了对Jenkinsfile的语法校验。

在VS Code应用市场搜索“Jenkins Pipeline Linter Connector”并安装,然后对该扩展进行设置,如图3-8所示。

图3-8 设置VS Code的Jenkins pipeline扩展

然后,进入Jenkins的Manage Jenkins→Manage Configure Global Security页,确认Jenkins启用了“CSRF Protection”,如图3-9所示。

图3-9 设置Jenkins启用“CSRF Protection”

接下来,打开一个Jenkinsfile文件,调用扩展命令,如图3-10所示。

图3-10 执行校验Jenkinsfile命令

最后,在OUTPUT中可以看到校验结果,如图3-11所示。

图3-11 VS Code显示校验结果

值得注意的是,该扩展只能利用Jenkins API进行语法校验。比如将input步骤写成nput,校验同样通过。

使用Workspace Cleanup插件清理空间

通常,当pipeline执行完成后,并不会自动清理空间。如果需要(通常需要)清理工作空间,则可以通过Workspace Cleanup插件实现。

(1)安装Workspace Cleanup插件(地址为https://plugins.jenkins.io/ws-cleanup)。

(2)在pipeline的post部分加入插件步骤。

Ant风格路径表达式简介

Ant是比Maven更老的Java构建工具。Ant发明了一种描述文件路径的表达式,大家都习惯称其为Ant风格路径表达式。Jenkins pipeline的很多步骤的参数也会使用此表达式。

Ant路径表达式包括3种通配符。

•?:匹配任何单字符。

•*:匹配0个或者任意数量的字符。

•**:匹配0个或者更多的目录。

我们通过以下例子来学习。

•**/CVS/*:匹配CVS文件夹下的所有文件,CVS文件夹可以在任何层级。

以下路径会被匹配到:

以下foo/bar/部分不会被匹配到:

• org/apache/jakarta/**:匹配org/apache/jakarta路径下的所有文件。

以下路径会被匹配到:

以下路径不会被匹配到:

• org/apache/**/CVS/*:匹配org/apache路径下的CVS文件夹下的所有文件。CVS文件夹可以在任何层级。

以下路径会被匹配到:

以下路径不会被匹配到:

•**/test/**:匹配所有路径中含有test的路径。