如何在Jenkins共享库中定义可多场景访问的全局变量
Jenkins共享库全局变量实现方案(无需实例传递)
以下几种方案可实现无需创建传递类实例,在共享库所有文件及流水线中直接读写全局变量:
1. 利用vars脚本的@Field注解定义全局变量
在vars/globalVars.groovy中使用Groovy的@Field注解声明变量,这类变量会成为脚本的全局属性,无需实例化即可直接访问:
import groovy.transform.Field // 定义全局可读写变量 @Field def globalEnv = "prod" @Field int buildCounter = 0 // 可选:添加修改变量的方法 def updateBuildCounter() { buildCounter += 1 }
使用方式:
- 流水线中直接调用:
println globalVars.globalEnv globalVars.updateBuildCounter() - src目录下的Groovy类(如Functions1.groovy)中直接访问:
def someBusinessFunc() { println globalVars.globalEnv globalVars.buildCounter = 10 }
注意:这种方式的变量是跨构建共享的,并发构建时会出现变量互相覆盖的问题,仅适合存储全局常量或非构建相关的配置。
2. 扩展Jenkins内置env全局变量
Jenkins的env对象是每个构建上下文的全局变量,所有流水线步骤和共享库代码都能直接访问。可以在共享库中给env添加自定义属性:
// vars/globalVars.groovy def initGlobalVars() { // 为当前构建设置全局变量,仅在本次构建中有效 env.SHARED_BUILD_ENV = "staging" env.SHARED_BUILD_ID = "${env.BUILD_NUMBER}-custom" }
使用方式:
- 流水线中先初始化,之后直接使用:
globalVars.initGlobalVars() println env.SHARED_BUILD_ENV env.SHARED_BUILD_ID = "new-id-123" - src目录下的业务类中直接读取/修改:
def processBuild() { if (env.SHARED_BUILD_ENV == "prod") { // 执行生产环境逻辑 } }
优势:每个构建的env是独立的,不会有并发冲突,适合存储构建级别的动态变量;缺点是env中的变量只能是字符串类型。
3. 使用静态类变量
在src目录下创建一个包含静态变量的类,静态变量属于类本身,无需实例化即可访问:
// src/com/yourteam/GlobalConfig.groovy package com.yourteam class GlobalConfig { // 全局常量(建议用final修饰) static final String DEFAULT_ENV = "dev" // 可修改的静态变量(注意并发问题) static int globalBuildCount = 0 }
使用方式:
- src目录下的业务类中导入后使用:
import com.yourteam.GlobalConfig def checkEnv() { println GlobalConfig.DEFAULT_ENV GlobalConfig.globalBuildCount += 1 } - 流水线中直接导入访问:
import com.yourteam.GlobalConfig println GlobalConfig.globalBuildCount
注意:静态变量是类级别的,所有构建共享,若用于存储构建动态数据,会出现并发覆盖问题,适合存储全局通用的常量配置。
内容的提问来源于stack exchange,提问作者Silviu Alexandru
相关产品推荐
相关产品推荐

