我的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时,有没有办法单独运行我刚刚添加的步骤?或者有更简单的方法来实现这一目标吗?
答案 0 :(得分:0)
我写了一个Step
类,知道它的家属。一开始我收集所有步骤并将它们放在LinkedBlockQueue中,然后使用
def worker = [:]
maxConcurrentSteps.times {
worker["worker${it}"] = {
Step work = getWork() // uses take() to get new work
while (work != null) {
work.run()
work = getWork()
}
}
}