Windows服务器Jenkins用curl创建GitHub PR报JSON解析错误如何解决?
解决Jenkins Groovy调用curl创建GitHub PR的JSON解析错误
问题根源在于Windows bat环境与Groovy字符串的双引号转义规则冲突,导致实际发送给GitHub的JSON格式损坏,无法被正常解析。以下是几种可行的修复方案:
方案1:使用Groovy三重双引号避免转义混乱
直接用Groovy的三重双引号包裹bat脚本,内部仅需处理bat所需的双引号转义(\"),无需额外处理Groovy的字符串转义:
stage('Git Pull Request') { steps { script { withCredentials([usernamePassword(credentialsId: 'GitHubToken', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) { def prResponse = bat ( script: """curl -L -X POST -u ${USERNAME}:${PASSWORD} https://git.company.com/api/v3/repos/vanpa/test_repo/pulls -d "{\"title\":\"title\", \"body\":\"body\", \"head\":\"delete_test2\", \"base\":\"delete_test1\"}" """, returnStdout: true ) echo "${prResponse}" } } } }
方案2:单独定义JSON变量并统一转义
先定义干净的JSON内容,再批量替换双引号为bat所需的转义格式,提升代码可读性:
stage('Git Pull Request') { steps { script { withCredentials([usernamePassword(credentialsId: 'GitHubToken', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) { def prBody = '{"title":"title", "body":"body", "head":"delete_test2", "base":"delete_test1"}' def escapedPrBody = prBody.replace('"', '\\"') def prResponse = bat ( script: "curl -L -X POST -u ${USERNAME}:${PASSWORD} https://git.company.com/api/v3/repos/vanpa/test_repo/pulls -d \"${escapedPrBody}\"", returnStdout: true ) echo "${prResponse}" } } } }
方案3:使用curl的--data-raw参数简化转义
如果你的curl版本支持--data-raw参数,可以直接传递原始JSON字符串,无需处理双引号转义:
stage('Git Pull Request') { steps { script { withCredentials([usernamePassword(credentialsId: 'GitHubToken', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) { def prResponse = bat ( script: """curl -L -X POST -u ${USERNAME}:${PASSWORD} https://git.company.com/api/v3/repos/vanpa/test_repo/pulls --data-raw '{"title":"title", "body":"body", "head":"delete_test2", "base":"delete_test1"}' """, returnStdout: true ) echo "${prResponse}" } } } }
原代码出错原因
原Groovy字符串中的"{\"title\":\"title\"..."会被Groovy解析为{"title":"title"...,传递到bat后,bat会将未转义的双引号视为命令分隔符,导致发送的JSON被截断或格式混乱,最终GitHub无法解析该JSON。
内容的提问来源于stack exchange,提问作者shainu vy
相关产品推荐
相关产品推荐

