Groovy 使用Jenkins作业DSL配置块在特定位置放置自定义步骤

Groovy 使用Jenkins作业DSL配置块在特定位置放置自定义步骤,groovy,jenkins,jenkins-job-dsl,Groovy,Jenkins,Jenkins Job Dsl,使用job dsl插件,我试图编写大量Jenkins作业的配置脚本,这些作业以前都是手动配置的 这些作业的一种风格有多个步骤,包括使用XShell插件的两个步骤,作业dsl不直接支持这一点。但是,我应该能够通过使用自定义的“配置”块来解决这个问题 在使用“工作DSL游乐场”时,我已经做到了: job { name 'my-job' jdk('JDK-17') steps { configure { node -> node / builders {

使用job dsl插件,我试图编写大量Jenkins作业的配置脚本,这些作业以前都是手动配置的

这些作业的一种风格有多个步骤,包括使用XShell插件的两个步骤,作业dsl不直接支持这一点。但是,我应该能够通过使用自定义的“配置”块来解决这个问题

在使用“工作DSL游乐场”时,我已经做到了:

job {
  name 'my-job'
  jdk('JDK-17')

  steps {
    configure { node ->
      node / builders {
        'hudson.plugins.xshell.XShellBuilder'(plugin: 'xshell@0.9') {
            commandLine('run-me-as-the-first-build-step')
            executeFromWorkingDir('true')
        }
      }        
    }

    maven {
    mavenInstallation('Default')
    goals('clean')
        goals('verify')
        property('prop1', 'value1')
        property('user.timezone', 'UTC')
        mavenOpts('--batch-mode')
    }

    maven {
    mavenInstallation('Default')
        goals('deploy')
        property('prop2', 'value2')
        property('user.timezone', 'UTC')
        mavenOpts('--batch-mode')
    }

    shell('shell-task')

    configure { node ->
      node / builders {
        'hudson.plugins.xshell.XShellBuilder'(plugin: 'xshell@0.9') {
            commandLine('run-me-as-the-last-build-step')
            executeFromWorkingDir('true')
        }
      }        
    }
  }
}
如果我只包含第一个configure块,我会在第一步位置得到第一个命令。但是当第二个(最后一个)configure块出现时,
“node/builders”
再次匹配第一个元素并覆盖它,因此
运行我,因为最后一个步骤是第一个也是唯一的XShellBuilder。我寻求的输出类似于:

    <project>
    ...
    <builders>
        <hudson.plugins.xshell.XShellBuilder plugin='xshell@0.9'>
            <commandLine>run-me-as-the-first-build-step</commandLine>
            <executeFromWorkingDir>true</executeFromWorkingDir>
        </hudson.plugins.xshell.XShellBuilder>
        <hudson.tasks.Maven>
            <targets>clean verify</targets>
            <properties>prop1=value1
user.timezone=UTC</properties>
            <mavenName>Default</mavenName>
            <jvmOptions>--batch-mode</jvmOptions>
            <usePrivateRepository>false</usePrivateRepository>
        </hudson.tasks.Maven>
        <hudson.tasks.Maven>
            <targets>deploy</targets>
            <properties>prop2=value2
user.timezone=UTC</properties>
            <mavenName>Default</mavenName>
            <jvmOptions>--batch-mode</jvmOptions>
            <usePrivateRepository>false</usePrivateRepository>
        </hudson.tasks.Maven>
        <hudson.tasks.Shell>
            <command>shell-task</command>
        </hudson.tasks.Shell>
        <hudson.plugins.xshell.XShellBuilder plugin='xshell@0.9'>
            <commandLine>run-me-as-the-last-build-step</commandLine>
            <executeFromWorkingDir>true</executeFromWorkingDir>
        </hudson.plugins.xshell.XShellBuilder>
    </builders>
    ...
    </project>

...
运行我作为第一个构建步骤
真的
清查
prop1=值1
user.timezone=UTC
违约
--批处理模式
假的
部署
prop2=值2
user.timezone=UTC
违约
--批处理模式
假的
shell任务
运行我作为最后的构建步骤
真的
...
我无法理解Groovy XML/Job DSL语法,无法将第二个块作为“最后一个孩子”插入;Job DSL或Groovy XMLParser专家能否给我一个指针,说明如何在
的孩子中的任意位置进行匹配和插入

(我很感激我可以将
job(type:Maven)
preBuildSteps
postBuildSteps
结合使用,但实际上,我还需要一些其他东西,这是纯Maven工作所不能做到的。)
谢谢!

您可以使用
获得它,并且配置必须在步骤之外,谢谢
job {
  name('foo')
  steps {
    shell('echo AAA')
  }
  configure {
    it / builders << 'hudson.plugins.xshell.XShellBuilder' {
      commandLine('123')
    }
  }
  steps {
    shell('echo BBB')
  }
  configure {
    it / builders << 'hudson.plugins.xshell.XShellBuilder' {
      commandLine('456')
    }
  }
}