Jenkins Shell脚本变量分配在分析curl响应时失败

问题描述:

我有一个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 

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