You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:52:45