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参数化作业的重复?但尚未得到有效的回应。
回答:
由于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]}]"}]}
看起来,在此嵌套级别上,不再需要对列表加双引号。可能是因为向上一级的引号已经导致其被正确解释。
以上是 Jenkins-将数组/列表传递给参数化的远程构建 的全部内容, 来源链接: utcz.com/qa/431878.html