You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jenkins中创建多Job可读写的共享公共变量?

跨Jenkins任务共享可读写键值映射的可行方案

方案1:共享文件系统存储

直接在Jenkins服务器或共享存储上创建JSON/YAML格式的配置文件,两个任务通过读写该文件实现变量共享,适合单节点或有共享存储的集群场景。

实现示例

  • Job1写入变量:
// 读取现有配置,不存在则初始化空映射
def configPath = '/var/jenkins_shared/config.json'
def configFile = new File(configPath)
def config = configFile.exists() ? new groovy.json.JsonSlurper().parseText(configFile.text) : [:]

// 更新共享变量
config['app_version'] = '1.2.3'
config['build_number'] = env.BUILD_NUMBER

// 写回配置文件
configFile.write(new groovy.json.JsonBuilder(config).toPrettyString())
  • Job2读取变量:
def configPath = '/var/jenkins_shared/config.json'
def configFile = new File(configPath)
if (configFile.exists()) {
    def config = new groovy.json.JsonSlurper().parseText(configFile.text)
    def appVersion = config['app_version']
    def buildNumber = config['build_number']
    echo "当前版本:${appVersion},关联构建编号:${buildNumber}"
}

注意:需确保Jenkins运行用户对目标路径有读写权限;多任务并发读写时,建议通过flock命令或Groovy文件锁逻辑避免冲突。

方案2:Jenkins凭证插件存储

将共享变量封装为Jenkins凭证(如Secret File类型存储JSON键值对),通过Jenkins CLI或API实现凭证内容的更新,依托Jenkins自身权限体系管理访问。

实现示例

  • 提前在Jenkins中创建ID为shared_config的Secret File凭证,初始内容为{}
  • Job1更新凭证:
// 读取现有凭证内容
def configContent = credentials('shared_config').text
def config = new groovy.json.JsonSlurper().parseText(configContent)

// 更新变量
config['app_version'] = '1.2.3'
config['build_number'] = env.BUILD_NUMBER

// 生成临时配置文件
def tempFile = File.createTempFile('jenkins-config', '.json')
tempFile.write(new groovy.json.JsonBuilder(config).toPrettyString())

// 通过Jenkins CLI更新凭证
sh """
java -jar ${env.JENKINS_HOME}/war/WEB-INF/jenkins-cli.jar \
    -s http://localhost:8080/ \
    auth --username ${env.JENKINS_ADMIN_USER} --password ${env.JENKINS_ADMIN_PWD} \
    update-credentials system::system::jenkins _ \
    --secret-file ${tempFile.path} \
    shared_config
"""
tempFile.delete()
  • Job2读取变量逻辑同方案1,只需将文件路径替换为credentials('shared_config').path即可。
    注意:需为执行任务的用户分配凭证修改权限,也可结合Credentials Binding Plugin简化凭证调用。

方案3:外部键值存储(如Redis)

借助Redis等轻量键值数据库存储共享变量,适合多节点Jenkins集群且需要高并发读写的场景。

实现示例

  • Job1写入变量:
@Grab('redis.clients:jedis:4.3.1')
import redis.clients.jedis.Jedis

def jedis = new Jedis('redis-server', 6379)
// 若Redis有密码认证,添加jedis.auth('your-password')
jedis.set('app_version', '1.2.3')
jedis.set('build_number', env.BUILD_NUMBER)
jedis.close()
  • Job2读取变量:
@Grab('redis.clients:jedis:4.3.1')
import redis.clients.jedis.Jedis

def jedis = new Jedis('redis-server', 6379)
def appVersion = jedis.get('app_version')
def buildNumber = jedis.get('build_number')
echo "当前版本:${appVersion},关联构建编号:${buildNumber}"
jedis.close()

方案4:Jenkins共享库封装逻辑

将读写共享变量的逻辑封装到Jenkins共享库中,两个任务直接调用库方法,减少重复代码并统一维护逻辑。

共享库代码(vars/sharedConfig.groovy)

def readConfig() {
    def configPath = '/var/jenkins_shared/config.json'
    def configFile = new File(configPath)
    return configFile.exists() ? new groovy.json.JsonSlurper().parseText(configFile.text) : [:]
}

def writeConfig(Map updates) {
    def config = readConfig()
    config.putAll(updates)
    def configFile = new File('/var/jenkins_shared/config.json')
    configFile.write(new groovy.json.JsonBuilder(config).toPrettyString())
}

Job1调用

@Library('my-shared-lib') _

sharedConfig.writeConfig([
    app_version: '1.2.3',
    build_number: env.BUILD_NUMBER
])

Job2调用

@Library('my-shared-lib') _

def config = sharedConfig.readConfig()
echo "当前版本:${config.app_version},关联构建编号:${config.build_number}"

内容的提问来源于stack exchange,提问作者John Kiberbon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:20:25