I have a similar problem, where I need to run maintenance jobs on machines with 
multiple nodes.  I installed the Scriptler plugin and wrote these two scripts; 
one to disable all nodes on a given label (which lets them finish their current 
tasks but prevents them from taking on more jobs) and wait for them to finish 
(you may not need the last part), and the other to enable all nodes on that 
label.  These scripts must be run as Scriptler jobs that are bound to the 
master node (so that they are in the same address space as the server).

--Rob Mandeville

---BEGIN LABEL SHUTDOWN SCRIPT---
import hudson.model.Hudson
import jenkins.model.Jenkins
import hudson.model.Computer

println "Passed in label $labelName."

label = Jenkins.instance.getLabel(labelName)
if(!label){
  println("Could not find label $labelName")
}else{
  nodes = label.getNodes()
  for(node in nodes){
    nodeName = node.getNodeName()
    println("Node $nodeName is part of label $labelName")
  }
}

nodeToComputer = new HashMap<Node, Computer>()
for(node in nodes){
  computer = node.toComputer()
  if(null == computer){
    println("NO COMPUTER for node $nodeName")
  }else{
    nodeToComputer.put(node, computer)
  }
}

for(node in nodes){
  nodeName = node.getNodeName()
  computer = nodeToComputer.get(node)

  println("We have a computer for node $nodeName")
  if(computer.isTemporarilyOffline()){
    reason = computer.getOfflineCause()
    println("Node $nodeName is already offline: $reason");
  }else{
    computer.setTemporarilyOffline(true)
    println("Node $nodeName is set for offline.")
  }
}

for(node in nodes){
  nodeName = node.getNodeName()
  computer = nodeToComputer.get(node)
  print("Waiting for node $nodeName to finish...")
  computer.waitUntilOffline()
  while(computer.countBusy() != 0){
    sleep(1000)
  }
  println("done");
}

---END LABEL SHUTDOWN SCRIPT---

---BEGIN LABEL STARTUP SCRIPT--
import hudson.model.Hudson
import jenkins.model.Jenkins
import hudson.model.Computer

println "Passed in label $labelName."

label = Jenkins.instance.getLabel(labelName)
if(!label){
  println("Could not find label $labelName")
}else{
  nodes = label.getNodes()
  for(node in nodes){
    nodeName = node.getNodeName()
    println("Node $nodeName is part of label $labelName")
  }
}

nodeToComputer = new HashMap<Node, Computer>()
for(node in nodes){
  computer = node.toComputer()
  if(null == computer){
    println("NO COMPUTER for node $nodeName")
  }else{
    nodeToComputer.put(node, computer)
  }
}

for(node in nodes){
  nodeName = node.getNodeName()
  computer = nodeToComputer.get(node)

  println("We have a computer for node $nodeName")
  if(computer.isTemporarilyOffline()){
    computer.setTemporarilyOffline(false)
    println("Setting Node $nodeName to online");
  }else{
    println("Node $nodeName is already online.")
  }
}

for(node in nodes){
  nodeName = node.getNodeName()
  computer = nodeToComputer.get(node)
  print("Waiting for node $nodeName to finish...")
  computer.waitUntilOnline()
  println("done");
}

---END LABEL STARTUP SCRIPT---



-----Original Message-----
From: [email protected] 
[mailto:[email protected]] On Behalf Of Steffen Breitbach
Sent: Friday, May 17, 2013 7:37 AM
To: [email protected]
Subject: "Soft" stopping of slaves

Hi everyone!

I'd like to prevent our slaves from processing tasks in a given timeframe to 
have system ressources free for other tasks (e.g. backup tasks).

I don't want to shutdown the slaves, I'd rather make them stop processing jobs 
and then enable them some time later, much like the "safe shutdown" for Jenkins 
itself does.

I thought I might have seen a plug-in that could do the job but I don't seem to 
be able to find it any more.

A groovy script might do the job as well, but I couldn't find an example 
anywhere.

Do you have any ideas how I might do this?!

Thanks in advance

Steffen

--
You received this message because you are subscribed to the Google Groups 
"Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


The information in this message is for the intended recipient(s) only and may 
be the proprietary and/or confidential property of Litle & Co., LLC, and thus 
protected from disclosure. If you are not the intended recipient(s), or an 
employee or agent responsible for delivering this message to the intended 
recipient, you are hereby notified that any use, dissemination, distribution or 
copying of this communication is prohibited. If you have received this 
communication in error, please notify Litle & Co. immediately by replying to 
this message and then promptly deleting it and your reply permanently from your 
computer.

-- 
You received this message because you are subscribed to the Google Groups 
"Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to