【问题标题】:Temporarily disable SCM polling on Jenkins Server in System Groovy在 System Groovy 中临时禁用 Jenkins 服务器上的 SCM 轮询
【发布时间】:2016-08-23 10:56:27
【问题描述】:

我们有一个 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 运行构建和测试,我发现很难安排 Jenkins Master 的重启。选择“准备关闭”将意味着新作业排队,但它总是会阻止正在运行的作业,因为使用我上面的示例,如果 GroupB 处于活动状态,构建 C1、C2 等也将排队,主构建将被屏蔽。

作为一种解决方法,我想在所有正在运行的作业完成之前禁用服务器上的 SCM 轮询。这将防止新作业触发,但也允许正在运行的作业完成。然后我可以重新启动 Jenkins 并重新启用 SCM 轮询,从而恢复正常服务。

我们使用的 SCM 是 Perforce。

我无法找到任何表明上述可能的地方,但是,我确信它在 System Groovy 中一定是可行的......只是不确定如何。请问这里有人有什么想法吗?

非常感谢

【问题讨论】:

    标签: jenkins groovy version-control


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢@alex-o 我认为这是必须的方法,因为似乎没有一种系统范围的方法可以暂停 SCM 轮询一段时间。这是我试图避免的“重新启用”的头痛。我认为前进的方法是关闭 SCM 轮询,用一些“标记文本”更新作业的描述,并在重新启动后重新启用时查找该文本。 - 完成后,我将发布带有示例 ceode 的更新。
    • 是的,没有禁用轮询的全局设置。关于头痛,您的意思是重新启用在您运行上述脚本之前已经禁用的作业而头痛?
    • 精确...(我按 Enter 而不是 -Enter)- 我认为的解决方法是上面的。
    • 是的,这将是一种解决方法。不过,还有其他选择:您可以删除(并重新创建)轮询触发器,或者您可以擦除(并重新定义)轮询时间表,而不是禁用作业。跨度>
    • 啊,是的...我打算禁用“SCM 轮询”而不是禁用作业本身。
    【解决方案2】:

    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)
          }
    }
    

    【讨论】:

      【解决方案3】:
      1. 如果配置为执行 SCM 轮询的是一个或 2 个构建,您可以进入每个构建的配置并取消选中该框。就是这么简单:)

      2. 如果您使用的是 jenkins 作业生成器,一次更改多个作业的配置应该会更容易。

      3. 如果您使用从属服务器或什至在主服务器上,SCM 轮询是否依赖于 JAVA?从机器中临时从主 jenkins 中配置的位置删除 JAVA ;) 轮询将失败 :P 这是一个愚蠢的 hack ;)

      希望对你有帮助!! ?

      【讨论】:

        【解决方案4】:

        尝试按照 Groovy 脚本注释掉 SCM Polling:

        // 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

        已知限制:

        • 仅支持单行“计划”(spec 属性)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-13
          • 2012-04-24
          • 1970-01-01
          • 2023-03-16
          • 2019-01-11
          • 1970-01-01
          • 2015-01-14
          相关资源
          最近更新 更多