我阅读了如何使用Jenkins DSL设置作业超时。设置一项作业的超时时间。我想为所有作业设置它,并且设置略有不同:150%,平均超过10个作业,最多30分钟。
根据相关的job-dsl-plugin文档,我应该使用以下语法:
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
xmlstarlet是一个功能强大的工具,可直接在Shell级别执行此类任务。
另外,也可以通过“脚本控制台”中的Groovy脚本执行更改-但为此您需要对Jenkins的内部工作原理和数据结构有所了解。