我们有一台Jenkins服务器,运行在20到30个工作岗位之间。
由于构建过程相当复杂,我们将实际构建分解为1个子构建,其中一些可以同时运行,其他构建必须遵循以前的构建步骤。因此,我们将每个构建步骤分为3组,这些组在构建处于pogress时阻塞。
例如:
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
由于每周7天每天都在运行构建和测试,我发现很难安排重启Jenkins Master。选择“准备关机”将意味着新作业排队,但它总是会阻止正在运行的作业,因为,使用上面的示例,如果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()
}
}
重新启用作业将留作练习:)
我希望有所帮助!! ?
尝试按照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 ver。上测试过。 2.121.3
已知限制:
spec
属性)