Eu criei o seguinte script
import groovy.json.*
pipeline {
agent { node { label 'mycomputer' } }
stages {
stage ( 'Test') {
steps{
script {
StringJoiner a = new StringJoiner(",");
a.add("a").add("b").add("c")
env.out = a.toString()
echo env.out
datas = readYaml file: "/home/cloud-user/test.yaml"
}
}
}
}
}
Isso resulta nesta saída:
[Pipeline] { [Pipeline] estágio [Pipeline] { (Teste) [Pipeline] script [Pipeline] { [Pipeline] echo a,b,c [Pipeline] readYaml [Pipeline] } [Pipeline] // script [Pipeline] } [Pipeline] // estágio [Pipeline] } [Pipeline] // nó [Pipeline] Fim do Pipeline ocorreu uma exceção: no campo com.cloudbees.groovy.cps.impl.BlockScopeEnv.locals no objeto com.cloudbees.groovy.cps.impl.BlockScopeEnv@7bb36fb8 no campo com.cloudbees.groovy.cps.impl.CallEnv.caller no objeto com.cloudbees.groovy.cps.impl.FunctionCallEnv@636cffca no campo com.cloudbees.groovy.cps.Continuable.e no objeto org.jenkinsci.plugins.workflow.cps.SandboxContinuable@2664c301 no campo org.jenkinsci.plugins.workflow.cps.CpsThread.program no objeto org.jenkinsci.plugins.workflow.cps.CpsThread@1339b8f9 no campo org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.threads no objeto org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@146a9a96 no objeto org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@146a9a96 Também: org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: 16a49acb-27b5-4869-b5ae-bfdb1ca5e058 Causado: java.io.NotSerializableException: java.util.StringJoiner em org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:278) em org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65) em org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56) em org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50) em org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179) em java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:341) em java.base/java.util.HashMap.internalWriteEntries(HashMap.java:1858) em java.base/java.util.HashMap.writeObject(HashMap.java:1412) em org.jboss.marshalling.reflect.JDKSpecific$SerMethods.callWriteObject(JDKSpecific.java:134) em org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:231) em org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:1128) em org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:271) em org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1182) em org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:1140) em org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:271) em org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1182) em org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:1140) em org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:1119) em org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:271) em org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1182) em org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:1140) em org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:1119) em org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:271) em org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1182) em org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:1140) em org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:271) em org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65) em org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56) em org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50) em org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179) em java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:341) em java.base/java.util.HashMap.internalWriteEntries(HashMap.java:1858) em java.base/java.util.HashMap.writeObject(HashMap.java:1412) em org.jboss.marshalling.reflect.JDKSpecific$SerMethods.callWriteObject(JDKSpecific.java:134) em org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:231) em org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:1128) em org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:271) em org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1182) em org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:1140) em org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:271) em org.jboss.marshalling.AbstractObjectOutput.writeObject(AbstractObjectOutput.java:58) em org.jboss.marshalling.AbstractMarshaller.writeObject(AbstractMarshaller.java:116) em org.jenkinsci.plugins.workflow.support.pickles.serialization.RiverWriter.lambda$writeObject$1(RiverWriter.java:144) em org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:331) em org.jenkinsci.plugins.workflow.support.pickles.serialization.RiverWriter.writeObject(RiverWriter.java:143) em org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:580) em org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:557) em org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgramIfPossible(CpsThreadGroup.java:540) em org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:464) em org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:331) em org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:295) em org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:97) em java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) em hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:139) em jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28) em jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:68) em jenkins.util.ErrorLoggingExecutorService.lambda$wrap$0(ErrorLoggingExecutorService.java:51) em java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) em java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) em java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) em java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) em java.base/java.lang.Thread.run(Thread.java:829) Concluído: FALHA
Remover o comando readyaml faz com que o erro desapareça. Isso não faz sentido para mim, por que ele tentaria serializar o StringJoiner na chamada readyaml não relacionada?
Conteúdo Yaml
---
HELLO: "WORLD"
Veja a documentação :
readYaml
e a maioria dos outros passos (mas não todos) acionam a serialização. Acho que é uma troca fundamental - a execução do pipeline do Jenkins pode sobreviver à reinicialização do Jenkins, mas para fazer isso ele pede que você tenha apenas variáveis serializáveis, para que ele possa salvar e restaurar seu estado após a reinicialização.Não significa que você não pode usar nenhuma classe não serializável, porque você pode, só não salve suas instâncias em variáveis. Isso não é problema:
Uma alternativa à resposta de Iterokun é criar uma função e anotá-la com
@NonCPS
. Isso dirá ao Jenkins para omitir os resultados da serialização. No entanto, a menos que eu tenha interpretado mal minhas experiências recentes, você não poderá acessar nenhuma função ou campo específico do pipeline comoreadYaml
ouenv
.Se bem me lembro, você não precisa importar
NonCPS
em pipelines, mas se quiser, a classe totalmente qualificada écom.cloudbees.groovy.cps.NonCPS
.Por exemplo: