重用Jenkins Job DSL中的maven步骤

时间:2016-01-21 18:38:57

标签: jenkins groovy jenkins-job-dsl

我正在使用 Job DSL 来定义需要运行多个maven步骤的作业。这是一个例子:

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调用元素时,生成的job.xml中没有显示任何内容。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分: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>

修改

重新阅读您的问题似乎就是一个例子。

以上也可以写成

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

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

编辑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>

答案 1 :(得分:1)

我设法解决了这个问题,因为我遇到了类似的问题,我希望自定义方法具有可重用的方法。我不确定是否可以在方法中封装多个步骤,但是你可以像这样封装闭包:

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

你可以这样称呼它:

maven runInLatestInstallation(moduleName, 'versions:update-parent')