【问题标题】:Jenkins pipeline Caught exception:java.io.NotSerializableException: java.util.ArrayList$ItrJenkins 管道捕获异常:java.io.NotSerializableException: java.util.ArrayList$Itr
【发布时间】:2020-09-25 04:41:37
【问题描述】:

由于对 groovy 和管道的经验很少,我正在尝试将我们的代码从用 groovy 编写的旧 DSL 流插件迁移到管道上。通过一些小的更改,我似乎能够完成大部分代码,除非尝试触发 Jenkins 作业。代码有点长,所以我只捕获我认为有问题的部分。基于Serializing Local VariablesPipeline CPS Method Mismatches,我认为这与在方法中使用诸如“构建作业”之类的CPS 转换代码有关。我认为这是不允许的。但我不确定如何将这些值从 groovy 方法传递到管道阶段/步骤。当它到达“构建作业:”行时,我将收到 NotSerializableExceptin 消息。任何帮助或指点表示赞赏 - 谢谢!

@NonCPS
def func1 = { param1, param2, param3, param4 ->
try {     
    build job: jobName, parameters: [string(name: 'PARAM1', value: param1), string(name: 'PARAM2', value: param2), string(name: 'PARAM3', value: param3), string(name: 'PARAM4', value: param4)]
} catch (Exception e) {
    println "Caught exception:" + e
}

node {
....
    func1 (param1, param2, param3, param4)
....

}

【问题讨论】:

  • 您是否尝试将 func1 定义为普通函数 "def func1(param1, ...){} 而不是闭包?
  • 将其更改为 "def func1(param1, ...){} 似乎可以让我进入下一步,但现在我收到异常:java.io.NotSerializableException: java.lang.ProcessImpl。这是由于我在函数中使用的常规“进程 p”吗?我使用它是因为我需要运行 perforce 命令并想捕获命令的输出。如果是这样,我该如何更改?
  • 您是否也将@NonCPS 与该功能一起使用?
  • 是的,我对我拥有的所有功能都使用了@NonCPS。
  • 您可能需要分离出实际上是 NonCPS 的部分,因为 @NonCPS 函数可能不会调用 CPS 函数(如 build)。你看过这个吗? jenkins.io/doc/book/pipeline/cps-method-mismatches

标签: java jenkins groovy jenkins-pipeline


【解决方案1】:

您是否尝试为这些功能使用@NonCPS 注释?看起来可以解决你的问题

【讨论】:

  • 您认为在函数中使用“构建作业:”是非法的吗?我在想“构建工作:”是一个序列化的步骤,并且不允许在 groovy 函数中使用?提前谢谢你。
  • 我很确定我之前在函数中使用了构建步骤
  • 那么我可以在下面的方法中使用“构建”步骤吗?如果没有,关于如何在此方法中执行此操作或如何将值传递回管道子句的任何建议? @NonCPS def func1 () { .... build job: 'JOBNAME' ..... }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
相关资源
最近更新 更多