2014-01-15 74 views
0

我有一個curl語句,我在Jenkins Execute Shell Script插件的shell腳本中運行,它將返回一個json對象:{「request_id」:「52d4520c09228dc810000096」}。Jenkins Shell腳本變量分配在分析curl響應時失敗

Curl語句運行正常,並返回正確的響應json對象。

我需要解析這個對象並獲取值作爲下一個Jenkins Job的參數。目前使用tr和cut來解析json響應。

當我嘗試此代碼失敗:

curl -s -X POST -H "Accept:application/json" -d "{my parameters}" http://my_http_post_url | tr -d '{}"' | cut -f 2 -d ':' - > ${response_id}; 

與失敗:

cannot create : Directory nonexistent 
    + cut -f 2 -d : - 
    + curl -s -X POST -H Accept:application/json -d {my params} http://my_http_post_url 
    tr: write error: Broken pipe 
    Build step 'Execute shell' marked build as failure 

也試過這樣:

${response_id}=$(curl -s -X POST -H "Accept:application/json" -d "{my parameters}" http://my_http_post_url | tr -d '{}"' | cut -f 2 -d ':'); 

無法與(注:52d4520c09228dc810000096是正確的響應ID):

+ cut -f 2 -d : 
    + curl -s -X POST -H Accept:application/json -d {my params} http://my_http_post_url 
    + tr -d {}" 
    + = 52d4520c09228dc810000096 
    /tmp/hudson3217430586060280102.sh: 2: /tmp/hudson3217430586060280102.sh: = 52d4520c09228dc810000096: not found 
    Build step 'Execute shell' marked build as failure 

回答

0

shell的語法與Perl不同。在shell中,只有當您引用變量並希望shell使用其值擴展它時,纔會在變量前面放置美元符號。分配變量時不使用美元符號。

你第二次嘗試,似乎最好:另外,不需要

response_id=$(curl -s -X POST -H "Accept:application/json" -d "{my parameters}" http://my_http_post_url | tr -d '{}"' | cut -f 2 -d ':') 

分號結束。

此外,我會建議你使用專門的工具來解析JSON。如果你使用tr,awk等,你可以在輸入中使用特定的基於行的格式,但JSON可以用很多方式格式化,並且仍然是有效的JSON。使用諸如jq(http://stedolan.github.io/jq/)之類的工具。那麼你可以這樣做:

response_id=$(curl -s -X POST -H "Accept:application/json" -d "{my parameters}" http://my_http_post_url | jq -r .request_id) 

我通常使用-f捲曲選項。我想知道服務器什麼時候發回200以外的東西。

+0

所以我得到了環境注入插件安裝,所以我可以保存在當前作業範圍內的shell腳本中的值,並以這種方式保存,以便我可以將其值傳遞給鏈上的下一個作業作爲參數:https://wiki.jenkins- ci.org/display/JENKINS/EnvInject+Plugin。 – Ubik

+0

request_id = $(curl -s -X POST -H「Accept:application/json」-d {myparams} http:// myurl | jq -r .request_id); echo id = $ request_id> propsfile; 回覆從廚房收到的令牌:$ propsfile; – Ubik

+0

據我所知,EnvInject插件不能用於將一個變量從一個工作傳遞給另一個工作。 https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin似乎是這份工作的正確工具。將request_id寫入屬性文件,並將該插件配置爲將屬性文件中的變量作爲參數傳遞給觸發的作業(當然,必須將其配置爲期望這些參數)。 – sti