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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:22:15