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 **/
        ]
} 

上面的作业触发了构建,但失败了:

发生的异常:在字段 hudson.model.Slave.launcher 中导致:java.io.NotSerializableException:hudson.slaves.JNLPLauncher

4

1 回答 1

3

您只能使用Serializable在您的代码中实现接口的类 - 既不NodeComputer没有。为了使用它们,您需要将相应的代码封装在一个@NonCPS方法中,例如:

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 **/
        ]
} 
于 2018-07-20T05:30:35.077 回答