Как запустить одно и то же задание несколько раз параллельно с Jenkins?

Я тестирую Jenkins, чтобы увидеть, подойдет ли он для нашей среды сборки и тестирования. Я обнаружил, что Jenkins и его доступные плагины соответствуют большинству наших потребностей. За исключением того, что я не могу найти помощь в том, как выполнить один конкретный тип задачи.

Мы создаем приложение для встраиваемых устройств. У нас есть сотни тестов, которые нужно запустить на этих устройствах. Если запустить все тесты на одном устройстве после сборки, то получение результатов займет несколько часов. Однако если мы запустим тесты на 100 устройствах параллельно, то сможем получить результаты гораздо быстрее.

Все тесты будут иметь очень похожую отправную точку. Тестовый скрипт вызывается с IP-адресом устройства для запуска теста и именем пользователя/паролем. Сценарий выполнит необходимый тест на устройстве и сообщит о прохождении/не прохождении каждого элемента теста.

Я думаю, что долгий/мучительный способ сделать это - написать 100 заданий в Jenkins, каждое из которых будет напрямую представлять собой отдельный тестовый скрипт (с указанными выше параметрами) и запускать их параллельно, используя доступные плагины. Однако сохранить все эти рабочие места в долгосрочной перспективе будет очень сложно.

Таким образом, лучший способ сделать это — создать задание (назовем его child_tester), которое может принимать такие параметры, как: имя тестового сценария, IP-адрес устройства, имя пользователя/пароль и т. д. Затем используйте другое задание (назовем его это mother_tester), чтобы вызвать задание child_tester 100 раз с разными IP-адресами и запустить их параллельно. Мне нужен какой-то способ аккумулировать все результаты тестирования каждого отдельного запуска заданий child_tester и сообщать о них в mother_tester.

Мой вопрос, есть ли плагин или какой-либо способ сделать это в Jenkins? Я просмотрел информацию о плагинах под названием «Поток сборки», «Исполнитель параллельного теста» и «Параметризованный триггер». Однако, похоже, они не соответствуют моим требованиям.


person Ash    schedule 24.02.2015    source источник
comment
В случае, если кому-то нужно, у меня недавно была аналогичная проблема. ответ здесь   -  person Thiago    schedule 25.02.2021


Ответы (2)


Насколько я понимаю, вы изучили плагин Build Flow, но я не уверен, почему вы отклонили его. Возможно, вы сможете указать на дыры в моем предложении.

Предполагая, что в вашей системе достаточно исполнителей для параллельного выполнения заданий, я думаю, что Плагин Build Flow и Агрегатор Build Flow Test плагин может делать то, что вы хотите.

  • Подключаемый модуль Build Flow поддерживает выполнение заданий параллельно . Я не вижу причин, по которым Build Flow не может запланировать параллельное выполнение вашего «дочернего» задания с разными параметрами.

  • Агрегатор тестов Build Flow получает результаты тестов из запланированных сборок задания Build Flow, поэтому вашему «дочернему» заданию потребуется опубликовать собственные результаты тестирования.

  • Вам нужно будет настроить «дочернее» задание, чтобы оно могло выполняться параллельно, установив флажок «Выполнять параллельные сборки, если необходимо» в конфигурации задания.

  • Какой бы набор ведомых устройств не обеспечивал подключение к встроенным устройствам, потребуется достаточное количество исполнителей для параллельного выполнения ваших задач.


Обновление: с помощью простого определения Build Flow:

parallel (
  { build("dbacher flow child", VALUE: 1) },
  { build("dbacher flow child", VALUE: 2) },
  { build("dbacher flow child", VALUE: 3) },
  { build("dbacher flow child", VALUE: 4) }
)

Я получаю вывод:

parallel {
    Schedule job dbacher flow child
    Schedule job dbacher flow child
    Schedule job dbacher flow child
    Schedule job dbacher flow child
    Build dbacher flow child #5 started
    Build dbacher flow child #6 started
    Build dbacher flow child #7 started
    Build dbacher flow child #8 started
    dbacher flow child #6 completed 
    dbacher flow child #7 completed 
    dbacher flow child #5 completed 
    dbacher flow child #8 completed 
}

История заданий показывает, что все четыре задания запланированы с интервалом в несколько секунд друг от друга. Но шаг сборки задания содержит искусственную задержку (сон), которая не позволяет любой отдельной сборке завершиться так быстро.


Обновление 2. Вот пример динамического создания списка параллельных задач из другой структуры данных:

