通过groovy作业复制Jenkins多作业及其所有下游作业

通过groovy作业复制Jenkins多作业及其所有下游作业,groovy,jenkins,Groovy,Jenkins,我正在尝试编写一个Jenkins作业(比如CopyJob),它复制另一个作业(在这个作业中使用Multijob插件),并将其所有下游作业复制到新作业。其想法是将多工单用作模板,以便将其复制到新的多工单(例如,针对特定分支或功能) 见: 手动触发“CopyJob”时,应使用新的子对象创建一个新的多作业: MultiJob_BranchXYZ | +-- Sub1_BranchXYZ +-- Sub2_BranchXYZ +-- Sub3_BranchXYZ 到目前为止,我

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

见:

手动触发“CopyJob”时,应使用新的子对象创建一个新的多作业:

MultiJob_BranchXYZ
   |
   +-- Sub1_BranchXYZ
   +-- Sub2_BranchXYZ
   +-- Sub3_BranchXYZ
到目前为止,我成功地复制了多重作业和主题,但我找不到一种方法使新的多重作业实际上依赖于新的主题。 到目前为止,我的代码(用于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?
  // ????
}

事实上我自己解决了。也许还有其他的方法,但似乎最好先浏览构建器列表,然后再浏览多作业模板的phasejob列表

代码本身有助于实现此解决方案。 如果你正在寻找类似的东西,也值得一看

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

事实上我自己解决了。也许还有其他的方法,但似乎最好先浏览构建器列表,然后再浏览多作业模板的phasejob列表

代码本身有助于实现此解决方案。 如果你正在寻找类似的东西,也值得一看

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

我在Jenkins中使用Scriptler插件,参数如下:

NewSuffix、TemplateStr和templateJobName。我调整了PitSeek的脚本以使用这些脚本,并解决了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()

我在Jenkins中使用Scriptler插件,参数如下:

NewSuffix、TemplateStr和templateJobName。我调整了PitSeek的脚本以使用这些脚本,并解决了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()