Reputation: 2763
I have a task that executes on n
machines based on a label. If for some reason, some of these machines are offline, I do not want Jenkins to put them in a queue, and wait until they are online. I would like Jenkins to execute the job on the remaining machines and complete the job. Any suggestions?
Edit 1:
I realized that the job is tied to all the machines:
I was forced to do this because I needed this job to run simultaneously on all the machines. So, my question remains the same. If some of these machines are offline, I would like to skip the job on them, rather than wait/queue.
Edit 2: Jenkins CLI has a clear queue command. It seems promising for the time.
Upvotes: 10
Views: 7985
Reputation: 16971
A fine solution can be achieved using GroovyAxis Plugin and the following script, that will return Axis list of online slaves only:
def axis = []
for (slave in hudson.model.Hudson.instance.slaves) {
if (slave.getComputer().isOnline().toString() == "true") {
axis += slave.name
}
}
return axis
UPDATE: Since Jenkins 2.0 the node API has been changed, so use Node.toComputer() instead: http://javadoc.jenkins-ci.org/hudson/model/Node.html#toComputer%28%29
def axis = []
for (slave in jenkins.model.Jenkins.instance.getNodes()) {
if (slave.toComputer().isOnline()) {
axis += slave.getDisplayName()
}
}
return axis
Upvotes: 8
Reputation: 21028
If the task is attached in a way that it only runs on a particular node, it will not be able to run it on other machines.
If that isn't the case then the task will run on any of the available executors, this is the default behaviour.
So in order check to see if the task can run on other nodes go to the job > configure and check the setting of the following.
If that is disable on the task, then you will need to check the nodes that they accept any jobs this can be found under the node settings. It should read like the following.
Goodluck.
Upvotes: 0