如何在Jenkinsfile中用jq将JSON值赋值给跨Stage变量?
问题分析与解决方案
你的代码无法跨Stage传递变量的核心原因是:Shell子进程的变量与Jenkins Groovy变量完全隔离,且不同Stage的Shell进程是独立的,所以在第一个Stage的Shell里定义的address变量,既无法被Groovy识别,也无法被后续Stage的Shell访问。
下面提供两种可靠的跨Stage变量传递方案:
方案一:使用Jenkins环境变量(推荐,跨Stage全局可用)
通过sh步骤的returnStdout: true捕获命令输出,存入Jenkins全局环境变量env,所有Stage都能直接访问。
修改后的完整Jenkinsfile
parameters { string( name: 'json_file_location', defaultValue: "config.json" ) } pipeline { agent any stages { stage("读取JSON并提取地址") { steps { script { // 捕获jq命令的标准输出,去除首尾空白(避免换行符干扰) def addressOutput = sh( script: "jq -r '.address' ${params.json_file_location}", returnStdout: true ).trim() // 将结果存入全局环境变量 env.address = addressOutput } } } stage("打印地址") { steps { // Groovy步骤直接打印 echo "提取到的地址:${env.address}" // Shell步骤中打印 sh """ echo "Shell环境中地址:${env.address}" """ } } } }
关键说明
returnStdout: true:让sh步骤返回命令的标准输出,而非执行状态码.trim():移除输出中的换行符和多余空格,保证变量值干净env.address:Jenkins全局环境变量,所有Stage、步骤都能直接调用
方案二:用Jenkins原生JSON解析(无需依赖jq)
如果你的Jenkins安装了Pipeline Utility Steps插件(默认已预装),可以直接用readJSON步骤解析JSON文件,避免依赖外部工具jq。
完整代码示例
parameters { string( name: 'json_file_location', defaultValue: "config.json" ) } pipeline { agent any stages { stage("读取JSON并提取地址") { steps { script { // 直接读取JSON文件转为Groovy对象 def config = readJSON file: params.json_file_location // 提取address并存入全局环境变量 env.address = config.address } } } stage("打印地址") { steps { echo "提取到的地址:${env.address}" sh """ echo "Shell环境中地址:${env.address}" """ } } } }
优势
- 无需在Jenkins节点上安装
jq,兼容性更强 - 代码更简洁,直接通过Groovy对象访问JSON字段,出错概率更低
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

