1. 概述

Jenkins 是一个开源的持续集成与持续交付(CI/CD)自动化服务器,广泛用于软件构建、测试与部署流程的自动化。Jenkins 提供了基于 Groovy 的 脚本化流水线(Scripted Pipeline),允许开发者编写灵活的流水线逻辑。

在脚本化流水线中,各个阶段(stage)通常按顺序执行。但在实际使用中,有时我们希望根据某些条件动态跳过某些阶段,比如跳过测试阶段以加快流水线执行速度。

本文将介绍几种在 Jenkins 脚本化流水线中跳过 stage 的常见方法。


2. 为什么需要跳过流水线阶段

跳过阶段在 CI/CD 流程中非常有用,主要原因包括:

  • 节省执行时间:跳过不必要的阶段,可以显著缩短流水线整体执行时间。
  • 灵活控制流程:比如在本地开发时跳过测试,在预发布环境跳过部署。
  • 适应不同环境需求:同一份流水线脚本可以在不同场景下动态控制执行路径。

3. 使用 when 条件判断跳过阶段

when 是 Jenkins 提供的一种条件判断机制,用于控制某个 stage 是否执行。它支持多种表达式类型,如参数判断、环境变量、构建触发器等。

✅ 示例代码

pipeline {
    agent any
    parameters {
        booleanParam(name: 'skip_test', defaultValue: false, description: '设置为 true 可跳过测试阶段')
    }
    stages {
        stage('Build') {
            steps {
                sh 'echo "Building application"'
            }
        }
        stage('Test') {
            when { expression { params.skip_test != true } }
            steps {
                sh 'echo "Testing application"'
            }
        }
        stage('Deploy') {
            steps {
                sh 'echo "Deploying application"'
            }
        }
    }
}

🔍 说明

  • 使用 booleanParam 定义了一个参数 skip_test
  • when 表达式判断 skip_test 是否为 true,若为 true 则跳过该阶段。
  • 适用于根据参数或环境变量动态控制执行流程。

4. 使用 input 步骤手动确认是否跳过

如果希望在执行过程中由用户决定是否跳过某个阶段,可以使用 input 步骤进行交互式确认。

✅ 示例代码

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'echo "Building the application"'
            }
        }
        stage('Test') {
            steps {
                input message: '是否跳过测试阶段?', ok: 'Yes',
                    parameters: [booleanParam(name: 'skip_test', defaultValue: false)], timeout: time(minutes: 5)
                script {
                    if (params.skip_test) {
                        echo "已选择跳过测试阶段"
                        return
                    }
                }
                sh 'echo "开始执行测试"'
            }
        }
        stage('Deploy') {
            steps {
                sh 'echo "Deploying the application"'
            }
        }
    }
}

🔍 说明

  • 使用 input 步骤弹出确认框,让用户决定是否跳过测试阶段。
  • 用户选择“是”后,params.skip_testtrue,进入脚本逻辑后直接 return 跳出当前 stage。
  • 适合需要人工干预的场景,比如上线前审批、灰度发布等。

5. 使用自定义函数控制阶段执行

如果多个 stage 都需要支持跳过功能,可以封装一个函数来统一控制流程,避免重复代码。

✅ 示例代码

pipeline {
    agent any
    parameters {
        booleanParam(name: 'skip_test', defaultValue: false, description: '设置为 true 可跳过测试阶段')
    }
    stages {
        stage('Build') {
            steps {
                sh 'echo "Building the application"'
            }
        }
        stage('Test') {
            steps {
                executeStage('Test', params.skip_test) {
                    sh 'echo "Running tests"'
                }
            }
        }
        stage('Deploy') {
            steps {
                executeStage('Deploy', false) {
                    sh 'echo "Deploying the application"'
                }
            }
        }
    }
}

def executeStage(String stageName, Boolean skip, Closure steps) {
    if (skip) {
        echo "跳过阶段:${stageName}"
    } else {
        stage(stageName) {
            steps.call()
        }
    }
}

🔍 说明

  • 封装了一个 executeStage 函数,接受阶段名称、是否跳过和步骤闭包。
  • 如果 skiptrue,则直接打印跳过信息,不再执行 stage。
  • 否则正常执行该 stage 及其步骤。
  • 适用于多个阶段需要统一控制跳过逻辑的场景,提高代码复用性。

6. 总结

本文介绍了三种在 Jenkins 脚本化流水线中跳过 stage 的方法:

方法 适用场景 优点 缺点
when 条件判断 根据参数或表达式跳过 简洁、易于维护 无法动态交互
input 步骤 人工确认跳过 支持人工干预 依赖用户输入
自定义函数 多个阶段统一控制 代码复用高、逻辑清晰 实现稍复杂

你可以根据实际需求选择合适的方式。完整示例代码可以在 GitHub 仓库 中找到。

如果你正在维护一个复杂的 Jenkins 流水线项目,灵活使用这些技巧可以让你的 CI/CD 更加高效、可控。


原始标题:Skip a Stage in a Jenkins Pipeline