将并行构建限制为Jenkins中的特定数字

时间:2017-12-07 10:17:40

标签: java multithreading jenkins parallel-processing

我的Jenkinsfile中有许多构建,现在并行运行。但主服务器有点过度训练。所以我的想法是将它的构建限制为配置值 concurrentBuilds

https://issues.jenkins-ci.org/browse/JENKINS-44085启发了我,但我的计划有些困难。我有一个服务列表,现在收集在一个地图中,并行运行,如下所示:

def stepsForParallel = [:]
stage('read modules') {
  readMavenPom().modules.findAll { module ->
    module.endsWith('-service')
  }.each { service ->
   stepsForParallel[service] = transformIntoStep(service) // this returns { build module } to avoid immediate execution
  }
}
stage('modules') {
  parallel stepsForParallel
}

构建函数也使用并行。所以我得到了很多并行任务。

我的想法是创建一个LinkedBlockingDeque(让我们称之为 stepDeque ),收集所有应该并行完成的步骤。然后,我创建第二个(让我们称之为 workingDeque ),其大小与已配置的 concurrentBuilds 相同。

然后我的问题出现了:据我所知,我只能在地图上并行运行。因此,当workingDeque的任务之一完成时,我有一个免费的线程。

所以我的问题是:当我从stepDeque轮询一个作业并将其添加到workingDeque时,有没有办法单独运行我刚刚添加的步骤?或者有更简单的方法来实现这一目标吗?

1 个答案:

答案 0 :(得分:0)

我写了一个Step类,知道它的家属。一开始我收集所有步骤并将它们放在LinkedBlockQueue中,然后使用

创建 n 工作者
def worker = [:]
maxConcurrentSteps.times {
  worker["worker${it}"] = {
    Step work = getWork() // uses take() to get new work
    while (work != null) {
      work.run()
      work = getWork()
    }
  }
}