如何使用Jenkins DSL为所有作业设置作业超时

时间:2016-06-14 14:29:11

标签: jenkins groovy jenkins-job-dsl

我读了How can I set the job timeout using the Jenkins DSL。这设置了一个作业的超时。我想为所有工作设置它,并设置略有不同:150%,平均超过10个工作,最多30分钟。

根据relevant job-dsl-plugin documentation我应该使用这种语法:

job('example-3') {
    wrappers {
        timeout {
            elastic(150, 10, 30)
            failBuild()
            writeDescription('Build failed due to timeout after {0} minutes')
        }
    }
}

我在http://job-dsl.herokuapp.com/进行了测试,这是相关的XML部分:

<buildWrappers>
    <hudson.plugins.build__timeout.BuildTimeoutWrapper>
        <strategy class='hudson.plugins.build_timeout.impl.ElasticTimeOutStrategy'>
            <timeoutPercentage>150</timeoutPercentage>
            <numberOfBuilds>10</numberOfBuilds>
            <timeoutMinutesElasticDefault>30</timeoutMinutesElasticDefault>
        </strategy>
        <operationList>
            <hudson.plugins.build__timeout.operations.FailOperation></hudson.plugins.build__timeout.operations.FailOperation>
            <hudson.plugins.build__timeout.operations.WriteDescriptionOperation>
                <description>Build failed due to timeout after {0} minutes</description>
            </hudson.plugins.build__timeout.operations.WriteDescriptionOperation>
        </operationList>
    </hudson.plugins.build__timeout.BuildTimeoutWrapper>
</buildWrappers>

我使用之前手动编辑的作业进行了验证,并且XML是正确的。所以我知道Jenkins DSL语法到此为止是正确的。

现在我想将它应用于所有工作。首先,我尝试列出所有工作名称:

import jenkins.model.*

jenkins.model.Jenkins.instance.items.findAll().each {
  println("Job: " + it.name)
}

这也有效,所有作业名称都打印到控制台。

现在我想将它们全部插入。这是我使用的完整代码:

import jenkins.model.*

jenkins.model.Jenkins.instance.items.findAll().each {
  job(it.name) {
    wrappers {
      timeout {
        elastic(150, 10, 30)
        failBuild()
        writeDescription('Build failed due to timeout after {0} minutes')
      }
    }
  }
}

当我推送此代码并且Jenkins运行DSL种子作业时,我收到此错误:

ERROR: Type of item "jobname" does not match existing type, item type can not be changed

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

Job-DSL插件只能用于维护之前由该插件创建的作业。您正在尝试修改以其他方式创建的作业配置 - 这不起作用。

对于现有作业的大规模修改(例如,在您的情况下,添加超时),最直接的方法是直接更改作业的XML规范,

  • 通过更改磁盘上的line[i+1]文件或
  • 使用REST或CLI API

xmlstarlet是一个在shell级别直接执行此类任务的强大工具。

或者,可以通过&#34;脚本控制台&#34;中的Groovy脚本执行更改。 - 但为此你需要了解詹金斯&#39;内部运作和数据结构。