Jenkins中curl传递含换行变量报Illegal unquoted character code10错误如何解决
错误原因
你遇到的报错是因为JSON语法要求字符串中的控制字符(包括换行符、制表符等)必须经过转义才能使用,你直接把包含原始换行的文件内容拼接进JSON请求体,导致JSON格式非法,同时shell执行命令时直接展开换行也会破坏curl命令的结构。另外你原始curl命令中-u username:password和-X POST之间缺少空格,也会导致命令执行异常,修改时注意补全。
解决方案
方案1:使用Groovy内置JSON序列化工具(最推荐)
不需要依赖额外工具,直接在Jenkins Pipeline层面完成JSON转义,避免手动拼接JSON出错:
import groovy.json.JsonOutput pipeline { // 保留你的其他pipeline配置 stages { stage('上传Jira评论') { steps { script { FPR_LOW = readFile('fpr_low.txt').trim() // 直接构造整个请求体,自动处理所有特殊字符转义 def requestBody = JsonOutput.toJson([ body: FPR_LOW ]) } sh """ curl -u username:password -X POST \ -H "Content-Type: application/json" \ --url 'http://10.10.10.10:8080/rest/api/2/issue/${env.TASK_KEY}/comment' \ -d '${requestBody}' """ } } } }
方案2:使用curl标准输入+jq转义(适合不想改Groovy代码的场景)
如果你的Jenkins节点安装了jq工具,可以在shell层完成字符串转义,通过标准输入传递payload避免命令行展开换行:
script { FPR_LOW = readFile('fpr_low.txt').trim() } sh ''' # 用单引号包裹sh块避免Jenkins提前展开变量,TASK_KEY从环境变量读取 printf '%s' "$FPR_LOW" | jq -R '{body: .}' | curl -u username:password -X POST \ -H "Content-Type: application/json" \ --url "http://10.10.10.10:8080/rest/api/2/issue/${TASK_KEY}/comment" \ -d @- '''
说明:curl的
-d @-参数表示从标准输入读取请求体内容,避免了变量在命令行参数中展开导致的格式破坏;jq的-R参数会把输入的原始内容自动转义为合法的JSON字符串。
内容的提问来源于stack exchange,提问作者user630702
相关产品推荐
相关产品推荐

