Jenkins - 将数组/列表传递给参数化远程构建

时间:2017-09-19 23:04:05

标签: jenkins ssh continuous-integration hudson

我正在使用Jenkins通过Var2命令远程运行Ansible playbook。

此命令:

Publish Over SSH

应触发构建后操作以通过SSH远程执行以下命令:

curl -k -v -X POST https://jenkins.myhost.com/job/Ansible_Deploy/build?token=<appToken> --user <myUser>:<userToken> --data-urlencode json='{"parameter":[{"name":"thisIsAList","value":["one","two","three"]}]}'

ansible-playbook /home/<myUser>/test/practice.yml --extra-vars "thisIsAList=$thisIsAList"是作业通知下的字符串参数,作业已参数化。我已经成功执行了类似的命令,但是这个命令失败了,假设因为值是一个列表。我已经尝试了两个&#34;字符串参数&#34;以及&#34;多线字符串参数&#34;无济于事。

这是堆栈跟踪:

thisIsAList

注意:这可能与How to pass an array to a jenkins parameterized job via remote access api?重复,但尚未获得有效回复。

2 个答案:

答案 0 :(得分:1)

由于Jenkins或Ansible文档中的任何位置都没有详细说明这种嵌套级别,所以我现在已经解决了我的问题。

命令:

ansible-playbook /home/<myUsr>/test/practice.yml --extra-vars "thisIsAList=$thisIsAList"

应该声明thisIsAList是一个字典对象。即:

ansible-playbook /home/<myUsr>/test/practice.yml --extra-vars "{thisIsAList=$thisIsAList}"

此外,cURL命令中的数据应该采用不同的格式:

json='{"parameter":[{"name":"thisIsAList","value":"[one,two,three]"}]}'

注意:双引号位于整个列表周围,而不是单个元素。

最后,对于更多嵌套项(例如列表中的dict),你必须像这样转义双引号:

{"parameter":[{"name":"thisIsADictNestedInAList","value":"[{\"name\":\"numbers\",\"value\":[1s, 2s, 3s]}]"}]}

看来,在这种嵌套级别,不再需要对列表进行双引号;可能是因为引用一级已经导致它被正确解释。

答案 1 :(得分:1)

这是一个猜测,基于我在选择参数中看到的类似问题。我发现的任何文档似乎都错误地解决了这些问题。它不应该是一个列表。尝试以字符串形式传递分隔项目的换行符。

curl -k -v -X POST https://jenkins.myhost.com/job/Ansible_Deploy/build?token=<appToken> --user <myUser>:<userToken> --data-urlencode json='{"parameter":[{"name":"thisIsAList","value":"one\ntwo\nthree"}]}'

如果有效,请告诉我。我有兴趣了解一下。


修改(根据评论)

这会有效吗?

curl -k -v -X POST https://jenkins.myhost.com/job/Ansible_Deploy/build?token=<appToken> --user <myUser>:<userToken> --data-urlencode json='{"parameter":[{"name":"thisIsAList","value":"'{\"thisIsAList\": [\"one\",\"two\",\"three\"]}'"}]}'

嵌套引号有点难看。如果您正在使用管道或者可以先在shell脚本中按摩数据,那么它可能会更清晰。