1. 概述

高效的 Jenkins Pipeline 很大程度上依赖于条件控制结构来控制执行流程。通过这些结构,我们可以根据动态条件(如环境变量、前一步的结果等)灵活调整执行路径。

在本教程中,我们将通过编写一系列 Jenkins Pipeline 示例,学习如何使用 Groovy 语言中的条件控制结构(如 if-elsewhen 指令等)来实现流程控制。


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 命令(如 testif-else);
  • 在 Groovy 脚本中使用 if-else 和三元运算符;
  • 使用 when 指令控制 stage 的执行;
  • 声明式与脚本式 Pipeline 的区别与适用场景。

❌ 需要注意的是,不同写法在可读性、维护性上差异较大,建议根据项目复杂度选择合适的方式。

⚠️ 踩坑提示:

  • 在声明式 Pipeline 中,Groovy 逻辑必须包裹在 script 块中;
  • 环境变量使用时注意 $ 的转义;
  • when 表达式返回 true 时,stage 才会执行。

熟练掌握这些技巧,能帮助你在 Jenkins Pipeline 中实现更灵活的流程控制。


原始标题:How to Use Conditional Constructs in Jenkins Pipeline