2014-09-11 67 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()