如何在Jenkins工作流构建期间修复NotSerializableException错误?

oTo*_*lev 16 jenkins jenkins-build-flow jenkins-pipeline

当我在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'
   }
 }
}
Run Code Online (Sandbox Code Playgroud)

得到错误:

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)  


.....
Run Code Online (Sandbox Code Playgroud)

Bri*_*Ray 18

我认为这是因为它试图itemresultList它到达build 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...
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 6

根据CloudBees 平台帮助页面

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

所以你应该把你的代码转换成一个带有@NonCPS辅助方法的函数。

相关的 Jenkins 错误:JENKINS-27421

  • 是的。找到了这个效果很好的例子:https://gist.github.com/oifland/ab56226d5f0375103141b5fbd7807398 (3认同)
  • 这里要记住的重要一点:您不能从@NonCPS 方法执行管道步骤!https://groups.google.com/forum/#!topic/jenkinsci-users/VXrSVBZ2maU (3认同)