【问题标题】:Copy Jenkins Multijob job and all its downstream jobs via groovy job通过 groovy 作业复制 Jenkins Multijob 作业及其所有下游作业
【发布时间】:2014-09-11 13:18:10
【问题描述】:

我正在尝试编写一个 Jenkins 作业(例如 CopyJob),它复制另一个作业(在此作业中使用 Multijob 插件)并将其所有下游作业复制到新作业。这个想法是有一个 Multijob 作为模板,以便可以将其复制到新的 Multijobs(例如,用于特定分支或功能)。

见:

MultiJob_Template
   |
   +-- Sub1_Template
   +-- Sub2_Template
   +-- Sub3_Template

CopyJob (Parameters: NewSuffix)

当手动触发“CopyJob”时,它将创建一个带有新 SubJobs 的新 MultiJob:

MultiJob_BranchXYZ
   |
   +-- Sub1_BranchXYZ
   +-- Sub2_BranchXYZ
   +-- Sub3_BranchXYZ

到目前为止,我成功地复制了 Multijob 和复制了 Subjobs,但我找不到让新的 Multijob 实际上依赖于新的 Subjobs 的方法。 到目前为止,我的代码(用于 CopyJob groovy 脚本)是:

import jenkins.model.*
import com.tikal.jenkins.plugins.multijob.*

def templateJobName = "MultiJob_Template"

// Retrieve parameters 
def newSfx = build.buildVariableResolver.resolve("NewSuffix")
def templateJob = Jenkins.instance.getJob(templateJobName)

// copy Multijob
def newJob = Jenkins.instance.copy(templateJob, 'Multijob_' + newSfx)
newJob.save()

// copy all downstreamjobs
def subs = newJob.getDownstreamProjects()
for (s in subs) {
  def oldSubJob = Jenkins.instance.getJob(s.getDisplayName())
  def newSubJob = Jenkins.instance.copy(oldSubJob, s.getDisplayName().replaceFirst(/Template/, newSfx))
  newSubJob.save()

  // how to update the MultiJob_newSfx DownstreamJoblist to use the newSubJob?
  // ????
}

【问题讨论】:

    标签: groovy jenkins


    【解决方案1】:

    实际上,我自己设法解决了这个问题。也许还有其他方法,但似乎最好先遍历构建器列表,然后再遍历 MultiJob 模板的 PhaseJobs 列表。

    MultiJob plugin 本身的代码有助于解决此问题。 如果您正在寻找类似的东西,也值得看看这个question

    import jenkins.model.*
    import com.tikal.jenkins.plugins.multijob.*
    
    def jenkinsInstance = jenkins.model.Jenkins.instance 
    def templateJobName = "Multijob_Template"
    
    // Retrieve parameters
    def newSfx = build.buildVariableResolver.resolve("NewSuffix")
    
    // create new MultiJob
    def templateJob = Jenkins.instance.getJob(templateJobName)
    def newJob = Jenkins.instance.copy(templateJob, 'Multijob_' + newSfx)
    newJob.save()
    
    // get MultiJob BuildPhases and clone each PhaseJob
    def builders = newJob.getBuilders()
    builders.each { builder ->
        builder.getPhaseJobs().each() { pj ->
          println "cloning phasejob: " + pj.getJobName()
    
          def subTemplate = Jenkins.instance.getJob(pj.getJobName())
          def newSubJob = Jenkins.instance.copy(subTemplate, pj.getJobName().replaceFirst(/Template/, newSfx))
          newSubJob.save()
          pj.setJobName(newSubJob.getDisplayName())
        }
    }
    
    // update dependencies
    jenkinsInstance.rebuildDependencyGraph()
    

    【讨论】:

      【解决方案2】:

      我在 Jenkins 中使用带有参数的 Scriptler 插件:

      NewSuffix、TemplateStr 和 templateJobName。我调整了 pitseeker 的脚本以使用这些脚本并解决 Jenkins v1.580.3 中的运行时问题:

      import jenkins.model.*
      import com.tikal.jenkins.plugins.multijob.*
      
      def jenkinsInstance = jenkins.model.Jenkins.instance 
      
      // Retrieve parameters
      def newSfx = NewSuffix
      println "using new suffix " + newSfx
      
      // create new MultiJob
      def templateJob = Jenkins.instance.getJob(templateJobName)
      println "Found templateJob " + templateJobName
      
      def newJobName = templateJobName.replaceFirst(/$TemplateStr/, newSfx)
      
      def newJob = Jenkins.instance.copy(templateJob, templateJobName + newSfx)
      newJob.save()
      println "Copied template job to " + newJob.getName()
      
      // get MultiJob BuildPhases and clone each PhaseJob
      def builders = newJob.getBuilders()
      builders.each { builder ->
          builder.getPhaseJobs().each() { pj ->
            def pjNameOrig = pj.getJobName()
            def pjNameNew = pjNameOrig.replaceFirst(/$TemplateStr/, newSfx)
            println "pjNameOrig = $pjNameOrig, pjNameNew=$pjNameNew"
      
            if (pjNameNew != pjNameOrig)
            {
                println "cloning phasejob: " + pjNameOrig
      
                def subTemplate = Jenkins.instance.getJob(pjNameOrig)
      
                def newSubJob = Jenkins.instance.copy(subTemplate, pjNameNew)
                newSubJob.save()
                pj.setJobName(newSubJob.getDisplayName())
            }
            else
            {
                println "Not cloning phasejob, keeping original job: " + pjNameOrig
            }
          }
      }
      
      // update dependencies
      jenkinsInstance.rebuildDependencyGraph()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-08
        • 1970-01-01
        • 2019-04-06
        相关资源
        最近更新 更多