Jenkins中对JSON执行Base64编码出现双引号报错如何解决
报错原因
直接把带双引号的JSON变量插值到sh步骤的脚本中时,Shell会把JSON内的双引号识别为自身的语法符号,最终触发语法解析错误。
更优实现方案
方案1:使用Jenkins内置Base64编码方法(推荐)
不需要调用系统Shell,跨平台兼容性更好,也完全避免引号冲突问题,代码如下:
stages { stage('Debug') { steps { script { outgoing_json = '''{ "spec": "1.0.0" }''' // 直接调用Groovy内置Base64编码能力,指定UTF-8字符集 outgoing_encoded = outgoing_json.getBytes("UTF-8").encodeBase64().toString() } echo "outgoing_encoded: ${outgoing_encoded}" } } }
这个方案的优势:
- 无Shell调用开销,执行速度更快
- 不受节点操作系统、Shell环境差异影响,Windows、Linux节点都能正常运行
- 完全规避特殊字符、引号的转义问题
方案2:如果必须调用Shell实现
可以把Groovy变量作为环境变量传递给Shell,避免直接插值产生的语法冲突,修改后代码如下:
stages { stage('Debug') { steps { script { outgoing_json = '''{ "spec": "1.0.0" }''' // 先将Groovy变量注入Shell环境 withEnv(["OUTGOING_JSON=${outgoing_json}"]) { outgoing_encoded = sh( returnStdout: true, script: 'echo "$OUTGOING_JSON" | base64' ).trim() // trim去掉echo默认追加的换行符 } } echo "outgoing_encoded: ${outgoing_encoded}" } } }
注意这里sh的script参数用单引号包裹,避免Groovy提前对变量做插值,直接让Shell读取环境变量即可。
内容的提问来源于stack exchange,提问作者john smith
相关产品推荐
相关产品推荐

