json - Jenkins 管道 NotSerializableException : groovy. json.internal.LazyMap

标签 json jenkins groovy jenkins-pipeline

已解决:感谢 below answer来自 S.Richmond。我需要取消设置 groovy.json.internal.LazyMap 类型的 all 存储 map ,这意味着使变量 envServersobject使用后。

附加:搜索此错误的人可能有兴趣改用 Jenkins 管道步骤 readJSON - 查找更多信息 here .


我正在尝试使用 Jenkins Pipeline 从用户那里获取作为 json 字符串传递给作业的输入。然后 Pipeline 使用 slurper 解析它,然后我挑选出重要信息。然后它将使用该信息以不同的作业参数并行运行 1 个作业。

直到我在下面添加代码 "## Error when below here is added" 脚本将运行良好。甚至低于该点的代码也将自行运行。但是当结合我得到以下错误。

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

有人可以帮忙吗?如果您需要更多信息,请告诉我。

干杯

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

最佳答案

改用 JsonSlurperClassic

由于 Groovy 2.3(注意:Jenkins 2.7.1 使用 Groovy 2.4.7)JsonSlurper 返回 LazyMap 而不是 HashMap。这使得 JsonSlurper not 线程安全且 not 可序列化的新实现。这使得它无法在管道 DSL 脚本中的 @NonDSL 函数之外使用。

但是您可以回退到支持旧 behaviorgroovy.json.JsonSlurperClassic并且可以在管道脚本中安全使用。

示例

import groovy.json.JsonSlurperClassic 


@NonCPS
def jsonParse(def json) {
    new groovy.json.JsonSlurperClassic().parseText(json)
}

node('master') {
    def config =  jsonParse(readFile("config.json"))

    def db = config["database"]["address"]
    ...
}    

ps。您仍然需要批准 JsonSlurperClassic 才能调用它。

关于json - Jenkins 管道 NotSerializableException : groovy. json.internal.LazyMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37864542/

相关文章:

c# - 如何从前端 (Angular) 向 C# .net datetime (webAPI) 发送日期?

java - jenkins 插件 - 从插件内部启动和停止阶段

regex - Groovy 正则表达式和通配符权限

groovy - 如何使用 GrabResolver 在 groovysh 中使用远程存储库

json - 如何将JSON对象的嵌套部分转换为点链式平面JSON?

json - 仅在 JSON 之后加载 tableView

json - Cassandra vs MongoDB - 使用以前未知的键存储 JSON 数据?

ios - 无法通过 Jenkins 上的 xcodebuild 从命令行执行测试

jenkins - Gradle-build.gradle中的 “override”行为/属性

Java 8::(双冒号)运算符的 Groovy 等效项