2015-01-13 5 views
18

나는 다음과 같은 JobDSL 사양이 있습니다젠킨스 JobDSL 코드를 리팩토링하는 방법은 무엇입니까?

job { 
    steps { 
    gradle('generateLock saveLock', '-PdependencyLock.includeTransitives=true', true) { node -> 
     node/wrapperScript('${NEBULA_HOME}/gradlew') 
    } 
    gradle('check', '', true) { node -> 
     node/wrapperScript('${NEBULA_HOME}/gradlew') 
    } 
    } 
} 
내가 함수에, 공통 코드, 말을 리팩토링하고 싶습니다

:

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

그러나 gradle 기능은 내에서 표시되지 않습니다 gradlew 기능. 이 작업을 수행하는 올바른 방법은 무엇입니까?

답변

24

중괄호는 Groovy 클로저를 구성합니다. 각 클로저에는 메서드 호출이 전달되는 대리 객체가 있습니다. 그리고 대리인은 delegate 속성을 통해 액세스 할 수 있습니다. 해당 델리게이트를 헬퍼 함수에 전달하여 메소드에 액세스 할 수 있습니다.

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

일반적으로 사용되는 코드를 추출하는 방법에 대한 프로젝트 위키에서 몇 가지 명시적인 예를 사용하는 것이 좋습니다. 우리는 꽤 오랫동안 똑같은 것을 찾고있었습니다. –

+3

구성 블록에 대한 작업 DSL 위키 페이지를 업데이트 할 예정입니다. https://github.com/jenkinsci/job-dsl-plugin/pull/683을 참조하십시오. – daspilker

+0

노드 -> 노드/뒤에 슬래시는 어떻게됩니까? ..? – sloven