【发布时间】:2017-01-19 14:31:33
【问题描述】:
我们在某些工作中动态创建并行步骤。感谢this thread,我找到了如何使用参数动态创建地图以在并行步骤中使用。
但是现在我想重用用于创建这些并行步骤的部分代码。为此,我觉得我需要咖喱闭包。
但是,currying 似乎无法正常工作。在闭包内引用循环变量 (valueCopy) 是正确的 (as mentioned here),但柯里化并没有达到我的预期。
我是不是做错了什么,这只是(尚)不支持吗,有什么解决方法吗?这可能是 Jenkins 管道中的错误吗?
希望任何人都知道为什么这不起作用和/或如何使它起作用。
Jenkins:LTS (2.32.1) 和截至 2017/01/19 的最新插件更新。
解决方案:
升级到 Pipeline 后:Groovy 插件 2.40 版现在一切正常。
流水线脚本执行:
def echoSome(val) {
echo val
}
def buildClosures() {
def someList = ["1", "2", "3"]
def closures = [:]
for (value in someList) {
final valueCopy = value
closures[value] = {val ->
echo valueCopy.toString()
echo val.toString()
}.curry(value)
}
closures
}
parallel buildClosures()
输出:
[Pipeline] parallel
[Pipeline] [1] { (Branch: 1)
[Pipeline] [2] { (Branch: 2)
[Pipeline] [3] { (Branch: 3)
[Pipeline] [1] echo
[1] 1
[Pipeline] [1] echo
[1] 3
[Pipeline] [1] }
[Pipeline] [2] echo
[2] 2
[Pipeline] [2] echo
[2] 3
[Pipeline] [2] }
[Pipeline] [3] echo
[3] 3
[Pipeline] [3] echo
[3] 3
[Pipeline] [3] }
[Pipeline] // parallel
[Pipeline] End of Pipeline
Finished: SUCCESS
预期输出:
[Pipeline] parallel
[Pipeline] [1] { (Branch: 1)
[Pipeline] [2] { (Branch: 2)
[Pipeline] [3] { (Branch: 3)
[Pipeline] [1] echo
[1] 1
[Pipeline] [1] echo
[1] 1
[Pipeline] [1] }
[Pipeline] [2] echo
[2] 2
[Pipeline] [2] echo
[2] 2
[Pipeline] [2] }
[Pipeline] [3] echo
[3] 3
[Pipeline] [3] echo
[3] 3
[Pipeline] [3] }
[Pipeline] // parallel
[Pipeline] End of Pipeline
Finished: SUCCESS
【问题讨论】:
标签: jenkins parallel-processing closures jenkins-pipeline currying