1. 概述

在持续集成与持续交付(CI/CD)领域,Jenkins 流水线已经成为自动化软件开发流程的重要工具。它能够帮助我们构建、测试和部署应用程序,实现开发流程的自动化。

本文将介绍 Jenkins 流水线中全局变量的使用方法,包括常见的内置变量及其使用场景,以及如何定义自定义全局变量来增强流水线的灵活性。


2. 理解 Jenkins 流水线中的全局变量

在 Jenkins 流水线中,全局变量是预定义的对象或值,可以在整个流水线脚本中访问。这些变量通常由 Jenkins 提供,开箱即用,无需额外配置。

它们包含以下几类信息:

  • 构建环境数据(如构建编号、工作目录)
  • 任务参数
  • Jenkins 系统的各种属性

全局变量的作用在于让流水线脚本更动态、更灵活,通过使用这些变量,我们可以编写出更具复用性和适应性的流水线代码

此外,它们还有助于在多个流水线之间保持一致性,便于统一管理多个任务中的公共配置。


3. 常用的全局变量

3.1 env 变量

env 是一个包含环境相关信息的对象,是 Jenkins 中最常用的变量之一。以下是一些常见用法:

  • env.BUILD_NUMBER:当前构建的编号
  • env.JOB_NAME:当前任务的名称
  • env.WORKSPACE:当前工作空间的路径

✅ 示例代码:

pipeline {
    agent any
    stages {
        stage('Environment Info') {
            steps {
                echo "Building ${env.JOB_NAME} #${env.BUILD_NUMBER}"
                echo "Workspace: ${env.WORKSPACE}"
            }
        }
    }
}

这段代码会输出当前构建的基本信息,如任务名、构建编号和工作目录。


3.2 currentBuild 变量

currentBuild 提供当前构建的上下文信息,常用于判断构建状态或执行后处理逻辑。

常见属性:

  • currentBuild.result:构建结果(如 SUCCESS、FAILURE)
  • currentBuild.duration:构建耗时(毫秒)
  • currentBuild.previousBuild:上一次构建的信息

✅ 示例代码:

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                // 构建步骤
            }
        }
    }
    post {
        always {
            echo "Build result: ${currentBuild.result}"
            echo "Build duration: ${currentBuild.duration}ms"
        }
    }
}

该示例在构建完成后输出构建结果和耗时。


3.3 params 变量

params 用于访问构建参数,常用于参数化构建,使流水线更具灵活性。

✅ 示例代码:

pipeline {
    agent any
    parameters {
        choice(name: 'DEPLOY_ENV', choices: ['dev', 'staging', 'prod'], description: '部署环境')
    }
    stages {
        stage('Deploy') {
            steps {
                echo "Deploying to ${params.DEPLOY_ENV} environment"
                // 部署步骤
            }
        }
    }
}

这段代码根据用户选择的部署环境输出不同的部署信息。


4. 全局变量的访问方式

访问全局变量时需要注意语法规范:

  • 使用点号访问属性:变量名.属性
  • 环境变量可通过 env.VAR_NAME${VAR_NAME} 访问
  • currentBuild 等对象有其专属的属性

✅ 示例代码:

pipeline {
    agent any
    stages {
        stage('Variable Access') {
            steps {
                echo "Job name: ${env.JOB_NAME}"
                echo "Build number: ${BUILD_NUMBER}"
                echo "Build result: ${currentBuild.result}"
            }
        }
    }
}

该示例展示了不同变量的访问方式。


5. 全局变量的实际应用示例

5.1 根据分支名执行条件判断

我们可以根据 env.BRANCH_NAME 的值来决定是否执行某个阶段。

✅ 示例代码:

pipeline {
    agent any
    stages {
        stage('Deploy') {
            when {
                expression { env.BRANCH_NAME == 'main' }
            }
            steps {
                echo "Deploying main branch to production"
                // 部署步骤
            }
        }
    }
}

只有当分支名为 main 时,才会执行部署阶段。


5.2 使用构建参数

定义一个字符串参数 VERSION 并在流水线中使用它。

✅ 示例代码:

pipeline {
    agent any
    parameters {
        string(name: 'VERSION', defaultValue: '1.0.0', description: '要部署的版本')
    }
    stages {
        stage('Deploy') {
            steps {
                echo "Deploying version ${params.VERSION}"
                // 部署步骤
            }
        }
    }
}

这样可以在触发构建时指定不同版本号。


5.3 构建失败时发送通知

构建失败时可以自动发送邮件通知,使用 currentBuild.fullDisplayNameenv.BUILD_URL

✅ 示例代码:

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                // 构建步骤
            }
        }
    }
    post {
        failure {
            mail to: 'devops@example.com',
                 subject: "流水线失败: ${currentBuild.fullDisplayName}",
                 body: "请查看构建详情:${env.BUILD_URL}"
        }
    }
}

构建失败后会自动发送一封包含构建链接的邮件。


6. 自定义全局变量

除了使用内置变量,我们还可以根据项目需求创建自定义全局变量。

6.1 在 Jenkins 配置中定义全局变量

在 Jenkins 系统设置中可以定义全局环境变量,适用于多个流水线共享。

步骤如下:

  1. 进入 Jenkins 控制台
  2. 点击 “Manage Jenkins” -> “Configure System”
  3. 勾选 “Environment variables”
  4. 添加变量名和值(如 COMPANY_NAME=TechCorp

✅ 示例代码:

pipeline {
    agent any
    stages {
        stage('Welcome') {
            steps {
                echo "Welcome to ${env.COMPANY_NAME}'s Jenkins Pipeline!"
            }
        }
    }
}

6.2 使用 Groovy 脚本定义自定义变量

更灵活的方式是通过 Groovy 脚本定义变量,支持逻辑处理和动态值。

✅ 示例:生成时间戳

// 文件路径:vars/getTimestamp.groovy
def call() {
    return new Date().format("yyyyMMdd_HHmmss")
}

在流水线中使用:

pipeline {
    agent any
    stages {
        stage('Timestamp') {
            steps {
                script {
                    def timestamp = getTimestamp()
                    echo "Current timestamp: ${timestamp}"
                }
            }
        }
    }
}

✅ 示例:获取 Git 最新 tag

// 文件路径:vars/getLatestTag.groovy
def call() {
    return sh(script: 'git describe --tags --abbrev=0', returnStdout: true).trim()
}

在流水线中使用:

pipeline {
    agent any
    stages {
        stage('Deploy') {
            steps {
                script {
                    def latestTag = getLatestTag()
                    echo "Deploying version: ${latestTag}"
                    // 部署步骤
                }
            }
        }
    }
}

通过自定义变量,我们可以更灵活地控制流水线行为,满足项目特定需求。


7. 总结

本文介绍了 Jenkins 流水线中常用的全局变量,包括 envcurrentBuildparams,并通过多个实际示例展示了它们的使用方式。

此外,我们还讲解了如何通过 Jenkins 配置和 Groovy 脚本创建自定义全局变量,从而扩展 Jenkins 的功能。

关键点总结:

  • 使用全局变量可以提高流水线脚本的灵活性和可维护性
  • Jenkins 提供了丰富的内置变量,满足大部分场景需求
  • 自定义变量可以通过系统配置或 Groovy 脚本实现,适用于复杂或特定项目场景

掌握这些变量的使用,能帮助我们写出更智能、更可配置的 Jenkins 流水线脚本。


原始标题:Utilizing Global Variables in Jenkins Pipeline