2016-05-19 3 views
5

У меня есть несколько (несколько сотен) файлов для запуска теста (каждый тест занимает несколько минут).Параллельный запуск с jenkins

Выполнение последовательно не приемлемо и ни все вместе. Поэтому я ищу что-то вроде производителя-потребителя.

Я попробовал работу конвейера и параллельно команду следующим образом:

def files = findFiles glob: 'test_files/*' 
def branches = [:] 

files.each{ 
    def test_command = "./test ${it}" 
    branches["${it}"] = { sh "${test_command} ${it}"} 
} 

stage name:'run', concurrency:2 
parallel branches 

Проблема:

Все задачи запуска в то же время (ООМ и все удовольствие)

ответ

0

Безразлично» t имеют ту же самую интроспекцию, что и параллельный шаг Дженкинса, но поскольку он не поддерживает фиксированный пул, вы можете использовать xargs для достижения такого же результата:

def files = findFiles glob: 'test_files/*' 
def branches = [:] 

// there's probably a more efficient way to generate the list of commands 
files.each{ 
    sh "echo './test ${it}' >> tests.txt" 
} 

sh 'cat tests.txt | xargs -L 1 -I {} -P 2 bash -c "{}"' 

Аргумент -P - это тот, который указывает, что фиксированное число из 2 (или N) процессов должно всегда работать. Другие инструменты, такие как GNU Parallel, предлагают еще большую настройку того, сколько процессов необходимо использовать.

Вы также можете попытаться использовать шаг lock от Lockable Resources plugin, шаг node, ориентированный на фиксированное количество исполнителей. Однако для меня это слишком много накладных расходов, если только ваши одиночные тесты уже занимают десятки секунд.

Смежные вопросы