在Jenkins管道脚本中调节并行步骤

时间:2017-08-11 10:50:17

标签: jenkins parallel-processing jenkins-pipeline jenkins-groovy

我正在使用这样的东西并行运行测试:

stage('Test') {
  steps {
    script {
      testing_closures = [one: { print("staring one"); sleep 10; print("finishing one") },
                          two: { print("staring two"); sleep 10; print("finishing two") },
                          three: { print("staring three"); sleep 10; print("finishing three") },
                          four: { print("staring four"); sleep 10; print("finishing four") },
                          five: { print("staring five"); sleep 10; print("finishing five") },
                          six: { print("staring six"); sleep 10; print("finishing six") }]
      parallel(testing_closures)
    }
  }
}

主要目标是限制那些关闭 - 我不希望所有六个关闭同时运行 - 一次只有3个。我希望能够运行另一个这样的构建,它也将运行所有这些闭包,但同时只运行3个。

我正在考虑使用节点 - 即在节点{}块中包装每个闭包:

one: { node { print("staring one"); sleep 10; print("finishing one") } }

只要我使用主节点并将执行程序限制为4(主要作业为1,节点{}并发步骤为3),就可以正常工作。

不幸的是,我需要主节点执行器可用于其他作业(以及相关作业的其他版本),所以我不能限制它们。

我能想到的唯一解决方案是以下列方式使用可锁定资源:

  1. 通过LockableResourcesManager::createResourceWithLabel()使用构建唯一标签动态创建3个可锁定资源

  2. 在所有闭包中按标签锁定

  3. 闭包将等待彼此完成,此时只有3个正在运行。

  4. ......现在我被卡住了。我找不到任何删除资源的方法。我只找到open bug for quite similar issue。编辑:我创建了improvement request for it

  5. 即使有一种删除资源的方法,这个解决方案看起来很脏,并添加了不必要的资源,如果出现问题,可能无法清理。

    那么 - 我如何实现目标?有没有办法节制平行步骤?

1 个答案:

答案 0 :(得分:0)

您绝对可以使用LockableResources Plugin来做到这一点,只需为给定标签定义3个资源,然后将每个关键步骤所需的quantity设为1。(否则它将需要所有资源给出的标签)

node('slave') {
    def execs = [:]
    execs[1] = {
        lock(label: 'Win81x64Pool', quantity: 1, variable: "MY_VAR") {
            println "LOCKED=" + env.MY_VAR
            sleep(3)
       }
    }
    execs[2] = {
        lock(label: 'Win81x64Pool', quantity: 1, variable: "MY_VAR") {
            println "LOCKED=" + env.MY_VAR
            sleep(3)
        }
    }
    execs[3] = {
        lock(label: 'Win81x64Pool', quantity: 1, variable: "YOUR_VAR") {
            println "LOCKED=" + env.YOUR_VAR
            sleep(3)
        }
    }
    parallel execs
}