如何使用 Jenkins DSL 为所有作业设置作业超时
How can I set the job timeout for all jobs 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
我做错了什么?
Job-DSL 插件只能用于维护之前由该插件创建的作业。您正在尝试修改以其他方式创建的作业的配置 -- 这将不起作用。
对于现有作业的大量修改(例如,在您的情况下,添加超时),最直接的方法是直接更改作业的 XML 规范,
- 通过更改磁盘上的
config.xml
文件,或者
- 使用 REST 或 CLI API
xmlstarlet 是直接在 shell 级别上执行此类任务的强大工具。
或者,可以通过 "Script Console" 中的 Groovy 脚本执行更改——但为此您需要对 Jenkins 的内部工作原理和数据结构有所了解。
我读了
根据 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
我做错了什么?
Job-DSL 插件只能用于维护之前由该插件创建的作业。您正在尝试修改以其他方式创建的作业的配置 -- 这将不起作用。
对于现有作业的大量修改(例如,在您的情况下,添加超时),最直接的方法是直接更改作业的 XML 规范,
- 通过更改磁盘上的
config.xml
文件,或者 - 使用 REST 或 CLI API
xmlstarlet 是直接在 shell 级别上执行此类任务的强大工具。
或者,可以通过 "Script Console" 中的 Groovy 脚本执行更改——但为此您需要对 Jenkins 的内部工作原理和数据结构有所了解。