我们有一个Jenkins服务器,它正在运行20到30个作业。
由于构建过程相当复杂,我们将实际构建分解为1个子构建,其中一些可以并发运行,其他必须遵循先前的构建步骤。因此,我们将每个构建步骤分成3组,这些组在构建过程中会阻塞。
例如:Main Build : GroupA : Builds A1, A2 & A3
: GroupB : Builds B1, B2 & B3
: GroupC : Builds C1, C2, C3, C4, C5 & C6
: GroupD : HW_Tests T1, T2, T3, T4 & T5
Builds B1, B2 & B3 rely on the output from A1, A2, A3 etc
因为有构建和测试运行几乎24/7,我发现很难安排重新启动詹金斯大师。选择"准备关闭"将意味着新作业排队,但它总是会阻塞正在运行的作业,因为,使用上面的例子,如果GroupB处于活动状态,构建C1、C2等也将排队,并且主构建将被阻塞。
作为一种解决方法,我想在所有运行的作业完成之前禁用服务器上的SCM轮询。这将防止新作业被触发,但也允许正在运行的作业完成。然后我可以重启Jenkins,重新启用SCM轮询,允许正常服务恢复。
我们使用的SCM是Perforce。
我没有找到任何地方表明上述是可能的,但是,我确信它在System Groovy中一定是可行的…只是不知道该怎么做。有人有什么想法吗?
多谢
您可以仅禁用那些具有SCM轮询触发器的作业。下面的groovy脚本将完成这个操作:
Hudson.instance.items.each { job ->
if ( job.getTrigger( hudson.triggers.SCMTrigger ) != null ) {
println "will disable job ${job.name}"
job.disable()
}
}
重新启用作业将作为练习:)
Jenkins 2.204.1 +使用groovy脚本控制台禁用SCM触发器的所有作业的版本:
Jenkins.instance.getAllItems(Job.class).each{ job ->
if ( job.getSCMTrigger() != null ) {
println "will disable job ${job.name}"
job.setDisabled(true)
}
}
尝试以下Groovy脚本注释SCM轮询:
// WARNING: Use on your own risk! Without any warranty!
import hudson.triggers.SCMTrigger
import hudson.triggers.TriggerDescriptor
// from: https://issues.jenkins-ci.org/browse/JENKINS-12785
TriggerDescriptor SCM_TRIGGER_DESCRIPTOR = Hudson.instance.getDescriptorOrDie(SCMTrigger.class)
assert SCM_TRIGGER_DESCRIPTOR != null;
MAGIC = "#MAGIC# "
// comment out SCM Trigger
def disable_scmpoll_trigger(trig){
if ( !trig.spec.startsWith(MAGIC) ){
return new SCMTrigger(MAGIC + trig.spec)
}
return null
}
// enable commented out SCM Trigger
def enable_scmpoll_trigger(trig){
if ( trig.spec.startsWith(MAGIC) ){
return new SCMTrigger(trig.spec.substring(MAGIC.length()))
}
return null
}
Hudson.instance.items.each {
job ->
//println("Checking job ${job.name} of type ${job.getClass().getName()} ...")
// from https://stackoverflow.com/a/39100687
def trig = job.getTrigger( hudson.triggers.SCMTrigger )
if ( trig == null ) return
println("Job ${job.name} has SCMTrigger: '${trig.spec}'")
SCMTrigger newTrig = disable_scmpoll_trigger(trig)
// SCMTrigger newTrig = enable_scmpoll_trigger(trig)
if (newTrig != null ){
newTrig.ignorePostCommitHooks = trig.ignorePostCommitHooks
newTrig.job = job
println("Updating SCMTrigger '${trig.spec}' -> '${newTrig.spec}' for job: ${job.name}")
job.removeTrigger(SCM_TRIGGER_DESCRIPTOR)
job.addTrigger(newTrig)
job.save()
}
}
return ''
要再次启用SCM轮询,只需更改以下两行
//SCMTrigger newTrig = disable_scmpoll_trigger(trig)
SCMTrigger newTrig = enable_scmpoll_trigger(trig)
在Jenkins上测试过。2.121.3
已知限制:- 只支持单行"Schedule"(
spec
属性)
-
如果有一个或两个构建被配置为执行SCM轮询,您可以进入每个构建的配置并取消选中该框。就这么简单:)
-
如果你正在使用jenkins job builder,它应该更容易一次更改几个作业的配置。
-
如果您使用从服务器,甚至在主服务器上,SCM轮询依赖于JAVA ?暂时从master jenkins中配置的位置删除JAVA;)
我希望这有帮助!!div ?