1
import hudson.model.*;
import hudson.AbortException;
import jenkins.model.Jenkins;


@NonCPS
def allNodes = jenkins.model.Jenkins.instance.nodes
def triggerJob = false


for (String  node: allNodes) {
    if ( node.getComputer().isOnline() && node.nodeName == "ABC" ) {
        println node.nodeName + " " + node.getComputer().countBusy() + " " + 
        node.getComputer().isAcceptingTasks()
        triggerJob = true
        break
  }
}

if (triggerJob) {
    println("triggering build as node is available")
    build job: 'jobName', parameters:
        [
            /** list of string Parameters **/
        ]
} 

Above job triggers the build, but fails with:

an exception which occurred: in field hudson.model.Slave.launcher Caused: java.io.NotSerializableException: hudson.slaves.JNLPLauncher

Curious
  • 11
  • 3

1 Answers1

3

You may only use classes which implement the Serializable interface in your code - which neither Node nor Computer does. In order to use them you need to encapsulate the respective code in a @NonCPS method, e.g.:

import hudson.model.*;
import hudson.AbortException;
import jenkins.model.Jenkins;

@NonCPS
def shallTrigger() {
    def triggerJob = true
    def allNodes = jenkins.model.Jenkins.instance.nodes


    for (String  node: allNodes) {
        if ( node.getComputer().isOnline() && node.nodeName == "ABC" ) {
            println node.nodeName + " " + node.getComputer().countBusy() + " " + 
            node.getComputer().isAcceptingTasks()
            triggerJob = true
            break
        }
    }
}
if (shallTrigger) {
    println("triggering build as node is available")
    build job: 'jobName', parameters:
        [
            /** list of string Parameters **/
        ]
} 
Joerg S
  • 4,730
  • 3
  • 24
  • 43