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以外的东西。
所以我得到了环境注入插件安装,所以我可以保存在当前作业范围内的shell脚本中的值,并以这种方式保存,以便我可以将其值传递给链上的下一个作业作为参数:https://wiki.jenkins- ci.org/display/JENKINS/EnvInject+Plugin。 – Ubik
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
据我所知,EnvInject插件不能用于将一个变量从一个工作传递给另一个工作。 https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin似乎是这份工作的正确工具。将request_id写入属性文件,并将该插件配置为将属性文件中的变量作为参数传递给触发的作业(当然,必须将其配置为期望这些参数)。 – sti