2016-05-13 12 views
2

を私たちはこれらの事を行うワークフローコードの部分を持っています。 SimpleTemplateEngineとバインディングを使用してコンテンツをレンダリングします: - :ディスク</p> <p>2から</p> <p>1ロードいくつかのファイルを、ファイルの書き込み時に「java.io.NotSerializableExceptionてjava.io.PrintWriterは」ジェンキンスワークフロー

3.結果を別のファイルに書き込みます。

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 

は、私は、ファイルにエコーするためにSHを使用してみましたが、それはあまりにも失敗します。

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 
} 

ただし、ワークフローは毎回このエラーで失敗します。 @ 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 @NonCPS注釈付き機能内には、パイプラインビルトイン(つまり、shwriteFile)を使用しないでください。 このように、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)の調査を行ったところ、コード。これは、 'out'が' PrintWriter'にバインドされている別のScriptオブジェクトの作成と実行に依存しています。私はそれをうまく処理するのに十分な経験はありません。 [Jenkins JIRA](https://issues.jenkins-ci.org/secure/Dashboard.jspa)のチケットを作成し、別の方法に切り替えることをお勧めします。 – izzekil

2

何私のために働いたことは、単にGStringTemplateEngineにSimpleTemplateEngineから動いていました。すべてを1行に入れると、@ NonCPSは必要ありません。もちろん、これをソフトウェア設計の原則に沿った別の方法として抽出したいかもしれませんが、パイプラインとインラインで実行できることを説明したかっただけです。

stage() { 
    def binding .... 
    def template ... 
    String result = new groovy.text.GStringTemplateEngine().createTemplate(template).make(binding).toString()} 
関連する問題