В нашем конвейере Jenkins мы используем следующую функцию для выполнения набора задач развертывания в параллельных порциях:
def runParallel(tasks, count) {
while (tasks.size() > 0) {
parallel tasks.take(count)
tasks = tasks.drop(count)
}
}
С помощью параметра count
мы контролируем, сколько задач выполняется параллельно, поэтому сеть не перегружена слишком большим количеством параллельных развертываний.
Это работает хорошо, но имеет обратную сторону: если одна задача в блоке занимает очень много времени, следующий блок должен ждать, пока не завершится предыдущий блок полностью закончен. Несмотря на то, что в настоящее время выполняется только одна задача и достаточно ресурсов для запуска count - 1
новых задач.
Итак, что нам действительно нужно, так это не разбивать tasks
на фрагменты фиксированного размера с помощью count
задач, а скорее подход со скользящим окном, который повторяет tasks
с размером окна count
и переходит к следующей задаче, как только первая задача внутри окна завершена. Таким образом, у нас не будет времени ожидания, которое имеет наш подход, основанный на блоках.
AFAIK невозможно добавить больше задач к шагу parallel
после его запуска. Но, может быть, есть обходной путь?
В идеале parallel
должен принимать параметр, который контролирует степень распараллеливания. Тогда мы могли бы просто сделать:
parallel tasks, count