【问题标题】:Jenkins - Passing array/list to Parameterized Remote BuildJenkins - 将数组/列表传递给参数化远程构建
【发布时间】:2017-09-22 00:42:44
【问题描述】:

我正在使用 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/&lt;myUser&gt;/test/practice.yml --extra-vars "thisIsAList=$thisIsAList"

thisIsAList是Job Notifications下的字符串参数,job是参数化的。我已经成功执行了类似的命令,但是这个失败了,假设是因为该值是一个列表。 “字符串参数”和“多行字符串参数”我都试过了。

这是堆栈跟踪:

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)

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

【问题讨论】:

    标签: jenkins ssh continuous-integration hudson


    【解决方案1】:

    由于 Jenkins 或 Ansible 文档中的任何地方都没有详细说明这一级别的嵌套,因此我已经解决了我的问题,我将对该主题进行一些说明。

    命令:

    ansible-playbook /home/&lt;myUsr&gt;/test/practice.yml --extra-vars "thisIsAList=$thisIsAList"

    应该将thisIsAList 声明为字典对象。即:

    ansible-playbook /home/&lt;myUsr&gt;/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]}]"}]}
    

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

    【讨论】:

      【解决方案2】:

      这是一个猜测,基于我在选择参数中看到的类似问题。我发现的任何文档在如何处理这些方面似乎都是错误的。它不应该是一个列表。尝试作为字符串传递,用换行符分隔项目。

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

      让我知道这是否有效。我有兴趣了解一下。


      编辑:(基于 cmets)

      这行得通吗:

      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 脚本中处理数据,它可能会更干净。

      【讨论】:

      • 我重新阅读了你的问题,我想我起初误解了。我明白你现在想要做什么。问题不在于将数据传递给 Jenkins,(您可以将其作为字符串进行。问题是如何将数据正确地传递给 Ansible。它需要格式化为 JSON 才能传递列表。--extra-vars ='{"test_list": [1,2,3]}' docs.ansible.com/ansible/latest/…
      • 是的,因为 POST 到 Jenkins 会导致数据被发送到 Ansible,我相信它会被解释两次。一次是通过 TCP/IP 尝试对其进行序列化,然后再次通过 Ansible 想要在 --extra-vars 选项中结构化的数据的方式。所以事情必须正确地结构化和转义。我解决了上面的问题。
      • 啊。是的,我没有注意到这是你的另一个答案。这基本上是在做同样的事情。
      • 是的。不过谢谢你的建议。我最初尝试过类似的东西,但它抛出了错误,你的没有。它可能对这个项目的不同部分有用,所以谢谢。
      猜你喜欢
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 2021-05-26
      相关资源
      最近更新 更多