【发布时间】: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