这一篇开始,我会聊一聊声明式流水线,由于声明式流水线的内容会比较多,所以会分几篇进行介绍。声明式也是Jenkins最重要的部分之一。它可以用一种简洁直白的方式,来定义我们构建的过程。
声明式Pipleine是官方推荐的语法,声明式语法更加简洁。所有的声明式Pipeline都必须包含一个 pipeline块中,比如:
pipeline {
//run
}
在声明式Pipeline中的基本语句和表达式遵循Groovy的语法。但是有以下例外:
- 流水线顶层必须是一个块,特别是pipeline{}。
- 不需要分号作为分割符,是按照行分割的。
- 语句块只能由阶段、指令、步骤、赋值语句组成。例如: input被视为input()。
那么Jenkins pipeline支持多少哪些指令呢
pipeline的指令是有作用域的,类似于我们再配置Nginx的参数,有的要放在http模块里面,有的要放在location里面,有的可以放在http和location里面,而pipeline中的也一样,有的可以放在pipeline{}
中,和stage是平行的。有的是放在stage中。当然也有可以两个中任意一个,基本支持如下的指令:
- environment 用于设置环境变量,可定义在stage或pipeline部分
- tools 可定义在pipline或者stage部分。他会自动下载并安装我们指定的工具,并将其假如PATH变量中
- input 定义在stage部分,会暂停pipline。提示输入内容
- option 用于配置Jenkins pipeline本身的选项,定义在stage或者pipeline部分,如重试次数,或者超时配置。
- parallel 并行多个step。
- parameters 与input不同,这个指令定意思传入的参数
- triggers 用于定义执行pipeline的触发器
- when 满足条件才执行。
agent指令
agent
指定了流水线的执行节点。
agent { node { label 'labelname' }}
aget { label ' labelname '}
参数:
- any 在任何可用的节点上执行pipeline。none 没有指定agent的时候默认。
pipline {
agent any
stages {
...
}
}
-
none 没有指定agent的时候默认
-
label 在指定标签上的节点上运行Pipeline。
-
node 允许额外的选项(自定义workspace)。
agent { node {
label "master"
customWorkspace "${workspace}"
}
}
指定了额外的customWorkspace,需要弄node包一层。
post,运行后处理
定义了一个或者多个steps,这些阶段根据流水线或者阶段的完成情况而运行(取决于流水线中post部分的位置)。post支持以下post-condition
块中的其中之一,always 、changed、failure、success、unstable、aborted。这些条件块允许在post部分的步骤的执行取决于流水线或者阶段的完成状态。
当流水线完成后根据完成的状态做一些任务。例如:构建失败后邮件通知。
post {
always {
echo 'I will always say Hello again!'
}
failure{
email : xxxx@dxx.com
}
}
常用的状态:
-
always 无论流水线或者阶段的完成状态。
-
changed 只有当流水线或者阶段完成状态与之前不同时。
-
failure 只有当流水线或者阶段状态为"failure"运行。
-
success 只有当流水线或者阶段状态为"success"运行。
-
unstable 只有当流水线或者阶段状态为"unstable"运行。例如:测试失败。
-
aborted 只有当流水线或者阶段状态为"aborted "运行。例如:手动取消。
-
fixed 上次完成状态为失败或者unstable,当前完成状态为成功时执行
-
regression 上次完成状态为成功,当前完成状态为失败,不稳定或aborted时执行
-
cleaup 不论当前完成状态是什么,在其他所有条件块执行完成后都执行。
注意:post和stages是平级的代码块
stages阶段
stages
是流水线的整个运行阶段,包含一个或多个 stage
, 建议 stages
至少包含一个 stage
。
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
environment,环境变量
environment指令指定一个键值对序列,该序列将定义为所有步骤的环境变量,或者是特定于阶段的步骤,这取决于environment指令在流水线内的位置
该指令支持一个特殊的方法credentials()
.该方法可用于在jenkins环境中通过标识符访问预定义的凭证。对于类型为Secret Text
的凭证,credentials()
将确保指定环境变量包含秘密文本内容。对于类型为SStandard username and password
的凭证,指定的环境变量指定为username:password
,并且两个额外的环境变量被自动定义。分别为MYVARNAME_USR
和MYVARNAME_PSD
。
定义流水线环境变量,可以定义在全局变量或者步骤中的局部变量。这取决于 environment 指令在流水线内的位置。
agent any
//全局变量
environment {
activeEnv = 'dev'
}
stages {
stage('Example') {
//局部变量
environment {
AN_ACCESS_KEY = credentials('my-prefined-secret-text')
}
steps {
sh 'printenv'
}
}
}
options运行选项
定义流水线运行时的配置选项,流水线提供了许多选项, 比如buildDiscarder,但也可以由插件提供, 比如 timestamps。
agent any
options {
timeout(time: 1, unit: 'HOURS')
}
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
其他部分参数:
- buildDiscarder: 为最近的流水线运行的特定数量保存组件和控制台输出。自动清理硬盘上保存的的制品和构建日志。
options {
buildDiscarder(logRotator(numToKeepStr: '10'))
}
- disableConcurrentBuilds: 不允许同时执行流水线。 可被用来防止同时访问共享资源等。
options {
disableConcurrentBuilds(
}
- overrideIndexTriggers: 允许覆盖分支索引触发器的默认处理。
- skipDefaultCheckout: 在agent 指令中,跳过从源代码控制中检出代码的默认情况。
- skipStagesAfterUnstable: 一旦构建状态变得UNSTABLE,跳过该阶段。
- checkoutToSubdirectory: 在工作空间的子目录中自动地执行源代码控制检出。也就是,可以指定检出到工作空间的子目录中。
options {
checkoutToSubdirectory('subdir')
}
- timeout: 设置流水线运行的超时时间, 在此之后,Jenkins将中止流水线。
options {
timeout(time: 10, unit: 'HOURS')
}
- retry: 在失败时, 重新尝试整个流水线的指定次数。注意这个次数包括第一次失败。
options {
retry(4)
}
- timestamps 预测所有由流水线生成的控制台输出,与该流水线发出的时间一致。
最后我来总结一下,今天我们主要介绍了声明式的流水线。和agent,post,stages,environment和option几个指令。这里面一定要注意,今天的几个指令,他们都是在pipeline块中定义,下一篇我们开始介绍一些指令,他们既可以在pipeline块中定义,也可以定义在stages步骤中。期待与你共同进步。