Ich habe etwas unerwartetes Verhalten reduziert (für mich) in Jenkins Pipeline stark auf die folgenden: Erstellen Sie eine Jenkins Pipeline-Projekt mit dem folgenden Skriptcode:unerwartetes Verhalten in Jenkins Pipeline Groovy: .each Iterieren nicht
def a = ['a','b','c']
def ctx = [ alljobs: a ]
def say(s) {println "$s"}
@NonCPS
def fn(ctx) {
say "ctx.alljobs=$ctx.alljobs"
ctx.alljobs.each { j -> say "$j" }
say "done"
}
say "before fn()"
fn(ctx)
say "after fn()"
Als ich dies ausführen in einem Groovy Interpreter außerhalb von Jenkins (weniger @NonCPS), erhalte ich die Ausgabe ich erwartet hatte:
before fn()
ctx.alljobs=[a, b, c]
a
b
c
Done.
after fn()
Als ich die Jenkins Pipeline Job ausgeführt ich folgendes sehen:
Started by user John Elion (john.elion)
[Pipeline] echo
before fn()
[Pipeline] echo
ctx.alljobs=[a, b, c]
[Pipeline] echo
after fn()
[Pipeline] End of Pipeline
Finished: SUCCESS
Die .each wird überhaupt nicht ausgeführt (ich habe auch gesehen, dass es einmal ausgeführt wurde - was mich dazu veranlasste, auf ein einfaches Code-Snippet zu reduzieren), und die Funktion wird aufgegeben - das Sagen nach der Schleife ist nicht gedruckt, aber das Sagen nach der Funktion wird ausgeführt.
Ich habe versucht, verschiedene Blöcke in try-catch zu wickeln, um zu sehen, ob eine Ausnahme auftritt, aber kein Glück. Fehle ich etwas? Bin ich falsch, wenn ich das Verhalten erwarte, das ich in dem groovigen Interpreten außerhalb von Jenkins sehe?
Pipeline-Bug? Oder fehlt mir etwas?
Ich führe auf Jenkins v2.44. Es ist eine fest abgesperrte Umgebung; Ich weiß, dass es auf irgendeiner Art Linux läuft; Ich glaube, ich habe Workflow-cps "Pipeline: Groovy" v2.26, und ich bin mir nicht sicher, welche andere Pipeline oder andere Plugins relevant sind.
Vielen Dank.
Ein von mehreren Situationen wo Jenkins nicht genügend Informationen (oder keine) zur Verfügung stellt, wenn Sie in Ihrem Skript etwas falsch gemacht haben. –