2016-01-21 2 views
0

Я использую Job DSL, чтобы определить задание, требующее нескольких шагов maven для запуска. Это пример:Reuse maven step in Jenkins Job DSL

def mavenInst = 'maven-3x' 
job('test') { 
    steps{   
    maven { 
     mavenInstallation(mavenInst)  
     goals('fuu') 
    } 
    maven { 
     mavenInstallation(mavenInst)  
     goals('bar') 
    } 
    // more steps of the same form. 
    maven { 
     mavenInstallation(mavenInst)  
     goals('fuu bar') 
    } 
    } 
} 

Таким образом, большая часть кода повторяется довольно часто.

Возможно ли сделать выпиской соответствующих частей описания должностных обязанностей и вызвать их из DSL задания? Я представляю что-то вроде этого:

def mavenInst = 'maven-3x' 
job('test') { 
    steps{     
    myCustomStep('fuu') 
    myCustomStep('bar') 
    // more steps of the same form. 
    myCustomStep('fuu bar') 
    } 
} 

Это приведет к значительно меньшему количеству кода и будет легче изменить в будущем.

Я читал, что этапы нуждаются в каком-то контексте, но я не могу понять, как это сделать. Я попытался извлечь блок в замыкание конфигурирования, как это:

def fuubar = { it -> 
    mavenInstallation(mavenInst) 
    goals('fuu bar') 
} 

Но когда я называю элемент с configure fuubar, ничего не отображается в результате работы configure.xml.

Любая помощь будет оценена по достоинству.

ответ

1

Я думаю, что вы можете сделать это

job('test') { 
    steps { 
     maven { 
      mavenInstallation('maven-3x')  
      goals('fuu') 
      goals('bar') 
      goals('fuu bar') 
     } 
    } 
} 

на основе excellent help

, а также в dsl playground

, который дает вам это

<!-- 1. test --> 
<project> 
    <actions></actions> 
    <description></description> 
    <keepDependencies>false</keepDependencies> 
    <properties></properties> 
    <scm class='hudson.scm.NullSCM'></scm> 
    <canRoam>true</canRoam> 
    <disabled>false</disabled> 
    <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding> 
    <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding> 
    <triggers class='vector'></triggers> 
    <concurrentBuild>false</concurrentBuild> 
    <builders> 
     <hudson.tasks.Maven> 
      <targets>fuu bar fuu bar</targets> 
      <mavenName>maven-3x</mavenName> 
      <jvmOptions></jvmOptions> 
      <usePrivateRepository>false</usePrivateRepository> 
     </hudson.tasks.Maven> 
    </builders> 
    <publishers></publishers> 
    <buildWrappers></buildWrappers> 
</project> 

EDIT

Перечитывая свой вопрос, кажется, что это пример.

Вышесказанное также может быть написана

def goal_names = ['fuu', 'bar', 'fuu bar'] 

job('test') { 
     steps { 
      maven { 
       mavenInstallation('maven-3x')  
       goal_names.each { goal -> 
       goals(goal) 
       } 
      } 
     } 
    } 

EDIT 2 использовать отдельные шаги

def goal_names = ['fuu', 'bar', 'fuu bar'] 
job('test') { 
    steps { 
    goal_names.each { goal -> 
     maven { 
     mavenInstallation('maven-3x')  
     goals(goal) 
     } 
    } 
    } 
} 

XML

<!-- 1. test --> 
<project> 
    <actions></actions> 
    <description></description> 
    <keepDependencies>false</keepDependencies> 
    <properties></properties> 
    <scm class='hudson.scm.NullSCM'></scm> 
    <canRoam>true</canRoam> 
    <disabled>false</disabled> 
    <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding> 
    <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding> 
    <triggers class='vector'></triggers> 
    <concurrentBuild>false</concurrentBuild> 
    <builders> 
     <hudson.tasks.Maven> 
      <targets>fuu</targets> 
      <mavenName>maven-3x</mavenName> 
      <jvmOptions></jvmOptions> 
      <usePrivateRepository>false</usePrivateRepository> 
     </hudson.tasks.Maven> 
     <hudson.tasks.Maven> 
      <targets>bar</targets> 
      <mavenName>maven-3x</mavenName> 
      <jvmOptions></jvmOptions> 
      <usePrivateRepository>false</usePrivateRepository> 
     </hudson.tasks.Maven> 
     <hudson.tasks.Maven> 
      <targets>fuu bar</targets> 
      <mavenName>maven-3x</mavenName> 
      <jvmOptions></jvmOptions> 
      <usePrivateRepository>false</usePrivateRepository> 
     </hudson.tasks.Maven> 
    </builders> 
    <publishers></publishers> 
    <buildWrappers></buildWrappers> 
</project> 
+0

Второй подход почти что Мне нужно, хотя мне еще нужно выполнить _сепарационные шаги. Я думаю, что я могу повторить аналогичный путь над _goals_ и создать записи ** maven **. – Behe

+0

Я добавил еще один пример – KeepCalmAndCarryOn

+1

ОК, он решил проблему с вопроса, но что, если он использовал что-то другое для строительства? Или что, если у него было несколько строк кодов, которые повторяются много раз в скрипте? Можно ли создавать собственные методы для добавления некоторых фрагментов кода и вызова их в соответствующих местах? –

1

мне удалось решить, что с тех пор я похож вопрос, и я хотел иметь reusab le с настройкой. Я не уверен, можно ли инкапсулировать кратные шаги в методе, но вы можете инкапсулировать закрытие так:

Closure runInLatestInstallation(String moduleName, String mavenGoals) { 
    return { 
     rootPOM("${moduleName}/pom.xml") 
     goals(mavenGoals) 
     mavenInstallation('Latest') 
    } 
} 

и вы можете назвать это так:

maven runInLatestInstallation(moduleName, 'versions:update-parent') 
Смежные вопросы