Jenkins pipeline - Comment parcourir une liste
Je suis tenu de lire les valeurs d'un fichier dans mon pipeline. Je suis en utilisant split() qui les met dans une Tableau. J'ai besoin de les mettre dans un Arraylist donc je suis en utilisant Tableaux.asList(). Le problème que je rencontre est que je ne suis pas en mesure d'utiliser le size() ou length() méthodes donc je ne peux pas faire une boucle for comme
for (ii = 0; ii < var.length; ii++)
ou
for (ii = 0; ii < var.size; ii++)
parce que je reçois l'erreur: non classifié champ de java.util.Tableaux$ArrayList longueur
J'ai donc essayé d'utiliser une boucle for each, mais quand je prends un peu d'action (comme la commande ls par exemple) dans mon bloc finally il ne parcourt 1 fois. Mais si je viens de lancer la commande 'echo' il itère pour chaque élément comme il est censé le faire. Des conseils sur la façon de modifier mon code pour obtenir l'itération pour chaque élément de la liste lors de l'utilisation de n'importe quelle commande?
Fonctionne correctement....
node{
wrap([$class: 'ConfigFileBuildWrapper', managedFiles: [[fileId: 'dest_hosts.txt', targetLocation: '', variable: 'DEST_HOST']]]) {
HOST = Arrays.asList(readFile(env.DEST_HOST).split("\\r?\\n"))
deploy(HOST)
}
}
@NonCPS
def deploy(host){
for (String target : host){
try {
echo target
}
finally {
echo target
}
}
}
De SORTIE (itérations pour chaque élément):
[Pipeline] node
Running on <obfuscated>
[Pipeline] {
[Pipeline] wrap
provisoning config files...
copy managed file [<obfuscated>] to file:/var/lib/jenkins/<obfuscated>
[Pipeline] {
[Pipeline] readFile
[Pipeline] echo
www.testhost.com
[Pipeline] echo
www.testhost.com
[Pipeline] echo
www.testhost2.com
[Pipeline] echo
www.testhost2.com
[Pipeline] }
Deleting 1 temporary files
[Pipeline] //wrap
[Pipeline] }
[Pipeline] //node
[Pipeline] End of Pipeline
Finished: SUCCESS
Mais si je prends un peu d'action, tels que 'ls-l' il ne parcourt 1 fois
node{
wrap([$class: 'ConfigFileBuildWrapper', managedFiles: [[fileId: 'dest_hosts.txt', targetLocation: '', variable: 'DEST_HOST']]]) {
HOST = Arrays.asList(readFile(env.DEST_HOST).split("\\r?\\n"))
deploy(HOST)
}
}
@NonCPS
def deploy(host){
for (String target : host){
try {
echo target
}
finally {
sh 'ls -l'
}
}
}
De SORTIE (uniquement itère 1 heure):
[Pipeline] node
Running on <obfuscated>
[Pipeline] {
[Pipeline] wrap
provisoning config files...
copy managed file [<obfuscated>] to file:/var/lib/jenkins/<obfuscated>
[Pipeline] {
[Pipeline] readFile
[Pipeline] echo
www.testhost.com
[Pipeline] sh
[sandbox%2Fpipeline-test-new1] Running shell script
+ ls -l
total 8
-rw-r--r-- 1 jenkins jenkins 10 Jun 17 16:07 someFile
[Pipeline] }
Deleting 1 temporary files
[Pipeline] //wrap
[Pipeline] }
[Pipeline] //node
[Pipeline] End of Pipeline
Finished: SUCCESS
OriginalL'auteur mdo123 | 2016-07-07
Vous devez vous connecter pour publier un commentaire.
ArrayList
(et généralementLists
) n'ont pas la longueur ou la taille de champ, ils ont unsize()
méthode. Donc, utilisez-la dans le pour:Je suis maintenant en train de vivre quelque chose de similaire. Aussi loin que je peux dire, c'est lié à la
sh
appel. Avez-vous comprendre quelque chose à ce sujet?non désolé, je n'avais pas penser à ça. J'ai juste utilisé @ krzyk de la réponse, mais j'ai refusés @ krzyk de répondre parce que je pense qu'une partie de la réponse devrait inclure une explication sur le comportement que j'ai décrit ci-dessus. Plus précisément, pourquoi la boucle for each travailler avec "echo" dans le bloc finally mais seulement itère une fois quand sh commande est exécutée. J'ai pensé que peut-être le sh cmd était de retour non nulle, mais pour chaque boucle doit se poursuivre pour chaque élément, donc je ne suis pas sûr.
pouvez vous s'il vous plaît mettre à jour votre réponse à inclure des explications sur les raisons de la boucle for each fonctionne de la commande echo, mais pas le poisson commande?
OriginalL'auteur Krzysztof Krasoń
Que par ce tutoriel: https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md#serializing-local-variables
Dans votre cas, le
sh
appel est un pipeline étape de l'opération, qui apparemment vous ne pouvez pas effectuer à l'intérieur d'un@NonCPS
méthode annotée.Concernant la transformation d'un tableau dans un
List
, alors puisque nous sommes dans le Groovy de la terre, vous pouvez simplement utiliser le.toList()
méthode de la matrice.OriginalL'auteur Olaf
Je ne peux pas vous dire PRÉCISÉMENT pourquoi, comme je n'ai pas compris comment trouver des informations utiles sur Jenkins sans passer des heures sur google, mais je peux vous dire ceci:
Pendant un moment j'ai pensé que vous pouvez le faire fonctionner correctement en ajoutant 'ligne echo' APRÈS le sh 'echo $ligne", mais qui s'est avéré être causée par Jenkins, l'exécution d'une PRÉCÉDENTE version du script...
J'ai essayé toutes sortes de choses et n'a pas fonctionné, puis j'ai trouvé ceci:
Pourquoi a chaque tour de boucle dans un Jenkinsfile s'arrête à la première itération
C'est un bug connu dans Jenkins pipeline!
(le bogue connu est JENKINS-26481, qui dit "Au moins quelques fermetures sont exécutées qu'une seule fois à l'intérieur de Groovy CPS DSL scripts géré par le flux de travail plugin")
OriginalL'auteur RustyCar
Je préfère cette solution:
Si vous utilisez un déclarative pipeline, vous devez placer l'appel à une instruction de script:
OriginalL'auteur Matthias M