2015-01-13 22 views
18

Mam następujący JobDSL specyfikację:Jak naprawić wspólny kod JobDSL Jenkins?

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

Chciałbym byłaby wspólny kod, powiedzmy, do funkcji:

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

ale funkcja gradle nie jest widoczny z obrębie Funkcja gradlew. Jak to zrobić?

Odpowiedz

24

Kręcone klamry tworzą zamknięcie Groovy. Każde zamknięcie ma obiekt uczestnika, do którego są kierowane wywołania metod. Dostęp do delegata można uzyskać za pośrednictwem właściwości delegate. Możesz przekazać tego delegata do funkcji pomocnika, aby uzyskać dostęp do jego metod.

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

Polecam zrobić kilka wyraźnych przykładów na wiki projektu, jak wyodrębnić powszechnie używany kod. Szukaliśmy tego samego od dłuższego czasu. –

+3

Mam zamiar zaktualizować stronę wiki DSL zadania o blokach konfiguracyjnych, zobacz https://github.com/jenkinsci/job-dsl-plugin/pull/683 – daspilker

+0

Co robi ukośnik naprzód po węźle -> węzeł /. ..? – sloven