一尘不染

jenkins NotSerializableException:groovy.json.internal.LazyMap

jenkins

已解决
:感谢S.Richmond的以下答复。我需要取消
所有groovy.json.internal.LazyMap类型的存储映射,这意味着将变量envServersobject使用后作废。

附加 :搜索此错误的人员可能有兴趣使用Jenkins管道步骤readJSON-
在此处查找更多信息。


我正在尝试使用Jenkins
Pipeline从用户那里获取输入,该输入作为json字符串传递给作业。管道然后使用隔离器对此进行解析,然后选择重要信息。然后,它将使用该信息与不同的作业参数并行运行1个作业。

直到我"## Error when below here is added"在脚本下方添加代码,该脚本才能正常运行。甚至低于该点的代码也将单独运行。但是当结合在一起时,我得到以下错误。

我应该注意,已触发的作业被调用并且确实成功运行,但是发生以下错误并使主作业失败。因此,主作业不等待触发作业的返回。我 可以 尝试/赶上,build job:但是我希望主要作业等待触发的作业完成。

有人可以在这里协助吗?如果您需要更多信息,请告诉我。

干杯

def slurpJSON() {
return new groovy.json.JsonSlurper().parseText(BUILD_CHOICES);
}

node {
  stage 'Prepare';
  echo 'Loading choices as build properties';
  def object = slurpJSON();

  def serverChoices = [];
  def serverChoicesStr = '';

  for (env in object) {
     envName = env.name;
     envServers = env.servers;

     for (server in envServers) {
        if (server.Select) {
            serverChoicesStr += server.Server;
            serverChoicesStr += ',';
        }
     }
  }
  serverChoicesStr = serverChoicesStr[0..-2];

  println("Server choices: " + serverChoicesStr);

  ## Error when below here is added

  stage 'Jobs'
  build job: 'Dummy Start App', parameters: [[$class: 'StringParameterValue', name: 'SERVER_NAME', value: 'TestServer'], [$class: 'StringParameterValue', name: 'SERVER_DOMAIN', value: 'domain.uk'], [$class: 'StringParameterValue', name: 'APP', value: 'application1']]

}

错误:

java.io.NotSerializableException: groovy.json.internal.LazyMap
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:569)
    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(Unknown Source)
    at java.util.LinkedHashMap.internalWriteEntries(Unknown Source)
    at java.util.HashMap.writeObject(Unknown Source)
...
...
Caused by: an exception which occurred:
    in field delegate
    in field closures
    in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@5288c

阅读 706

收藏
2020-07-25

共2个答案

一尘不染

今天,我本人也遇到了这种情况,并且通过一些暴力手段,我弄清楚了如何解决它以及可能的原因。

最好从以下原因开始:

詹金斯(Jenkins)有一个范式,其中所有作业都可以通过服务器重启来中断,暂停和恢复。为了实现这一点,管道及其数据必须完全可序列化-
IE需要能够保存所有状态。同样,它需要能够序列化构建中节点和子作业之间的全局变量状态,这是我和您以及我所正在发生的事情,以及为什么只有在添加了额外的构建步骤后才会发生。

无论出于何种原因,默认情况下JSONObject都不可序列化。我不是Java开发人员,所以我很难过谈论这个话题。

解决方法:

如果您知道如何做,则可以使JSONObject可序列化。否则,您可以通过确保没有全局变量属于该类型来解决它。

尝试取消设置您的objectvar或将其包装在方法中,以使其范围不是节点全局的。

2020-07-25
一尘不染

我本人也遇到了这种情况,并且通过一些暴力手段,我弄清楚了如何解决它以及可能的原因。

最好从以下原因开始:

詹金斯(Jenkins)有一个范式,其中所有作业都可以通过服务器重启来中断,暂停和恢复。为了实现这一点,管道及其数据必须完全可序列化-IE需要能够保存所有状态。同样,它需要能够序列化构建中节点和子作业之间的全局变量状态,这是我和您以及我所正在发生的事情,以及为什么只有在添加了额外的构建步骤后才会发生。

无论出于何种原因,默认情况下JSONObject都不可序列化。我不是Java开发人员,所以我很难过谈论这个话题。尽管我不知道它们如何适用于Groovy和Jenkins,但仍有很多答案可以解决此问题。

解决方法:

如果您知道如何做,则可以使JSONObject可序列化。否则,您可以通过确保没有全局变量属于该类型来解决它。

尝试取消设置您的objectvar或将其包装在方法中,以使其范围不是节点全局的。

2020-07-25