2017-09-19 1 views
0

Ich verwende Jenkins, um ein Ansible-Playbook über den Befehl Publish Over SSH fernzuspielen.Jenkins - Array/Liste an parametriertes Remote-Build übergeben

Dieser Befehl:

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

ein Postbuild Aktion auslösen sollten Sie den folgenden Befehl über SSH remote auszuführen:

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

thisIsAList ist ein String-Parameter unter Job-Benachrichtigungen, und die Job ist parametrisiert. Ich habe ähnliche Befehle erfolgreich ausgeführt, aber dieser Befehl schlägt fehl, vermutlich weil der Wert eine Liste ist. Ich habe sowohl "String Parameter" als auch "Multi-line String Parameter" vergeblich versucht.

Hier ist der Stack-Trace:

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) 

Hinweis: Dies kann ein Duplikat How to pass an array to a jenkins parameterized job via remote access api? sein, aber es hat keine gültige Antwort bekommen.

Antwort

1

Da diese Verschachtelungsebene nirgendwo in der Jenkins oder Ansible Dokumentation beschrieben ist, werde ich etwas Licht auf das Thema werfen, jetzt wo ich mein Problem gelöst habe.

Der Befehl:

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

Sollte thisIsAList erklärt hat, ein Dictionary-Objekt zu sein. Dh:

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

Hinweis:

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

Darüber hinaus kann die Daten in dem cURL Befehl sollte anders wie so formatiert haben die doppelten Anführungszeichen sind rund um die ganze Liste , anstatt die einzelnen Elemente.

schließlich mit weiteren verschachtelten Elementen (wie dict innerhalb einer Liste), müssen Sie wie so die doppelten Anführungszeichen entkommen:

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

Es scheint, dass auf dieser Ebene der Verschachtelung, ist es nicht mehr erforderlich, um die Listen doppelt zu zitieren; wahrscheinlich, weil die Zitate eine Ebene höher führen, um sie richtig zu interpretieren.

1

Dies ist ein bisschen eine Vermutung, basierend auf einem ähnlichen Problem, das ich mit einem Auswahlparameter gesehen habe. Jede Dokumentation, die ich gefunden habe, scheint falsch zu sein, wie man damit umgeht. Es sollte keine Liste sein. Versuchen Sie, als eine Zeichenfolge mit Zeilenumbrüchen zu übergeben, die die Elemente trennen.

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

Lassen Sie mich wissen, ob das funktioniert. Ich bin daran interessiert es herauszufinden.


Edit: (basierend auf Kommentare)

Würde diese Arbeit:

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

Die verschachtelten Anführungszeichen ein bisschen hässlich. Wenn Sie Pipeline verwenden oder können die Daten in einem Shell-Skript massieren ersten, wäre es wahrscheinlich sauberer sein.

+1

ich Ihre Frage erneut zu lesen und ich denke, ich anfangs falsch verstanden. Ich sehe was du jetzt versuchst zu tun. Das Problem besteht nicht darin, dass die Daten in Jenkins übergeben werden (Sie können es als Zeichenfolge verwenden. Das Problem besteht darin, die Daten korrekt an Ansible zu senden. Es muss als JSON formatiert werden, um eine Liste zu übergeben. - -Extra-vars = '{ "test_list": [1,2,3]}' http://docs.ansible.com/ansible/latest/playbooks_variables.html#passing-variables-on-the-command- –

+0

Linie Ja, weil POSTen Jenkins bewirkt, dass die Daten an ansible gesendet werden, ich glaube, es zweimal interpretiert wird einmal durch TCP/IP versucht, es zu serialisieren, und dann wieder durch die Art und Weise ansible die Daten strukturiert in der 'will. - Extra-vars' Option. So Dinge strukturiert werden müssen und entkam richtig. ich löste das Problem oben though. –

+1

Ah. Ja, ich nicht feststellen, dass Ihre andere Antwort ist. das ist im Grunde tut der gleiche Sache. –

Verwandte Themen