2014-09-11 68 views
1

我想写一个詹金斯工作(说CopyJob)复制另一个工作(在这个工作中使用Multijob插件),并且还将其所有下游工作复制到新工作。这个想法是有一个Multijob作为一个模板,因此它可以被复制到新的Multijobs(例如特定的分支或特征)。复制詹金斯Multijob工作和所有下游工作通过groovy工作

参见:

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

CopyJob (Parameters: NewSuffix) 

当手动触发“CopyJob”应创建新的子作业新多椎:

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

到目前为止,我是成功的copiing的多椎和copiing的子作业,但我找不到一种方法让新的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? 
    // ???? 
} 

回答

2

其实我设法解决它自己。也许还有其他方法,但似乎最好逐步列出构建器列表,然后逐步列出MultiJob模板的PhaseJob列表。

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

我使用詹金斯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()