2015-01-13 6 views
18

Ich habe folgendes JobDSL spec:Wie wird der gängige Jenkins-JobDSL-Code umgestaltet?

job { 
    steps { 
    gradle('generateLock saveLock', '-PdependencyLock.includeTransitives=true', true) { node -> 
     node/wrapperScript('${NEBULA_HOME}/gradlew') 
    } 
    gradle('check', '', true) { node -> 
     node/wrapperScript('${NEBULA_HOME}/gradlew') 
    } 
    } 
} 

Ich mag würde den gemeinsamen Code Refactoring, sagen wir, in eine Funktion:

def gradlew(String tasks, String options) { 
    gradle(tasks, options, true) { node -> 
    node/wrapperScript('${NEBULA_HOME}/gradlew') 
    } 
} 

Aber die gradle Funktion innerhalb der nicht sichtbar ist gradlew Funktion. Was ist der richtige Weg, dies zu tun?

Antwort

24

Die geschweiften Klammern bilden einen Groovy-Abschluss. Jede Schließung hat ein Delegatobjekt, auf das Methodenaufrufe gerichtet sind. Und der Delegierte kann über die delegate Eigenschaft zugegriffen werden. Sie können diesen Delegaten an die Hilfsfunktion übergeben, um Zugriff auf die Methoden zu erhalten.

def gradlew(def context, String tasks, String options = '') { 
    context.gradle(tasks, options, true) { node -> 
    node/wrapperScript('${NEBULA_HOME}/gradlew') 
    } 
} 
job { 
    steps { 
    gradlew(delegate, 'generateLock saveLock', '-PdependencyLock.includeTransitives=true') 
    gradlew(delegate, 'check') 
    } 
} 
+3

Ich würde empfehlen, einige explizite Beispiele im Projekt Wiki zu finden, wie man häufig verwendeten Code extrahiert. Wir haben lange nach dem gleichen gesucht. –

+3

Ich werde den Job DSL Wiki-Seite zu konfigurieren Blöcke aktualisieren, siehe https://github.com/jenkinsci/job-dsl-plugin/pull/683 – daspilker

+0

Was der Schrägstrich nach Knoten macht -> node /. ..? – sloven