2015-01-13 14 views
18

Ho il seguente spec JobDSL:Come refactoring comune codice 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') 
    } 
    } 
} 

mi piacerebbe refactoring del codice comune, per esempio, in una funzione:

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

Ma la funzione gradle non è visibile all'interno del gradlew funzione. Qual è il modo giusto per farlo?

risposta

24

Le parentesi graffe formano una chiusura Groovy. Ogni chiusura ha un oggetto delegato a cui vengono indirizzate le chiamate al metodo. E il delegato è accessibile tramite la proprietà delegate. Puoi passare quel delegato alla funzione helper per ottenere l'accesso ai suoi metodi.

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

Si consiglia di fare alcuni esempi espliciti sul wiki del progetto su come estrarre il codice comunemente utilizzato. Stavamo cercando la stessa cosa da un po 'di tempo. –

+3

Ho intenzione di aggiornare la pagina wiki Job DSL sui blocchi di configurazione, vedere https://github.com/jenkinsci/job-dsl-plugin/pull/683 – daspilker

+0

Cosa fa la barra diretta dopo il nodo -> nodo /. ..? – sloven

Problemi correlati