Конвейер Jenkins: как выделить несколько узлов для одного теста - распределенная оркестровка теста - PullRequest
0 голосов
/ 14 февраля 2019

Это не обычный вопрос «Выполнить эту работу на многих подчиненных»!

Ответы на резаки печенья не подходят.

Вариант использования

Я пытаюсь использовать конвейер Jenkins, чтобы провести тестирование для распределенного программного обеспечения, которое включает в себя один «клиент» и множество «серверов», выделив подчиненные Jenkins для этих ролей, запустив компоненты на подчиненных и затем разрушив их.Мы можем притвориться, что «серверы» будут запускать веб-сервер, а «клиент» запускает против них «wget».

Соображения

Я использую сценарий конвейера (не декларативный).По сути, мне нужно, чтобы все «серверы» были включены, когда я запускаю клиентскую логику на «клиентском» узле.

Очевидно, последовательные блоки node {} не будут работать, потому что мне нужно, чтобы все подчиненные работали одновременно.Параллель может работать, и я открыт для этого варианта, но, похоже, его будет сложно отлаживать.

Мое решение

Итак, вот что я придумала до сих пор.Это упрощенный пример, может быть логика после закрытия каждого узла (настройка каждого сервера) и ближе к концу каждого закрытия узла (очистка каждого сервера), или это можетвсе должно быть сделано клиентом, на самом деле не имеет значения.

def allocatedServerList = []
// Allocate 3 "servers" and then 1 client. Keep servers allocated.
node {
   allocatedServerList << env.NODE_NAME
   node {
      allocatedServerList << env.NODE_NAME
      node {
         allocatedServerList << env.NODE_NAME
         node {
            //this is the client
            sh "run some client work against ${allocatedServerList}"
            //eg: ssh to each server, start some service, pound it for a while, shut them down
         }
      }
   }
}

Удивительно, но это прекрасно работает.

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

1 Ответ

0 голосов
/ 14 февраля 2019

для запуска на всех узлах вы можете использовать что-то вроде этого:

Trigger Job On All Nodes

В примере показано, как запускать задания на всех узлах Jenkins из конвейера.

Сводка: * Скрипт использует плагин NodeLabel Parameter для передачи имени задания в задание полезной нагрузки.* Поиск списка узлов выполняется с помощью Jenkins API, поэтому для него потребуется утверждение сценариев в режиме «Песочница». Чтобы увидеть этот пример на jenkins.io, посетите: Триггерное задание на всех узлах

...