1. 概述
高效的 Jenkins Pipeline 很大程度上依赖于条件控制结构来控制执行流程。通过这些结构,我们可以根据动态条件(如环境变量、前一步的结果等)灵活调整执行路径。
在本教程中,我们将通过编写一系列 Jenkins Pipeline 示例,学习如何使用 Groovy 语言中的条件控制结构(如 if-else
、when
指令等)来实现流程控制。
2. 声明式 Pipeline
Jenkins 的声明式 Pipeline 提供了一种结构清晰、易于理解的方式来定义流水线任务。下面我们将介绍几种在声明式 Pipeline 中使用条件逻辑的方式。
2.1 使用 sh
步骤配合 test
命令
Jenkins 提供了多个内置步骤,比如 sh
,可以让我们执行 Shell 命令。
下面是一个名为 job-1
的 Pipeline 示例,它只在 SKIP_BUILD
环境变量未设置时才执行构建步骤:
pipeline {
agent any
stages {
stage('build') {
steps {
sh """
test -z \$SKIP_BUILD && echo 'starting to build ...'
"""
}
}
}
}
📌 说明:
- 使用
test -z
判断变量是否为空; \$SKIP_BUILD
使用了转义$
,确保 Jenkins 把它当作 Shell 变量处理;- 该变量需在外部定义,例如在 Jenkins 的参数化构建中传入。
2.2 使用 sh
步骤中的 if-else
除了 test
命令,我们还可以在 sh
中使用完整的 if-else
结构。
pipeline {
agent any
stages {
stage('build') {
steps {
script {
sh """
if [ -z \${SKIP_BUILD} ]
then
echo "starting build ..."
else
echo "skipped build ..."
fi
"""
}
}
}
}
}
📌 说明:
- 这种方式适合逻辑较复杂、需在 Shell 层控制的场景;
script
块是可选的,但为了结构清晰建议保留。
2.3 在 Groovy 脚本中使用 if-else
由于 Jenkins Pipeline 是基于 Groovy 编写的,我们可以直接在 script
块中使用 Groovy 的条件语句。
pipeline {
agent any
stages {
stage('build') {
steps {
script {
def skipBuild = env.SKIP_BUILD
if (skipBuild == null || skipBuild.isEmpty()) {
echo 'starting build ...'
} else {
echo 'skipping build ...'
}
}
}
}
}
}
📌 说明:
env.SKIP_BUILD
用于获取环境变量;- 推荐使用
def
定义变量; - 适用于逻辑较复杂、需要在 Groovy 中处理的场景。
2.4 使用 Groovy 的三元运算符
Groovy 支持三元运算符 ?:
,可用于简洁的条件判断。
pipeline {
agent any
stages {
stage('build') {
steps {
script {
def skipBuild = env.SKIP_BUILD
(skipBuild == null || skipBuild.isEmpty()) ? println('starting the build ...') : println('skipping the build ...')
}
}
}
}
}
📌 说明:
println
是 Groovy 的标准输出方法;- 适合逻辑简单、一行搞定的场景。
3. 脚本式 Pipeline
与声明式 Pipeline 不同,脚本式 Pipeline 更加灵活,可以直接在 node
块中写入 Groovy 逻辑,而无需包裹在 script
块中。
示例:scripted-job-1
node {
stage('build') {
sh """
test -z \$SKIP_BUILD && echo 'starting to build ...'
"""
}
}
示例:scripted-job-2
node {
stage('build') {
def skipBuild=env.SKIP_BUILD
if (skipBuild == null || skipBuild.isEmpty()) {
echo 'starting build ...'
} else {
echo 'skipping build ...'
}
}
}
📌 说明:
- 脚本式 Pipeline 更适合熟悉 Groovy 的开发者;
- 语法更自由,适合快速开发;
- 不推荐用于大型项目,维护成本较高。
4. when
指令
Jenkins 提供了 when
指令,用于控制某个 stage 是否执行。它允许我们将条件判断逻辑从 script
块中抽离出来,使结构更清晰。
示例:when-job-1
pipeline {
agent any
stages {
stage('build') {
when {
expression {
def skipBuild=env.SKIP_BUILD
return skipBuild == null || skipBuild.isEmpty()
}
}
steps {
script {
echo 'starting build ...'
}
}
}
}
}
📌 说明:
when
指令可以嵌套多个条件判断;- 适用于 stage 级别的条件控制;
- 推荐用于结构清晰、易于维护的场景。
5. 总结
✅ 本文介绍了在 Jenkins Pipeline 中使用条件控制结构的几种方式:
- 在
sh
步骤中使用 Shell 命令(如test
、if-else
); - 在 Groovy 脚本中使用
if-else
和三元运算符; - 使用
when
指令控制 stage 的执行; - 声明式与脚本式 Pipeline 的区别与适用场景。
❌ 需要注意的是,不同写法在可读性、维护性上差异较大,建议根据项目复杂度选择合适的方式。
⚠️ 踩坑提示:
- 在声明式 Pipeline 中,Groovy 逻辑必须包裹在
script
块中; - 环境变量使用时注意
$
的转义; when
表达式返回true
时,stage 才会执行。
熟练掌握这些技巧,能帮助你在 Jenkins Pipeline 中实现更灵活的流程控制。