【问题标题】:Limit parallel builds to a specific number in Jenkins在 Jenkins 中将并行构建限制为特定数量
【发布时间】:2017-12-07 10:17:39
【问题描述】:

我的 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 时,有没有办法单独运行我刚刚添加的步骤?还是有更简单的方法来实现这一点?

【问题讨论】:

    标签: java multithreading jenkins parallel-processing


    【解决方案1】:

    我写了一个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()
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      相关资源
      最近更新 更多