L'impossibilité d'effectuer une itération sur une Carte à l'aide de Groovy dans Jenkins Pipeline
Nous essayons de faire une itération sur un Map
, mais sans succès. Nous avons réduit notre problème à ce minimum exemple:
def map = [
'monday': 'mon',
'tuesday': 'tue',
]
Si nous essayons d'itérer avec:
map.each{ k, v -> println "${k}:${v}" }
Seule la première est sortie: monday:mon
Les alternatives que nous connaissons ne sont même pas capables d'entrer dans la boucle:
for (e in map)
{
println "key = ${e.key}, value = ${e.value}"
}
ou
for (Map.Entry<String, String> e: map.entrySet())
{
println "key = ${e.key}, value = ${e.value}"
}
Sont défaillants, les deux ne montrant l'exception java.io.NotSerializableException: java.util.LinkedHashMap$Entry
. (qui pourrait être liée à une exception survenant tout en augmentant le "réel" d'exception, ce qui nous empêche de savoir ce qui s'est passé).
Nous sommes à l'aide de la dernière version stable jenkins (articles 2.19.1) avec tous les plugins à jour en date d'aujourd'hui (2016/10/20).
Est-il une solution pour itérer sur les éléments dans un Map
dans un Jenkins pipeline Groovy script ?
Vous devez vous connecter pour publier un commentaire.
Son été un certain temps depuis que j'ai joué avec cela, mais la meilleure façon de parcourir les cartes (et les autres conteneurs) a été avec le "classique" pour les boucles, ou "en". Voir Bug: une mauvaise Manipulation de méthodes binaires d'accepter la Fermeture
À votre problème spécifique, la plupart (tous?) pipeline DSL commandes permet d'ajouter un point de séquence, avec qui je veux dire, il est possible d'enregistrer l'état de la canalisation et de la reprendre à une date ultérieure. Penser à l'attente d'entrée utilisateur par exemple, vous voulez garder cet état, même à travers un redémarrage.
Le résultat est que chaque live instance doit être sérialisé - mais la Carte standard itérateur est malheureusement pas sérialisable. Fil D'Origine
La meilleure solution je peux trouver, c'est la définition d'une Fonction pour convertir une Carte dans une liste de serializable MapEntries. La fonction n'est pas en utilisant un pipeline étapes, de sorte que rien ne doit être sérialisable en son sein.
Cela doit évidemment être appelée pour chaque carte que vous souhaitez effectuer une itération, mais la hausse, que le corps de la boucle reste le même.
Vous aurez à approuver le
SimpleImmutableEntry
constructeur la première fois, ou bien vous pouvez contourner ce problème en plaçant le mapToList fonction dans la bibliothèque de flux de travail.Ou beaucoup plus simple