任何线索为什么并行会抛出序列化错误这么简单:
branches[nodeSpec] = {
node(nodeSpec) {
echo("remote");
}
我正在尝试编写一个工作流插件版本,在我的所有节点上执行维护任务。这在今天早些时候工作,即使我执行该代码,我得到以下失败。我无法理解导致问题的原因。我知道这可能是一个变量使用的问题,但我不认为我在节点闭包中使用任何一个。
如果您有任何建议,请告诉我
错误
java.io.NotSerializableException:hudson.plugins.sshslaves.SSHLauncher 在org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860) 在org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) 在org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) 在org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) 在org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 在org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:569) 在org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65) 在org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56)
代码
// Get all Nodes from Jenkins instance
def nodelist = Jenkins.getInstance().getNodes()
branches = [:]
// Iterate list -- NOTE: we cannot use groovy style or even modern java style iteration
for (int i =0; i < nodelist.size(); i++) {
Slave node = nodelist[i]
def nodeSpec = node.name.toString()
if (node.getComputer().isOnline()) {
println "Create Task for ${nodeSpec}"
branches[nodeSpec] = {
node(nodeSpec) {
echo("remote");
}
}
}
}
parallel branches
答案 0 :(得分:3)
更新:我发现我误解了NonCPS注释的要求。这是必要的,以防止在分支中使用的方法出现问题,并且即使在分支执行之前使用该方法,也可以清楚地了解该问题。
我有工作代码和理论,为什么它有效。
<强>代码强>
@NonCPS
List <String> getOnlineNodeNames() {
List <String> nodeNames = []
def allNodes = Jenkins.getInstance().getNodes()
for (int i =0; i < allNodes.size(); i++) {
Slave node = allNodes[i]
if (node.getComputer().isOnline()) {
nodeNames.add(node.name.toString())
}
}
return nodeNames
}
List<String> nodeList = getOnlineNodeNames()
branches = [:]
for (int i =0; i < nodeList.size(); i++) {
String nodeName = nodeList[i]
if(nodeName.contains("win")) {
branches[nodeName] = { node(nodeName) {
bat '''@echo off
DoMainTasks....'''
}
}
} else {
branches[nodeName] = { node(nodeName) {
sh '''set +x
DoMainTasks....'''
}
}
}
}
parallel branches