我在项目中的不同子项目上有一个长期运行的Gradle任务列表.我想使用Jenkins声明性管道并行运行它们.
我希望这样的东西可能会起作用:
projects = [":a", ":b", ":c"]
pipeline {
stage("Deploy"){
parallel {
for(project in projects){
stage(project ) {
when {
expression {
someConditionalFunction(project)
}
}
steps {
sh "./gradlew ${project}:someLongrunningGradleTask"
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
不用说,由于它是期待阶段而不是for,因此会产生编译错误.关于如何克服这个问题的任何想法?谢谢
我们正试图迭代Map,但没有任何成功.我们将问题简化为这个最小的例子:
def map = [
'monday': 'mon',
'tuesday': 'tue',
]
Run Code Online (Sandbox Code Playgroud)
如果我们尝试迭代:
map.each{ k, v -> println "${k}:${v}" }
Run Code Online (Sandbox Code Playgroud)
仅输出第一个条目: monday:mon
我们知道的替代方案甚至无法进入循环:
for (e in map)
{
println "key = ${e.key}, value = ${e.value}"
}
Run Code Online (Sandbox Code Playgroud)
要么
for (Map.Entry<String, String> e: map.entrySet())
{
println "key = ${e.key}, value = ${e.value}"
}
Run Code Online (Sandbox Code Playgroud)
失败,都只显示异常java.io.NotSerializableException: java.util.LinkedHashMap$Entry.(这可能与提出'真实'例外时发生的异常有关,阻止我们知道发生了什么).
我们正在使用最新的稳定jenkins(2.19.1),截至今天(2016/10/20)所有插件都是最新的.
是否有解决方案来迭代MapJenkins管道Groovy脚本中的元素?
我们在一些工作中动态创建并行步骤.感谢这个线程,我找到了如何动态创建带有参数的地图,以便在并行步骤中使用.
但是现在我想重用用于创建这些并行步骤的代码部分.为此,我觉得我需要为闭合咖喱做准备.
然而,currying似乎无法正常工作.在闭包内引用循环变量(valueCopy)做了正确的事情(如这里所提到的)但是currying并没有达到我的预期.
我做错了什么,这是不是(还)支持,是否有任何解决方法?这可能是Jenkins管道中的一个错误吗?
希望任何人都知道为什么这不起作用和/或如何让它工作.
Jenkins:LTS(2.32.1)及最新的插件更新截至2017/01/19.
升级到Pipeline后:Groovy插件版本2.40 eveything正在按预期工作.
管道脚本执行:
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()
Run Code Online (Sandbox Code Playgroud)
输出:
[Pipeline] parallel
[Pipeline] [1] { (Branch: 1)
[Pipeline] [2] { (Branch: 2)
[Pipeline] [3] { (Branch: 3)
[Pipeline] [1] echo
[1] 1
[Pipeline] …Run Code Online (Sandbox Code Playgroud) parallel-processing closures currying jenkins jenkins-pipeline
我对groovy的了解并没有超出我对Jenkinsfiles的了解.我试图弄清楚是否可以在Jenkinsfile中定义一个可以以"for循环"方式应用的映射.
我有这些变量:
mymap = {
"k1": "v1"
"k2": "v2"
"k3": "v3"
}
Run Code Online (Sandbox Code Playgroud)
stage我的Jenkins文件中有一个如下所示:
stage('Build Image') {
withCredentials([[<the credentials>]) {
sh "make build KEY={k1,k2,k3} VALUE='{v1,v2,v3}'"
}
Run Code Online (Sandbox Code Playgroud)
有没有办法Build Image为每个配对做一个舞台mymap?我尝试过的东西没有运气.