无需插件实现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
相关产品推荐
相关产品推荐

