Issue
- As a admin, I would like to change the “Template X” (for “Template Y”) used by a “job A” Script Console
Environment
- CloudBees Jenkins Enterprise - Managed Master (CJEMM)
- CloudBees Jenkins Platform - Client Master (CJPCM)
- CloudBees Jenkins Template Plugin
Resolution
The CloudBees Template Plugin doesn’t have a versioning mechanism and doesn’t allow to manage promotions and to incrementally apply a template change on all its instance. Because of this if you change a job template all its instances will be updated at the same time when the template is saved.
A workaround is to manually manage versions of the template by creating different copies/updates (Template_V1, Template_V2, ) and to manually attach instances from a template to another.
The following groovy script allow you to configure the existing Job JobA_FullName
to use the template [template Y.getFullName][]. It must be adapted to your usecase and executed in the script console.
Script
The following script would solve the described issue.
Notes:
1) Please make a backup of your $JENKINS_HOME
before running it.
2) Overall - RunScripts
(admin) permission is needed in order to run it.
import com.cloudbees.hudson.plugins.modeling.ModelList
import com.cloudbees.hudson.plugins.modeling.impl.jobTemplate.InstanceFromJobTemplate
import com.cloudbees.hudson.plugins.modeling.impl.jobTemplate.JobPropertyImpl
def jenkins = Jenkins.instance
def InstanceFromJobTemplate templateX, templateY
def TEMPLATE_Y_FullName = 'SUPPORT-Team/Templates/Template Y'
def JOB_A_FullName = 'SUPPORT-Team/Templates/Job A'
if ((ModelList.get().getItem(TEMPLATE_Y_FullName)) != null){
templateY = new InstanceFromJobTemplate(ModelList.get().getItem(TEMPLATE_Y_FullName))
if (jenkins.getItemByFullName(JOB_A_FullName) != null){
def jobA = jenkins.getItemByFullName(JOB_A_FullName)
templateX = InstanceFromJobTemplate.from(jobA)
println "[DEBUG]: $JOB_A_FullName existing template name: $templateX.model.name"
jobA.addProperty(new JobPropertyImpl(templateY))
templateY.save()
templateX = InstanceFromJobTemplate.from(jobA)
println "[DEBUG]: $JOB_A_FullName updated template name: $templateX.model.name"
}else {
println "[ERROR]: $JOB_A_FullName does not exist in this instance"
}
} else {
println "[ERROR]: $TEMPLATE_Y_FullName does not exist in this instance"
}
Console Output
If it succeeds:
[DEBUG]: SUPPORT-Team/Templates/Job A existing template name: Template X
[DEBUG]: SUPPORT-Team/Templates/Job A updated template name: Template Y
Tested product/plugin versions
The latest update of this article has been tested and verified with:
0 Comments