Jenkins Groovy转Shell调用Curl时的Payload转义问题
Jenkins流水线API调用Payload转义解决方案
方法一:用Groovy JsonBuilder自动生成(推荐)
手动转义容易出错,用Groovy的JsonBuilder可以自动生成符合要求的JSON字符串,完全避免转义问题:
import groovy.json.JsonBuilder // 构建目标Payload def jsonBuilder = new JsonBuilder() jsonBuilder { file "//'HLQ.DATASET(MEMBER)'" } def jobPayload = jsonBuilder.toString() script { def response = sh(script: """curl -X PUT -w %{http_code} -v \ --header 'Content-Type: application/json' \ --cookie cookies.txt \ --header 'X-CSRF-ZOSMF-HEADER: dummy' \ --header 'X-IBM-Notification-URL: ${hook.getURL()}' \ https://.../zosmf/restjobs/jobs \ --data \"$jobPayload\"""", returnStdout: true).trim() }
说明:JsonBuilder会自动处理JSON的格式和转义,生成的jobPayload就是严格符合要求的{"file": "//'HLQ.DATASET(MEMBER)'"},shell命令中用双引号包裹--data参数,确保所有特殊字符(包括圆括号、单引号)都能正确传递。
方法二:手动构建字符串并处理shell转义
如果不想引入JsonBuilder,也可以手动构建字符串,同时处理shell环境下的单引号转义:
// 在Groovy中定义目标Payload,单引号字符串里用\'转义内部单引号 def jobPayload = '{"file": "//\'HLQ.DATASET(MEMBER)\'"}' // 处理shell单引号转义:将字符串中的单引号替换为shell可识别的'\'' def shellSafePayload = jobPayload.replace("'", "'\\''") script { def response = sh(script: """curl -X PUT -w %{http_code} -v \ --header 'Content-Type: application/json' \ --cookie cookies.txt \ --header 'X-CSRF-ZOSMF-HEADER: dummy' \ --header 'X-IBM-Notification-URL: ${hook.getURL()}' \ https://.../zosmf/restjobs/jobs \ --data '$shellSafePayload'""", returnStdout: true).trim() }
说明:Groovy单引号字符串中,内部单引号用\'转义即可得到正确的JSON;由于shell中用单引号包裹--data参数时,内部单引号需要转义为'\'',所以通过replace方法处理后,shell能正确解析整个Payload,不会出现截断或语法错误。
原有代码出错原因
你之前的三重双引号字符串转义过于复杂,Groovy和shell的转义规则叠加导致混乱:单次转义触发Groovy语法错误,双重转义又会让多余的斜杠残留到shell调用中。上述两种方法都避开了手动嵌套转义的麻烦,直接生成或处理出符合双方要求的字符串。
内容的提问来源于stack exchange,提问作者Destabilizator
相关产品推荐
相关产品推荐

