Próbujemy iterować nad Map
, ale bez powodzenia. Zredukowaliśmy naszą problem z tym minimalnym przykład:Niemożliwość iteracji nad mapą za pomocą Groovy w ramach Jenkins Pipeline
def map = [
'monday': 'mon',
'tuesday': 'tue',
]
Jeśli spróbujemy iteracyjne z:
map.each{ k, v -> println "${k}:${v}" }
tylko pierwszy wpis jest wyjście: monday:mon
Alternatywy znamy nie są nawet w stanie wejść w pętlę:
for (e in map)
{
println "key = ${e.key}, value = ${e.value}"
}
lub
for (Map.Entry<String, String> e: map.entrySet())
{
println "key = ${e.key}, value = ${e.value}"
}
zawodzą, tylko pokazując zarówno wyjątek java.io.NotSerializableException: java.util.LinkedHashMap$Entry
. (co może być związane z wyjątkiem występującym podczas podnoszenia "prawdziwego" wyjątku, co uniemożliwia nam poznanie, co się stało).
Korzystamy z najnowszych stabilnych jenkinsów (2.19.1) z najnowszymi wtyczkami na dzień dzisiejszy (2016/10/20).
Czy istnieje rozwiązanie do iterowania elementów w pliku Map
w skrypcie Groovy dotyczącym potoku Jenkins?
Znaleźliśmy ten post po godzinnej walce z Jenkinsem. Konieczność przejścia przez tę walkę do prostej iteracji w rodzimej strukturze danych jest oburzająca! –
Jeśli chcesz zrobić coś skomplikowanego, to jest to pierwsza walka wielu. Oprócz samego Groovy'ego jest to PITA (zapisywanie cudzysłowów w zależności od kontekstu, tak abyś teraz musiał się uczyć, gdy nazwa oznacza zmienną, a gdy sznur, po tym, jak schemat "przechytrzył" twoją intencję), dodali dziwaczne błędy na górze i ograniczają prawie wszystko z języka bazowego.Następnie są zabawne zachowania wtyczek (Jeśli chcesz zapisać artefakt i jego brak, potok kontynuuje się i kończy na końcu). Żałuję, że nie poświęcałem czasu na to, by działało to trochę inaczej ... jak na przykład przy tworzeniu buildbota. –
Użyłem tego rozwiązania, ale nadal otrzymuję komunikat o błędzie: "org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Skrypty nie mogą używać nowych" (to jest nowa mapa mapToList) –