A job to update other jobs

47 views
Skip to first unread message

Morgan Blackthorne

unread,
May 8, 2017, 2:06:33 PM5/8/17
to Jenkins Users
We're using Chef automation around configuring our Jenkins jobs. Basically chef clones a git repo with the job XML files, and then tells Jenkins to use them.

What we want to have is:
  1. One job to edit other jobs description to say "FROZEN by <user X> at <date:time>" or to remove the FROZEN line (basically a toggle)
  2. Chef will then be updated to look at the job XML currently on the Jenkins server
    1. If the description includes FROZEN, skip that job and leave it alone
    2. If the description does not include FROZEN, update the job from the XML file
I'm not really up to speed on Groovy, so what's the simplest way to approach this? (I already know how to do the XML check for step 2, we can just look at the XML over HTTP.)

Kevin Burnett

unread,
May 9, 2017, 1:38:28 PM5/9/17
to Jenkins Users
what is up morgan, man? :)

i just tested this to update a job description (it gets an http 302 when it works):

  curl -u user:pass -X POST https://ci.example.com/job/my-hot-job/submitDescription --data-urlencode "description=FROZEN by [fancy_business_here]"

maybe someone else knows all about updating jobs from xml files.

good luck,
kb

Maciej Jaros

unread,
May 10, 2017, 7:23:26 AM5/10/17
to jenkins...@googlegroups.com
Morgan Blackthorne (2017-05-08 19:56):

This should get you started...

Install Groovy plugin. Use Groovy system step -- allows running scripts in Jenkins context (with Jenkins.instance available).

Java/Groovy API reference:

// getting any job:
def job = Jenkins.instance.getItem("some-job-name");
// BUT`job` here is not just a Job, it is an AbstractProject.

// set desc. for current build
build.setDescription(someDescriptionString);

// loop over jobs (possible also in Script Console)
for (item in hudson.model.Hudson.instance.items) {
  println("Saving " + item);
  item.save();
}

Morgan Blackthorne

unread,
May 12, 2017, 2:44:50 PM5/12/17
to Jenkins Users
Hey man, long time :) Hope things are good.

I'll keep this in the back pocket but I think the groovy setup is probably more along the lines of what I should use, thanks.

Morgan Blackthorne

unread,
May 12, 2017, 2:44:57 PM5/12/17
to Jenkins Users, mac...@mol.com.pl


On Wednesday, May 10, 2017 at 4:23:26 AM UTC-7, maciej wrote:
Morgan Blackthorne (2017-05-08 19:56):
We're using Chef automation around configuring our Jenkins jobs. Basically chef clones a git repo with the job XML files, and then tells Jenkins to use them.

What we want to have is:
  1. One job to edit other jobs description to say "FROZEN by <user X> at <date:time>" or to remove the FROZEN line (basically a toggle)
  2. Chef will then be updated to look at the job XML currently on the Jenkins server
    1. If the description includes FROZEN, skip that job and leave it alone
    2. If the description does not include FROZEN, update the job from the XML file
I'm not really up to speed on Groovy, so what's the simplest way to approach this? (I already know how to do the XML check for step 2, we can just look at the XML over HTTP.)

This should get you started...

Install Groovy plugin. Use Groovy system step -- allows running scripts in Jenkins context (with Jenkins.instance available).

Java/Groovy API reference:

// getting any job:
def job = Jenkins.instance.getItem("some-job-name");
// BUT`job` here is not just a Job, it is an AbstractProject.

// set desc. for current build
build.setDescription(someDescriptionString);


So I'm a little confused as to setting job to a value, but then referencing build.setDescription afterwards... or should that be job.setDescription?
  
// loop over jobs (possible also in Script Console)
for (item in hudson.model.Hudson.instance.items) {
  println("Saving " + item);
  item.save();
}

Do I need to save them all, or just the one I modified? Like job.save(); ?

Maciej Jaros

unread,
May 16, 2017, 8:32:45 AM5/16/17
to Morgan Blackthorne, Jenkins Users
Morgan Blackthorne (2017-05-12 20:05):
So I'm a little confused as to setting job to a value, but then referencing build.setDescription afterwards... or should that be job.setDescription?
  
// loop over jobs (possible also in Script Console)
for (item in hudson.model.Hudson.instance.items) {
  println("Saving " + item);
  item.save();
}

Do I need to save them all, or just the one I modified? Like job.save(); ?

I don't think you need to save jobs after doing something with them. That was just an example action in the loop. Just test your commands in the script console and see if it works. Make sure you you have backup of at least config.xml of your jobs ;-).

Regards,
Nux.

PS: I actually use this loop in our Jenklins installation. I do this to re-fresh configs after plugin updates. Doing `save` forces plugins to verfiy job config and possibly insert defaults.
Reply all
Reply to author
Forward
0 new messages