【发布时间】:2020-09-25 04:41:37
【问题描述】:
由于对 groovy 和管道的经验很少,我正在尝试将我们的代码从用 groovy 编写的旧 DSL 流插件迁移到管道上。通过一些小的更改,我似乎能够完成大部分代码,除非尝试触发 Jenkins 作业。代码有点长,所以我只捕获我认为有问题的部分。基于Serializing Local Variables 和Pipeline 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