2016-07-07 11 views
1

Ich habe der folgende Test Groovy Skript als vars-workflow-libs hinzugefügt werden:Der Zugriff auf diese Blöcke Jenkins Pipelines Skript

#!/usr/bin/groovy 

this.test = false 

def setTest(boolean test) { this.test = test } 

def getTest() { this.test } 

def log(level, msg) { 
    echo "[${level}] ${msg}" 
} 

def call(msg) { 
    if (this.test) log('TEST', msg) 
} 

Ich stelle dieses Skript unter workflow-libs/vars/test.groovy.

Wenn ich führen Sie die folgende Pipeline:

node { 
    test 'foo' 
} 

der Prozess nie abgeschlossen ist, aber wenn ich die if (this.test) entfernen dann endet es in der Regel, wenn ich feststellen, dass es ein Problem Zugriff auf this Objekt?

Wer hatte ein ähnliches Verhalten?

Jenkins ist die neueste Version zum Zeitpunkt 1.651.3.

Antwort

2

In groovy this.test ruft die automatisch generierte oder vorhandene Getter (doc). Ihr Skript steckte einfach in unendliche Rekursion.

Here wird erläutert, wie auf Felder in groovy direkt zugreifen, obwohl ich nicht sicher bin, dass es in Pipelines funktioniert.

Alternativ können Sie auch nur eine scriptweite Variable test anstelle von this.test verwenden. Oder benennen Sie this.test in etwas anderes als Namen der Accessormethoden wie this._test um.

+0

Dank @izzeki Ihr Hinweis führte schließlich zu mir mehr zu graben das Objekt und fand heraus, dass der eigentliche Parameter befindet sich unter this.binding.variables, die eine Karte obje ist ct Ich werde das Ergebnis als eine Antwort setzen, wenn jemand interessiert ist oder eine bessere Lösung bieten kann – tbo

+0

Sure @ tbo. Sie können es auch nützlich finden zu wissen, dass die Bindung nicht serialisierbar ist, aber es hat 'Map getVariables()' Methode. – izzekil

0

schließlich gelang es mir über dieses Problem passieren, indem die binding Objekt von this wie folgt verwendet: (!, Wenn er gesetzt ist)

def enableTest(enable = true) { 
    // this goes to binding variables 
    this.test = enable } 

die Variable Satz zu verwenden

if (this.binding.variables['test'] && this.test) { 
    // do something usefull 
} 

es Hoffnung hilft