如何在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
相关产品推荐
相关产品推荐

