Wir machen in einigen unserer Jobs eine dynamische Erstellung von parallelen Schritten. Danke dieser Thread habe ich gefunden wie man die Karte dynamisch mit Parametern für den parallelen Schritt erstellt.
Nun wollte ich jedoch Teile des Codes wiederverwenden, die zum Erstellen dieser parallelen Schritte verwendet werden. Dafür denke ich, dass ich die Schließungen curry müsste.
Allerdings scheint das Curry nicht richtig zu funktionieren. Das Referenzieren der Schleifenvariablen (valueCopy) innerhalb des Abschlusses macht das Richtige ( wie hier erwähnt ) aber currying tut nicht das, was ich erwarten würde.
Mache ich etwas falsch, wird das (noch) nicht unterstützt, gibt es irgendwelche Umwege? Ist das wahrscheinlich ein Bug in Jenkins Pipeline?
Ich hoffe, jemand hat eine Ahnung, warum das nicht funktioniert und / oder wie es funktioniert.
Jenkins: LTS (2.32.1) & amp; neueste Plugin Updates ab dem 19.01.2017.
Pipeline-Skript ausgeführt:
def echoSome (val) { Echowert }
%Vor%Ausgabe:
%Vor%Erwartete Ausgabe:
%Vor%Gefunden, dass mit dem neuesten Pipeline: Groovy Plugin (2.40) mit mindestens Jenkins Version 2.60.3 kombiniert (funktioniert obwohl die Plug-in-Homepage besagt, dass Sie mindestens Jenkins 2.73.3 benötigen) funktioniert alles wie erwartet.
Ich bin mir nicht sicher, ob es die currying- oder die for-Schleife ist, aber diese Funktion muss als NonCPS markiert werden, wie hier beschrieben: Ссылка
Im Wesentlichen tun Sie das:
%Vor%Ich denke, es ist Ihre for-Schleife, aber unabhängig davon, wann immer Sie keine klassischen "C Style" -Schleifen verwenden, müssen Sie Ihre Funktion als NonCPS markieren.
Dies scheint eine Einschränkung der Groovy-Sprache oder der Jenkins-Groovy-Laufzeit zu sein. Ich bin mir nicht sicher, welche, aber es lohnt sich, ihre Beispiele genau so zu machen, wie sie es getan haben, indem sie eine neue Variable für jede Iteration der Schleife deklarieren .
Sie haben ihr Beispiel kommentiert
// frische Variable pro Iteration; Ich werde mutiert sein
Ich glaube nicht, dass die Verwendung von C-Style-Loops diese Einschränkung beseitigt und das Currying (was für diesen Anwendungsfall erforderlich wäre) löst das Problem ebenfalls nicht. Tollpatschig, aber einfach genug, um zu arbeiten.
Tags und Links jenkins parallel-processing closures jenkins-pipeline currying