Solved:多亏了里士满below answer号.我需要取消设置allgroovy.json.internal.LazyMap类型的存储映射,这意味着在使用后将变量envServersobject置零.

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


I am trying to use Jenkins Pipeline to take input from the user which is passed to the job as json string. Pipeline then parses this using the slurper and I pick out the important information. It will then use that information to run 1 job multiple times in parallel with differeing job parameters.

直到我将代码添加到"## Error when below here is added"以下,脚本才能正常运行.即使低于该点的代码也会自行运行.但是当组合起来的时候,我得到了下面的错误.

I should note that the triggered job is called and does run succesfully but the below error occurs and fails the main job. Because of this the main job does not wait for the return of the triggered job. I could try/catch around the build job: however I want the main job to wait for the triggered job to finish.

这里有人能帮忙吗?如果您需要更多信息,请告诉我.

Cheers

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']]

}

Error:

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

推荐答案

我今天自己也遇到了这个问题,通过一些残酷的努力,我已经想出了如何解决它,以及可能的原因.

也许最好从原因开始:

Jenkins有一个范例,所有作业(job)都可以通过服务器重启来中断、暂停和恢复.为了实现这一点,管道及其数据必须是完全可序列化的——即它需要能够保存所有内容的状态.类似地,它需要能够序列化构建中 node 和子作业(job)之间的全局变量状态,这就是我认为你和我正在发生的事情,也是为什么只有在添加额外的构建步骤时才会发生的事情.

For whatever reason JSONObject's aren't serializable by default. I'm not a Java dev so I cannot say much more on the topic sadly. There are plenty of answers out there about how one may fix this properly though I do not know how applicable they are to Groovy and Jenkins. See this post for a little more info.

How you fix it:

如果你知道怎么做,你就有可能以某种方式让JSONObject序列化.否则,您可以通过确保没有这种类型的全局变量来解决它.

try 取消设置objectvar或将其包装在方法中,使其作用域不是 node 全局的.

Json相关问答推荐

输入请求中不存在null的条件抖动

Flutter -控制器问题-JSON API

写入JSON文件的流

JSON API返回多个数组,需要帮助拼合数据以存储在SQL Server数据库表中

使用自定义类型在Golang中解析JSON数组

将JSON数组组织到菜单中

在深度嵌套数组中使用布尔属性的jq-select

419(未知状态)使用laravel处理PUT请求

我需要在 mongodb compass 中检索索引(编号 1)信息

使用 jq 同时迭代数组

解析 JSON API 响应

在PowerShell中按时间戳过滤JSON

如何让 JSON.NET 忽略对象关系?

将 YAML 文件转换为 Python JSON 对象

Java JSON 序列化 - 最佳实践

以 unicode 将 pandas DataFrame 写入 JSON

在 Webpack 中加载静态 JSON 文件

无法将空值放入 JSON 对象

Microsoft.Net.Http 与 Microsoft.AspNet.WebApi.Client

JSON.stringify 向我的 Json 对象添加额外的 \ 和 "" 的问题