web-dev-qa-db-ja.com

Groovyスクリプトで実行すると、完全に機能するcurlコマンドが失敗する

GitblitにRESTエンドポイントを呼び出すためのコミット後フック(groovyスクリプト)があります。このスクリプトでは、curlコマンドを実行しています。しかし、失敗するようです。curlコマンドは、コマンドラインから実行されます。

以下は私のグルーヴィーなスクリプトです。

#!/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によってこのスクリプトに渡され、私はそれを確認しました。

誰かがこれを手伝ってくれませんか。

21

私はあなたの例ではあなたの問題を再現できませんでしたが、私はワイルドな推測を試みます:

最初に、リストexecute() versionを使用して、トークンに問題がないようにします。

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は何が起こっているかを明らかにするかもしれません

21
Will

Curlコマンドのすべての文字列を配列で渡すことで、これを機能させることができました。以下は私がそれをした方法です。

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

In Curl Post-In-Fオプション-param全体を二重引用符で囲みます。構文を正しくするために二重引用符をエスケープすることを忘れないでください。以下の例:

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

0
Dkumar

「永久に実行する」プロセスを回避するには(これは、出力が4096バイトを超えるときに一部のWindows環境で発生します)、ByteArrayOutputStreamに初期サイズを追加します。

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