2017-02-15 11 views
0

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.

Antwort

0

Die einfache Antwort ist, dass "say" @NonCPS sein muss. Dann funktioniert es wie erwartet.

Der Grund dafür, dass eine Ausnahme auftritt, liegt darin, dass @NonCPS implementiert ist, um eine Ausnahme auszulösen, die intern abgefangen und behandelt wird. Die technischen Details finden Sie unter https://github.com/jenkinsci/workflow-cps-plugin/blob/master/README.md.

Es scheint, der Dolmetscher sollte einen Benutzer sichtbare Fehler erhöhen, wenn eine @NonCPS Funktion eine CPS-fähige Funktion aufruft, anstatt still die Funktion abgebrochen und mit der Pipeline weitergehen ...

+2

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. –

Verwandte Themen