一尘不染

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

jenkins

我正在使用Jenkins通过该Publish Over SSH命令远程运行Ansible剧本。

该命令:

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"]}]}'

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

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

thisIsAList是“作业通知”下的字符串参数,并且已对作业进行了参数化。我已经成功执行了类似的命令,但是由于值是一个列表,因此该命令失败了。我尝试了“字符串参数”和“多行字符串参数”都无济于事。

这是堆栈跟踪:

org.kohsuke.stapler.WrongTypeException: Got type array but no lister class found for type class java.lang.String
        at org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:723)
        at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:478)
        at org.kohsuke.stapler.RequestImpl.instantiate(RequestImpl.java:777)
Caused: java.lang.IllegalArgumentException: Failed to convert the value parameter of the constructor public hudson.model.StringParameterValue(java.lang.String,java.lang.String)
        at org.kohsuke.stapler.RequestImpl.instantiate(RequestImpl.java:779)
        at org.kohsuke.stapler.RequestImpl.access$200(RequestImpl.java:83)
        at org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:678)
Caused: java.lang.IllegalArgumentException: Failed to instantiate class hudson.model.StringParameterValue from {"name":"thisIsAList","value":["one","two","three"]}
        at org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:680)
        at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:478)
        at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:474)
        at hudson.model.StringParameterDefinition.createValue(StringParameterDefinition.java:88)
        at hudson.model.ParametersDefinitionProperty._doBuild(ParametersDefinitionProperty.java:165)

注意:这可能是如何通过远程访问api将数组传递给jenkins参数化作业的重复?但尚未得到有效的回应。


阅读 1093

收藏
2020-07-25

共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]}]"}]}

看起来,在此嵌套级别上,不再需要对列表加双引号。可能是因为向上一级的引号已经导致其被正确解释。

2020-07-25