Прекрасно работающая команда curl сбой при выполнении в groovy script

У меня есть крюк фиксации сообщения (a groovy script) в gitblit для вызова конечной точки REST. В этом script выполняется команда curl. Но это, кажется, терпит неудачу. Команда curl отлично работает при выполнении из командной строки.

Ниже приведен мой groovy script.

#!/usr/bin/env groovy


def repoUrl= "https://gitblit.myhost.com/git/" + repository + ".git"
json='{"repository":{"url":"'+repoUrl+'"}}'

def response = "curl -v -k -X POST -H \"Content-Type: application/json\" -d '${json}' https://username:[email protected]:9443/restendpoint".execute().text
println response 
Репозиторий

передается gitblit на этот script, и я его проверил.

Может кто-нибудь помочь мне с этим.

Ответ 1

Я не смог воспроизвести вашу проблему с вашим примером, но я попытаюсь угадать:

Сначала используйте список execute(), так что у вас нет проблем с токенами:

process = [ 'bash', '-c', "curl -v -k -X POST -H \"Content-Type: application/json\" -d '${json}' https://username:[email protected]:9443/restendpoint" ].execute().text

Во-вторых, прочитайте как ошибку, так и результат процесса:

process.waitFor()
println process.err.text
println process.text

err может выдавать то, что происходит

Ответ 2

Мне удалось получить эту работу, передав всю строку в моей команде curl в массиве. Вот как я это сделал.

def response = ["curl", "-k", "-X", "POST", "-H", "Content-Type: application/json", "-d", "${json}", "https://username:[email protected]:9443/restendpoint"].execute().text

Ответ 3

Чтобы избежать "непрерывного процесса" (это происходит в некоторых Windows env при выходе превышает 4096 байт), добавьте начальный размер в ByteArrayOutputStream

def initialSize = 4096
def out = new ByteArrayOutputStream(initialSize)
def err = new ByteArrayOutputStream(initialSize)
def proc = command.execute()
proc.consumeProcessOutput(out, err)
proc.waitFor()

Ответ 4

В опции Curl Post - в опции -F - оберните весь параметр двойными кавычками. Не забудьте избежать двойных кавычек, чтобы получить правильный синтаксис. Пример ниже:

def response = "curl -u admin: admin -F \" jcr: content/par/address/address1 = 2/3 Market Place\" http://localhost:4502/content/datasource/branches".execute(). text