I have the below CURL (for bitbucket tagging) command which include json content (--data). It is working from my CMD on Windows (of course I replaced sensitive info with dummy string):
curl -L -k --location-trusted -X POST --user "TEST58:123@456!" https://git.devops.test/rest/api/1.0/projects/M800/repos/test/tags
--data "{\"name\": \"test\",\"startPoint\": \"1234ca34f3624fea0e0a2134f123da11ae01\",\"message\": \"test\"}"
-H "X-Atlassian-Token: no-check" -H "Content-Type: application/json"
Now I'm trying to run this command on jenkinsfile.groovy file which runs on windows slave.
This is the current command after some tries and the latest exception:
def body = "{name: ${testTag}, startPoint: ${commitHash}, message: ${message}}"
withCredentials([usernamePassword(usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD', credentialsId: "TEST")]) {
bat(returnStdout: true, script: "curl -L -k --location-trusted -X POST --user \"${USERNAME}:${PASSWORD}\" \"https://git.devops.test/rest/api/1.0/projects/${projectKey}/repos/${repoName}/tags\" -d \"${body}\" -H \"X-Atlassian-Token: no-check\" -H \"Content-Type: application/json\"")
}
error:
{"errors":[{"context":null,"message":"Unexpected character ('n' (code 110)): was expecting double-quote to start field name\n at [Source: com.atlassian.stash.internal.web.util.web.CountingServletInputStream@447c81dc; line: 1, column: 3]","exceptionName":"org.codehaus.jackson.JsonParseException"}]}
can you suggest what is wrong? It's confusing as it's mix of json, groovy and windows
UPDATE
Following the below suggested and working solution, this is the final structure of jenkisfile.groovy:
import groovy.json.JsonOutput
node ("win") {
stage("tag") {
def testTag = "testTag"
def message = "test"
def stdout = bat(returnStdout: true, script: "git rev-parse HEAD").trim()
def commitHash = stdout.readLines().drop(1).join(" ")
def body = [
name: "${testTag}",
startPoint: "${commitHash}",
message: "${message}",
]
body = JsonOutput.toJson(body) // normal json
body = JsonOutput.toJson(body) // escaped json - escape all doublequotes
def url = "https://git.devops.test/rest/api/1.0/projects/${projectKey}/repos/${repoName}/tags"
withCredentials([usernamePassword(usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD', credentialsId: "TEST")]) {
def cmd = """curl -L -k --location-trusted -X POST --user "${USERNAME}:${PASSWORD}" "${url}" -H "accept: application/json" --data ${body} -H "Content-Type: application/json" -H "X-Atlassian-Token: no-check" """
bat(script:cmd, returnStdout:true)
}
}
}