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

无需插件实现Bash脚本与Jenkins Pipeline的变量传递

Jenkins Pipeline 多变量从Bash传递到Jenkinsfile的无文件方案

不用依赖临时文件,目前Jenkins Pipeline有几种简洁的方式实现多变量跨Shell传递,下面是最常用的几种:

1. JSON格式输出+Groovy解析

这是最稳妥的方案,能处理包含特殊字符的变量值,避免转义问题。在Bash脚本里把需要传递的变量打包成JSON字符串输出,然后在Jenkinsfile中用readJSON步骤解析成Groovy对象。

示例代码:

stage('获取API数据') {
    steps {
        script {
            // 执行Bash脚本,输出JSON格式的多变量
            def apiOutput = sh(
                script: '''
                    # 替换成你的实际API调用逻辑
                    var1=$(curl -s "https://api.example.com/data" | jq -r '.field1')
                    var2=$(curl -s "https://api.example.com/data" | jq -r '.field2')
                    # 输出标准JSON字符串(注意转义双引号)
                    echo "{\"var1\":\"$var1\", \"var2\":\"$var2\"}"
                ''',
                returnStdout: true
            ).trim()
            
            // 解析JSON为Groovy可直接使用的对象
            def apiData = readJSON text: apiOutput
            
            // 直接使用变量
            echo "var1的值: ${apiData.var1}"
            echo "var2的值: ${apiData.var2}"
            
            // 存入环境变量,供后续Stage使用
            env.API_VAR1 = apiData.var1
            env.API_VAR2 = apiData.var2
        }
    }
}

2. 键值对输出+Groovy映射解析

如果不想用JSON,也可以在Bash里每行输出key=value格式的内容,然后在Jenkinsfile中逐行分割成键值对映射。

示例代码:

stage('获取API数据') {
    steps {
        script {
            def apiOutput = sh(
                script: '''
                    var1=$(curl -s "https://api.example.com/data" | jq -r '.field1')
                    var2=$(curl -s "https://api.example.com/data" | jq -r '.field2')
                    # 每行输出一个键值对
                    echo "var1=$var1"
                    echo "var2=$var2"
                ''',
                returnStdout: true
            ).trim()
            
            // 把输出转换成Groovy Map
            def apiData = [:]
            apiOutput.split('\n').each { line ->
                def (key, value) = line.split('=', 2)
                apiData[key] = value.trim()
            }
            
            // 使用变量
            echo "var1: ${apiData.var1}"
            echo "var2: ${apiData.var2}"
            
            // 存入环境变量
            env.API_VAR1 = apiData.var1
        }
    }
}

3. 直接用Groovy调用API(替代Bash)

如果你的API调用逻辑不依赖Bash特定工具,完全可以直接在Jenkinsfile中用Groovy调用API,省去Shell传递变量的环节。可以借助httpRequest插件(需提前安装)简化操作:

示例代码:

stage('通过Groovy获取API数据') {
    steps {
        script {
            // 直接调用API并获取响应
            def response = httpRequest url: 'https://api.example.com/data'
            // 解析响应内容为JSON对象
            def apiData = readJSON text: response.content
            
            // 存入环境变量
            env.API_VAR1 = apiData.field1
            env.API_VAR2 = apiData.field2
            
            echo "var1: ${env.API_VAR1}"
        }
    }
}

以上方案都不需要创建临时文件,是目前Jenkins Pipeline推荐的多变量传递方式,近年的Jenkins版本对Groovy的JSON解析、环境变量处理都做了优化,完全可以替代旧的文件传递方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:48:07