Jenkinsfile 详解
Pipeline
Pipeline 是 Jenkins 中最为灵活的 job 构建方式,可实现像流水线一样调度 Jenkins 任务,通过 Jenkinsfile 描述整个持续集成流程。
Pipeline 支持使用声明式语法编写 Jenkinsfile。
Jenkinsfile 如何组成呢?
Jenkinsfile 结构如下图所示:
pipeline
首先,声明式流水线语法必须包含在一个pipeline{}
代码块内。
pipeline {
/* Declarative Pipeline */
}
agent
agent{}
定义 pipeline 任务执行的代理节点。
- 在
pipeline{}
块的顶层定义,作为全局代理。 - 在
stage{}
块中的定义,则作为阶段代理。
什么是节点(node)?
在 Jenkins2 中 node 代表了任何可以执行 Jenkins 任务的系统。包含master
和slave
。
master
是一个 Jenkins 实例的主要控制系统,它能完全访问所有 Jenkins 配置选项和任务(job)列表。
如果没有指定其他系统(system),它也是默认的任务执行节点。但是我们并不推荐这么做,因为:
- 任何需要大量处理的任务都应该在
master
之外的系统运行,避免潜在的阻塞操作对主系统造成的影响。 - 凡是在
master
上执行的任务,都有权限访问所有数据、配置和操作,这会构成潜在安全风险。
为了减少系统负载,降低安全风险,通常在子系统只会安装一个轻量级 Jenkins 客户端应用来处理任务。这个客户端应用对资源的访问是受限的。
agent 和 node 有何联系?
agent 有多种代理类型,包括 node、docker。
- 任意节点:
agent any
- 指定节点标签:
agent { label 'jdk11' }
即agent{ node { label 'jdk11' } }
- 过滤节点标签:
agent { label 'linux && jdk11' }
parameters
声明式流水线支持参数开箱即用,运行流水线在运行时通过parameters
指令接收用户指定的参数。
类型 | 说明 | 语法 |
string | 字符串类型参数 | string(name: 'S', defaultValue: '', description: '', trim: true) |
text | 文本类型参数,与字符串类型区别在于可以包含多行信息,用于传入较多信息输入 | |
booleanParam | 布尔类型参数 | booleanParam(name: 'B', defaultValue: true, description: '') |
choice | 单选参数 | choice(name: 'C', choices: ['a', 'b', 'c'], description: '') |
file | 构建过程中需要的文件 | |
password | 密码类型,输入时显示密文。但是打印到终端会显示明文,不如 credentials 安全 |
parameters
配置必须 Build 过一次才会生效。
如果你使用 Build with Parameters 选项将流水线配置为接受参数,这些参数将作为params
变量的成员访问。例如:params.S
。也可以直接访问S
。
environment
自定义环境变量:environment { E = 'dev' }
使用自定义变量:E
使用内置变量:env.BUILD_ID
或BUILD_ID
。
Jenkins 流水线通过全局变量env
提供内置环境变量,它在Jenkinsfile
文件的任何地方都可以使用。
stages && stage
什么是 stage ?
stage{}
用来区分pipeline的各个阶段,是 job 中基于逻辑划分的最小任务执行单元。stage('stage name'){}
可以定义阶段名称。
什么是 stages ? 什么是 parallel ?
stages{}
是stage{}
的集合,它是pipeline中最主要的组成部分。Jenkins 会按照stages{}
中描述的顺序从上往下执行stage{}
。
parallel{}
也是stage{}
的集合,不同点在于parallel{}
中的stage{}
并行执行。
stages、stage、parralel 的嵌套关系 ?
- 所有
stage{}
都会嵌套在最外层stages{}
- 任意
stages{}
或parallel{}
都可以包含多个stage{}
- 一个
stage{}
下可以内嵌有且只有一个stages{}
或parallel{}
steps
steps{}
是 pipeline 最核心的部分,它包含真正的可执行脚本,是最基本的操作单元。每个stage{}
都需要指定一个或多个steps{}
。
post
post{}
定义一个或多个相当于steps{}
的条件块。
post{}
支持的post-condition
有:always{}
,changed{}
,failure{}
,success{}
,unstable{}
,aborted{}
。
这些条件块的执行取决于流水线或阶段完成的状态。