18

Jenkins ワークフロー (Jenkins 1.609.1、workflow 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 に答える