2014-05-19 7 views
12

Ich habe eine Post-Commit-Hook (ein groovy Skript) in Gitblit, um einen REST-Endpunkt aufzurufen. In diesem Skript führe ich einen curl-Befehl aus. Aber es scheint zu versagen. Der Befehl curl funktioniert einwandfrei, wenn er über die Befehlszeile ausgeführt wird.Perfekt funktioniert Curl-Befehl schlägt fehl, wenn in einem groovigen Skript

Folgendes ist mein grooviges Skript.

#!/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 

Repository wird von Gitblit zu diesem Skript übergeben und ich habe es verifiziert.

Kann mir jemand dabei helfen.

+0

Können Sie den GString vor der Ausführung ausdrucken, um sicherzustellen, dass er den erwarteten Befehl erzeugt? – bdkosher

+0

Was genau fehlt? Können Sie Ihre Frage präzisieren? – Opal

Antwort

14

Ich kann nicht Ihr Problem mit Ihrem Beispiel reproduzieren, aber ich werde eine wilde Vermutung versuchen:

Zuerst die Liste execute() Version verwenden, so dass Sie mit Token haben keine Probleme:

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

Zweitens beide Fehler und Ausgang aus dem Prozess lesen:

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

die err geben kann, was auf

wird 0.123.
+0

Danke. Ich habe stundenlang gesucht, aber deine Lösung hat für mich funktioniert. Warum muss die Listenversion anstelle einer regulären Zeichenfolge verwendet werden? –

+0

@Jamil, ich denke, es ist, weil die Laufzeitausführung die korrekte Trennung von Argumenten/Befehlen und Escaping durchführen kann, sonst könnte es mehrdeutig werden. – Will

+0

Wenn jemand neugierig ist, gibt es eine kurze Erklärung zum Trennen von Argumenten hier: http://groovy.codehaus.org/Executing+External+Processes+From+Groovy. –

0

To ‚Einlaufen für immer‘ Prozess zu vermeiden (dies auf einigen Windows env passiert, wenn Ausgabe 4096 Byte überschreitet) in Anfangsgröße

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

Es fällt mir schwer zu sehen, wie dies wirklich die hier gestellte Frage beantwortet ... –

+0

@AndrewBarber dies nicht kann zu hängenden Prozessen führen. Der Fragesteller hat nicht angegeben, wie der Befehl fehlgeschlagen ist, also ist es eine faire Vermutung, und wir müssen trotzdem raten. – tsiki

10

konnte ich ByteArrayOutputStream diese Funktion erhalten, indem sie in den ganzen String übergeben mein Curl-Befehl in einem Array. Folgendes ist, wie ich es gemacht habe.

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

Das funktionierte auch für mich, danke für den Tipp. –