当前位置: 首页 > 面试题库 >

詹金斯管道NotSerializableException:groovy.json.internal.LazyMap

江新
2023-03-14
问题内容

已解决
:感谢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

问题答案:

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

最好从以下原因开始:

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

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

解决方法:

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

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



 类似资料:
  • 下面是我简单的jenkins pipeline groovy脚本,它将用这两个阶段和我们想要构建的作业创建一个管道,我希望在job configuration下的脚本中每次都更新用于构建和代码分析的作业名,方法是从用户界面中获取数据,用户将使用Eclipse提供构建作业名和代码分析作业名- jenkinsfile脚本:-

  • 问题内容: 我们有几个Java项目。每个项目都有自己的交付管道。 所有管道都具有以下共同的步骤(简化): 建立项目 发布项目 部署到测试环境 部署到生产环境 项目管道仅在项目特定的属性(例如服务名称或测试和生产环境的IP地址)上有所不同。 问题是:我们如何避免所有项目都有共同之处?Jenkins的“管道作为代码”是否提供类似管道模板的内容? 我可以想象一个模板将在我们的项目管道中节省很多冗余代码/

  • 问题内容: 我已经使用Jenkins为我的node js应用程序创建了CI管道。我的管道包括诸如构建,单元测试,集成测试,代码分析等工作。我知道默认情况下,即使一个测试用例失败,构建也会失败。 问题答案: 您的单元测试脚本将需要处理数学和逻辑,以确定失败的测试百分比足以使整个工作失败。然后,您的单元测试脚本可以返回通过(零)或失败(其他任何结果),詹金斯将相应地标记构建。

  • 问题内容: 这是我要执行的Jenkins管道。我正在关注本教程: 但是作业失败,并显示以下消息。 有人可以帮我解决为什么失败了。 问题答案: 您需要在阶段声明之后添加一个step块。

  • 问题内容: 我正在尝试在詹金斯(Jenkins)中运行以下内容,但我得到任何建议的错误? 错误-为什么在shell脚本中不使用文件名重新填充? 问题答案: 我建议在双引号中运行bash命令,并转义和字符。考虑以下Jenkins管道示例脚本: 我在此示例中使用的文件包含: 当我运行它时,我得到以下控制台输出: 运行脚本文件后,将其内容更改为: 希望能帮助到你。

  • 我试图从流水线步骤中运行一个job-dsl脚本。一般来说,这应该是可能的,正如这里所描述的,在管道步骤中添加了以下代码片段: null 我如何知道脚本的真实位置,以及如何指定一个jobDsl作为目标,它本身位于不同的repo中?还是我完全走错了方向? 编辑 经过进一步的研究,共享库存储库被签出到“真实”工作区旁边的一个目录中,后缀为@libs,这似乎是事实。所以我认为使用以下方法是个好主意: 与此