【问题标题】:Jenkins Shell Script variable assignment fails when parsing curl response解析 curl 响应时,Jenkins Shell 脚本变量分配失败
【发布时间】:2014-01-18 04:22:43
【问题描述】:

我有一个 curl 语句,我在 Jenkins Execute Shell Script 插件的 shell 脚本中运行,它将返回一个 json 对象:{"request_id":"52d4520c09228dc810000096"}。

Curl 语句运行良好并返回正确的响应 json 对象。

我需要解析这个对象并取回该值以用作下一个 Jenkins 作业的参数。目前使用 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 parsing jenkins


    【解决方案1】:

    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 curl 选项。我想知道服务器什么时候发回的不是 200 OK。

    【讨论】:

    • 所以我安装了环境注入插件,所以我可以保存当前作业范围内的 shell 脚本中的值,并以这样一种方式保存它,以便我可以将它的值传递给链上的下一个作业作为参数:wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin。
    • request_id=$(curl -s -X POST -H "Accept:application/json" -d {myparams} myurl | jq -r .request_id); echo id=$request_id > propsfile;从 Kitchen 收到的 echo Token: $propsfile;
    • 据我所知,EnvInject 插件不能用于将变量从一项作业传递到另一项作业。 wiki.jenkins-ci.org/display/JENKINS/… 似乎是这项工作的正确工具。将 request_id 写入属性文件并配置插件以将属性文件中的变量作为参数传递给触发的作业(当然,必须将其配置为具有期望的那些参数。)
    • 正确。我的第二份工作有那个插件,它能够引用 EnvInject 属性文件。显然,EnvInject 属性文件被附加到当前环境变量中,因此它可以被引用,就好像我将环境变量传递给下一个作业一样。
    猜你喜欢
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    相关资源
    最近更新 更多