2014-09-11 2 views
1

다른 작업 (Multijob 플러그인을 사용하여이 작업에서)을 복사하는 Jenkins 작업 (CopyJob)을 작성하고 모든 다운 스트림 작업을 새로운 작업으로 복사하려고합니다 . 새로운 멀티 잡스 (예 : 특정 지사 또는 지형지 물)에 복사 할 수 있도록 템플릿 역할을하는 멀티 조브를 만드는 것이 좋습니다.Jenkins Multijob 작업과 groovy 작업을 통한 모든 다운 스트림 작업

참조 :

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

CopyJob (Parameters: NewSuffix) 

수동으로 트리거 "CopyJob"그것은 새로운 SubJobs으로 새 MultiJob를 생성한다

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

지금까지 나는 Multijob을 copiing하고 Subjobs을 copiing와 성공 ,하지만 새로운 멀티 잡이를 실제로 새로운 서브 작업에 의존하게 만드는 방법을 찾지 못했습니다. 합니다 (CopyJob 그루비 스크립트) 내 코드는 지금까지 있습니다 : 나는 실제로 그것을 자신을 해결하기 위해 관리

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() 
관련 문제