0

我正在使用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')
    }
  }
}

因此,许多代码经常重复。

是否可以提取职位描述的各个部分并从 Job 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 中没有显示任何内容。

任何帮助,将不胜感激。

4

2 回答 2

1

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

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

你可以这样称呼它:

maven runInLatestInstallation(moduleName, 'versions:update-parent')
于 2016-08-18T14:34:40.380 回答
1

我认为你可以做到这一点

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

基于出色的帮助

也在dsl 操场上

这给了你这个

<!-- 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>
于 2016-01-21T21:51:34.297 回答