暂时禁用System Groovy中Jenkins服务器上的SCM轮询

问题描述 投票:4回答:3

我们有一台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中一定是可行的......只是不确定如何。这里有人有什么想法吗?

非常感谢

jenkins groovy version-control
3个回答
4
投票

您可以仅禁用具有SCM轮询触发器的那些作业。这个groovy脚本会这样做:

Hudson.instance.items.each { job ->
  if ( job.getTrigger(  hudson.triggers.SCMTrigger ) != null ) {
    println "will disable job ${job.name}"
    job.disable()
  }
}

重新启用作业将留作练习:)


0
投票
  1. 如果它是一个或两个配置为执行SCM轮询的构建,则可以进入每个构建的配置并取消选中该框。就这么简单:)
  2. 如果您正在使用jenkins作业构建器,则一次更改多个作业的配置应该更容易。
  3. 如果你使用奴隶甚至是主人,SCM轮询依赖于JAVA?从主机jenkins中配置JAVA暂时从机器中删除JAVA;)轮询将失败:P这是一个愚蠢的黑客;)

我希望有所帮助!! ?


0
投票

尝试按照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

已知限制:

  • 仅支持单行“Schedule”(spec属性)
© www.soinside.com 2019 - 2024. All rights reserved.