2016-05-13 4 views
2

У нас есть кусок кода рабочего процесса, что делает эти вещи:«java.io.NotSerializableException: java.io.PrintWriter» при написании файла - Дженкинс документооборота

1 Нагрузки некоторые файлы с диска

2. Оставляет их содержимое с помощью SimpleTemplateEngine и привязок

3. Записывает их результат в другие файлы.

def renderTemplates(binding) { 
    //stage "Render templates" 
    sh "find $infraDir/*.tpl -printf '%f\n' > result" 
    def files = readFile('result').split('\n') 
    println("Found tpl files -> $files") 
    sh "rm result" //Remove the result file 

    for(int i=0; i<files.size(); i++){ 
    def tpl = files[i] 
    println("Process tpl file ${tpl}") 
    renderTemplate(readFile("${infraDir}/${tpl}"), tpl, binding) 
    } 
} 

@NonCPS 
def renderTemplate(String input,String tpl, binding){ 
    def template = new groovy.text.SimpleTemplateEngine().createTemplate(input).make(binding) 
    def rendered = template.toString() 
    def newFileName = "$infraDir/${tpl.replaceFirst(/\.tpl$/, "")}" 
    //sh "echo ${rendered} > ${newFileName}" //--> GIVES ERROR 
    writeFile file: newFileName, text: rendered // --> ERROR AS WELL 
} 

Однако рабочий процесс не удается каждый раз с этой ошибкой:

java.io.NotSerializableException: java.io.PrintWriter 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860) 
at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65) 
at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56) 
at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50) 
at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344) 
at java.util.LinkedHashMap.internalWriteEntries(LinkedHashMap.java:333) 
at java.util.HashMap.writeObject(HashMap.java:1354) 
at sun.reflect.GeneratedMethodAccessor97.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65) 
at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56) 
at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50) 
at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344) 
at java.util.HashMap.internalWriteEntries(HashMap.java:1777) 
at java.util.HashMap.writeObject(HashMap.java:1354) 
at sun.reflect.GeneratedMethodAccessor97.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
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) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
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.doWriteSerializableObject(RiverMarshaller.java:967) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
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.doWriteSerializableObject(RiverMarshaller.java:967) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
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.doWriteSerializableObject(RiverMarshaller.java:967) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
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.doWriteSerializableObject(RiverMarshaller.java:967) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
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.BlockMarshaller.doWriteObject(BlockMarshaller.java:65) 
at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56) 
at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50) 
at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344) 
at java.util.TreeMap.writeObject(TreeMap.java:2434) 
at sun.reflect.GeneratedMethodAccessor394.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
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.AbstractObjectOutput.writeObject(AbstractObjectOutput.java:58) 
at org.jboss.marshalling.AbstractMarshaller.writeObject(AbstractMarshaller.java:111) 
at org.jenkinsci.plugins.workflow.support.pickles.serialization.RiverWriter.writeObject(RiverWriter.java:132) 
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:371) 
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:355) 
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:309) 
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$000(CpsThreadGroup.java:77) 
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:186) 
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:184) 
at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:47) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112) 
at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: an exception which occurred: 
in field locals 
in field parent 
in field parent 
in field parent 
in field caller 
in field e 
in field program 
in field threads 
in object [email protected] 
Finished: FAILURE 

Я попытался с помощью ш эха в файл, но это не может тоже. Пробовал удалить @NonCPS, это тоже ошибка.

Если я прокомментирую строки writeFile и sh, рабочий процесс будет успешным, но, очевидно, файл не написан.

Не уверен, что я делаю неправильно.

Любые советы?

ответ

2

Вы можете использовать org.apache.commons.lang3.text.StrSubstitutor вместо этого, например:

// vars/tokenize.groovy 

def call(String text, Map binding) { 
    _tokenize(text, binding) 
} 

@NonCPS 
def _tokenize(String text, Map binding){ 
    def engine = new org.apache.commons.lang3.text.StrSubstitutor(binding) 
    def s = engine.replace(text) 
    engine = null 
    return s 
} 

// in Jenkinsfile or another .groovy 

def binding = [:] 
binding.veggie = 'Carrot' 

def text = "${veggie}" 

writeFile file: 'veggie.txt', text: tokenize(text, binding) 
+0

У меня была та же проблема, что и @ punit-agrawal, это решение работало для меня –

1

AFAIK вы не должны использовать какие-либо конвейеры трубопровода (то есть sh и writeFile) в пределах @NonCPS аннотированных функций. Попробуйте переместить файл сочинительство из FUNC, как это:

@NonCPS 
String renderTemplate(String input,String tpl, binding){ 
    def template = new groovy.text.SimpleTemplateEngine().createTemplate(input).make(binding) 
    return template.toString() 
} 
... 

for(int i=0; i<files.size(); i++){ 
    ... 
    String rendered = renderTemplate(...) 
    def newFileName = "$infraDir/${tpl.replaceFirst(/\.tpl$/, "")}" 
    writeFile file: newFileName, text: rendered 
} 
+0

Спасибо за ответ. это не работает. Он по-прежнему не работает с тем же исключением. –

+0

Не могли бы вы поставить весь трубопровод в вопросе? По крайней мере, узел узла отсутствует. – izzekil

+0

Я провел некоторое исследование [SimpleTemplateEngine] (https://github.com/groovy/groovy-core/blob/master/subprojects/groovy-templates/src/main/groovy/groovy/text/SimpleTemplateEngine.java#L152) код. Он полагается на создание и запуск другого объекта Script, который 'out' связан с' PrintWriter'. Я недостаточно опытен, чтобы работать с ним. Я бы предложил заполнить билет на [Jenkins JIRA] (https://issues.jenkins-ci.org/secure/Dashboard.jspa) и переключиться на другой подход. – izzekil

2

То, что сработало для меня просто переходит от SimpleTemplateEngine к GStringTemplateEngine. Если вы поместите все это на одну строку, вам не понадобится @NonCPS. Очевидно, вы все же можете извлечь это как отдельный метод в соответствии с принципами разработки программного обеспечения, но я просто хотел проиллюстрировать, что это можно сделать в соответствии с конвейером dsl

stage() { 
    def binding .... 
    def template ... 
    String result = new groovy.text.GStringTemplateEngine().createTemplate(template).make(binding).toString()} 
Смежные вопросы