18

当我在 Jenkins 工作流程(Jenkins 1.609.1,工作流程 1.8)上运行以下代码时,我收到“NotSerializableException”错误(也在下方)。但是,如果我将“构建作业”移到“for”范围之外,它工作正常(作业被激活)。有什么想法为什么会出现这种行为?

node('master') { 
ws('/opt/test) {
def file = "/ot.property"
def line = readFile (file)
def resultList = line.tokenize()
for(item in resultList )
  {
build job: 'testjob_1'
   }
 }
}

得到错误:

Running: End of Workflow 
java.io.NotSerializableException: java.util.ArrayList$Itr  
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)  


.....
4

2 回答 2

20

我认为这是因为它试图在到达步骤后立即序列化不可序列化的item迭代器。有关使用不可序列化变量的指南,请参见此处:resultListbuild job

https://github.com/jenkinsci/workflow-plugin/blob/master/TUTORIAL.md#serialization-of-local-variables

作为使用工作流插件安全迭代的一种解决方法,您需要使用 C 风格的循环。试试这个:

for ( int i = 0; i < resultList.size; i++ ) {
  etc...
于 2015-07-27T16:46:46.667 回答
6

根据CloudBees 平台帮助页面

按照设计,管道只能保存Serializable对象的记录。如果您仍然需要使用不可序列化对象保留中间变量,则需要将其隐藏到方法中并使用@NonCPS.

@NonCPS因此,您应该使用辅助方法将代码转换为函数。

相关 Jenkins 错误:JENKINS-27421

于 2016-10-23T18:36:14.010 回答