在Jenkins dsl配置块中提供不同的值以创建不同的作业

时间:2017-03-24 20:17:13

标签: jenkins groovy jenkins-job-dsl

我需要我的构建在特定时间(截止日期)超时,但目前Jenkins dsl仅支持“绝对”策略。所以我尝试编写配置块,但无法创建具有不同截止时间值的作业。

def settings = [
    [
        jobname: 'job1',
        ddl: '13:10:00'
    ], 
    [
        jobname: 'job2',
        ddl: '14:05:00'
    ]
]


for (i in settings) {
    job(i.jobname) {
        configure {
            it / buildWrappers << 'hudson.plugins.build__timeout.BuildTimeoutWrapper' {
                strategy(class:'hudson.plugins.build_timeout.impl.DeadlineTimeOutStrategy') {
                    deadlineTime(i.ddl)
                    deadlineToleranceInMinutes(1)
                }
            }
        }
        steps {
            // some stuff to do here
        }
    }
}

上面的脚本给了我两个截止日期相同的工作(14:05:00):

<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></triggers>
    <concurrentBuild>false</concurrentBuild>
    <builders></builders>
    <publishers></publishers>
    <buildWrappers>
        <hudson.plugins.build__timeout.BuildTimeoutWrapper>
            <strategy class='hudson.plugins.build_timeout.impl.DeadlineTimeOutStrategy'>
                <deadlineTime>14:05:00</deadlineTime>
                <deadlineToleranceInMinutes>1</deadlineToleranceInMinutes>
            </strategy>
        </hudson.plugins.build__timeout.BuildTimeoutWrapper>
    </buildWrappers>
</project>

我找到了this question,但仍无法让它发挥作用。

2 个答案:

答案 0 :(得分:2)

您可以使用Automatic Generated API

The generated DSL is only supported when running in Jenkins, e.g. it is
not available when running from the command line or in the Playground.

Use The Configure Block to generate custom config elements when not 
running in Jenkins.

The generated DSL will not work for all plugins, e.g. if a plugin does
not use the @DataBoundConstructor and @DataBoundSetter annotations to 
declare parameters. In that case The Configure Block can be used to 
generate the config XML.

幸运的是,Timeout插件支持DataBoundConstructors

@DataBoundConstructor
public DeadlineTimeOutStrategy(String deadlineTime, int deadlineToleranceInMinutes) {
    this.deadlineTime = deadlineTime;
    this.deadlineToleranceInMinutes = deadlineToleranceInMinutes <= MINIMUM_DEADLINE_TOLERANCE_IN_MINUTES ? MINIMUM_DEADLINE_TOLERANCE_IN_MINUTES
            : deadlineToleranceInMinutes;
}

所以你应该可以做一些像

这样的事情
def settings = [
    [
        jobname: 'job1',
        ddl: '13:10:00'
    ], 
    [
        jobname: 'job2',
        ddl: '14:05:00'
    ]
]


for (i in settings) {
    job(i.jobname) {          
        wrappers {
          buildTimeoutWrapper {
            strategy {
              deadlineTimeOutStrategy {
                deadlineTime(i.ddl)
                deadlineToleranceInMinutes(1)
              }
            }
            timeoutEnvVar('WHAT_IS_THIS_FOR')
          }
        }

        steps {
            // some stuff to do here
        }
    }
}

BuildTimeoutWrapper中有一个额外的图层,其中包含不同的策略

使用嵌套类时,需要将类的第一个字母设置为小写

修改

您可以使用作业页面中的“Job DSL API Reference”链接在自己的Jenkins安装中看到这一点

http://<your jenkins>/plugin/job-dsl/api-viewer/index.html#method/javaposse.jobdsl.dsl.helpers.wrapper.WrapperContext.buildTimeoutWrapper

enter image description here

答案 1 :(得分:0)

我在 Jenkins DSL groovy 脚本中看到了与此非常相似的行为。 我正在为每个循环遍历地图列表,并且我还有一个 configure 闭包,就像您的示例一样。

我看到的行为是 configure 闭包中的 Map 对象对于 for each 循环的所有迭代似乎都是相同的。类似于您看到相同的截止时间。 我实际上在配置闭包内外的 Map 中引用了相同的值,并且 DSL 输出了不同的值。 configure 闭包的外部符合预期,但内部所有迭代的值都相同。

我的解决方案只是使用一个变量来引用 Map 值,并在 configure 闭包内部和外部使用它,当我这样做时,值是一致的。

对于您的示例(只需添加一个 deadlineValue 变量,并将其设置在 configure 闭包之外):

for (i in settings) {
    def deadlineValue = i.ddl
    job(i.jobname) {
        configure {
            it / buildWrappers << 'hudson.plugins.build__timeout.BuildTimeoutWrapper' {
                strategy(class:'hudson.plugins.build_timeout.impl.DeadlineTimeOutStrategy') {
                    deadlineTime(deadlineValue)
                    deadlineToleranceInMinutes(1)
                }
            }
        }
        steps {
            // some stuff to do here
        }
    }
}

我不认为这会有所作为,但它对我有用。

但是我同意其他解决方案最好使用 buildTimeoutWrapper,这样您就可以避免使用配置块。

请参阅:<您的 Jenkins URL>/plugin/job-dsl/api-viewer/index.html#path/javaposse.jobdsl.dsl.DslFactory.job-wrappers-buildTimeoutWrapper -strategy-deadlineTimeOutStrategy 有关更多详细信息,显然您需要安装 Build Timeout 插件。

对于我的示例,我仍然需要 MultiJob 插件的 configure 闭包,其中某些参数仍然无法通过 DSL api 进行配置。