// create a closure for the deploy job for each server 
def paramValues = (1..4)
def testJobs = [] 
for (param in paramValues) { 
  def jobParams = [VALUE: param] 
  def testJob = { 
    // call build 
    build(jobParams, "dbacher flow child") 
  } 
  println jobParams
  testJobs.add(testJob) 
} 

parallel(testJobs)

Список, передаваемый в parallel, — это список замыканий, которые вызывают сборку с уникальными параметрами. Я должен был определить параметры задания вне функции закрытия, чтобы задания планировались отдельно.

Я взял синтаксис из другого ответа и эту тему в списке рассылки Jenkins.

person Dave Bacher    schedule 24.02.2015
comment
Подключаемый модуль потока сборки не работает, если задание с одним и тем же именем выполняется параллельно. Например, мой поток сборки выглядит так: parallel ( {build (FreestyleTest1)}, {build (FreestyleTest1)} ) Однако в этом случае вывод выглядит так: FreestyleTest1 #29 запущен FreestyleTest1 #29 завершен FreestyleTest1 #29 завершен } Задание выполняется только один раз. Если бы я изменил одно из заданий на другое, то они оба выполнялись бы параллельно. - person Ash; 25.02.2015
comment
@Эш, интересно. В Jenkins 1.580.2 с Build Flow 0.16 я могу планировать одно и то же дочернее задание с разными параметрами 4 раза, и дочернее задание выполняется 4 раза параллельно. - person Dave Bacher; 25.02.2015
comment
Спасибо за пример и подробности. Я обнаружил, что если я предоставляю разные параметры/значения дочерним заданиям, то фактически выполняется несколько дочерних заданий. Это может быть ошибка плагина. Однако задания по-прежнему не выполняются параллельно. Ex output: parallel { Расписание задания FreestyleTest1 Расписание задания FreestyleTest1 Build FreestyleTest1 #36 запущено FreestyleTest1 #36 завершено Build FreestyleTest1 #37 запущено FreestyleTest1 #37 завершено}..... Доска состояния Jenkins показала, что 37 ожидает завершения 36, хотя на узле более 2 исполнителей простаивают. - person Ash; 25.02.2015
comment
Кроме того, я использую Jenkins 1.599 и плагин Build Flow 0.17. - person Ash; 25.02.2015
comment
@Ash, можете ли вы убедиться, что ваше задание Freestyle Test1 настроено на выполнение параллельных сборок? Похоже, что у меня работа выполняется параллельно, поэтому все, что я могу сделать, это догадаться, что для вас отличается. - person Dave Bacher; 25.02.2015
comment
Это сделало это! Проверка параметра параллельной сборки и назначение разных параметров позволили запускать два экземпляра одновременно. Спасибо. Теперь следующий шаг — как я могу вызвать запуск дочерних заданий в цикле с переданными им параметрами, а не писать 100 строк жестко запрограммированных вызовов с фиксированными значениями параметров. Команды плагина Build Flow, похоже, не имеют параметров для зацикливания. - person Ash; 25.02.2015
comment
@Ash, язык определения потока сборки — это Groovy, который определенно поддерживает общие структуры данных и итерацию. - person Dave Bacher; 25.02.2015
comment
Спасибо за ссылку на код. Это сработало очень хорошо! Я могу продолжить свой проект. Еще раз спасибо! - person Ash; 27.02.2015
comment
@DaveBacher Я пытаюсь настроить следующим образом, где он должен запускать групповой параллельный тест, а затем нужно выполнить отдельное задание, но я вижу, что выполняются только параллельные задания. parallel ( // задания 1, 2 и 3 будут запланированы параллельно. { build(job1) }, { build(job2) }, { build(job3) } ) // job4,5,6 будет запущен после заданий 1 , 2 и 3 завершают сборку (job4) build (job5) build (job6) Но я вижу, что job4, job5 и job6 даже не запускаются. Ваша помощь будет принята с благодарностью. - person Nick; 13.12.2016
comment
Я попробовал тот же подход, но получил эту ошибку. java.lang.IllegalArgumentException: ожидались именованные аргументы, но были получены [org.jenkinsci.plugins.workflow.cps.CpsClosure2@598ac18e, org.jenkinsci.plugins.workflow.cps.CpsClosure2@238eaf6c, org.jenkinsci.plugins.workflow.cps. CpsClosure2@200d849d, org.jenkinsci.plugins.workflow.cps.CpsClosure2@6ddfc97b] - person Bhavik Joshi; 06.01.2021

Убедитесь, что количество исполнителей в настройках Manage Jenkins -> Manage Nodes больше, чем количество отдельных заданий в проекте MultiJob. По умолчанию, я думаю, это 2. Следовательно, нам нужно увеличить его.

person Jayakrishnan    schedule 02.01.2017