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



我们有一个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属性)
  1. 如果有一个或两个构建被配置为执行SCM轮询,您可以进入每个构建的配置并取消选中该框。就这么简单:)

  2. 如果你正在使用jenkins job builder,它应该更容易一次更改几个作业的配置。

  3. 如果您使用从服务器,甚至在主服务器上,SCM轮询依赖于JAVA ?暂时从master jenkins中配置的位置删除JAVA;)

我希望这有帮助!!div ?

最新更新