相关疑难解决方法(0)

是否可以在循环中创建并行的Jenkins声明管道阶段?

我在项目中的不同子项目上有一个长期运行的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,因此会产生编译错误.关于如何克服这个问题的任何想法?谢谢

jenkins jenkins-pipeline

21
推荐指数
2
解决办法
1万
查看次数

在Jenkins管道中使用Groovy迭代地图是不可能的

我们正试图迭代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脚本中的元素?

groovy dictionary jenkins jenkins-pipeline

14
推荐指数
2
解决办法
1万
查看次数

为常规执行调整groovy CPS闭包

我们在一些工作中动态创建并行步骤.感谢这个线程,我找到了如何动态创建带有参数的地图,以便在并行步骤中使用.

但是现在我想重用用于创建这些并行步骤的代码部分.为此,我觉得我需要为闭合咖喱做准备.

然而,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

9
推荐指数
2
解决办法
1369
查看次数

如何在Jenkinsfile中定义和迭代映射

我对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?我尝试过的东西没有运气.

groovy jenkins jenkins-pipeline

6
推荐指数
3
解决办法
3万
查看次数