Подтвердить что ты не робот

Выполнение задания Дженкинса одновременно на всех узлах

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

Я видел предложение использовать параметр конфигурации матрицы в Jenkins, но я могу думать только об одной оси (группе ярлыков). Когда я пытаюсь запустить задание, кажется, что он выполняется один раз вместо 300 раз (по 1 для каждого из узлов в этой группе ярлыков).

Какая должна быть моя другая ось? Или... есть ли какой-нибудь плагин для этого? Я попробовал модуль NodeLabel Parameter Plugin и выбрал "запустить все доступные онлайн-узлы", но он, похоже, не запускает задания одновременно.

4b9b3361

Ответ 1

  • Rundeck может быть инструментом, лучше подходящим для ваших нужд. Можно настроить одновременное выполнение нескольких заданий и иметь плагин для Jenkins: http://rundeck.org/
  • Rundeck предназначен для интеграции с более крупными системами. Мы создаем файл ресурсов из нашей базы данных управления конфигурацией. Очень легко увидеть документацию: http://rundeck.org/docs/administration/node-resource-sources.html.
  • Дополнительно плагины доступны для амазонок и/или систем, таких как кукольный и шеф-повар: http://rundeck.org/plugins

Ответ 2

Будет построена матрица; используйте "ведомые устройства" в качестве оси и разверните список "Индивидуальные узлы", чтобы выбрать все ваши узлы.

Обратите внимание, что вам нужно будет обновлять выбор при каждом добавлении или удалении ведомого.

Для более удобного решения вы можете использовать плагин Job DSL, чтобы настроить начальное задание с шаблоном для сборки, затем петли над каждым ведомым и создает новое задание с меткой сборки, установленной на имя подчиненного устройства.

Ответ 3

Существует два плагина: Paramitrized Trigger Plugin, чтобы иметь возможность запускать другие задания в качестве шага сборки вашего основного задания и Плагин NodeLabel (прочитайте раздел BuildParameterFactory для описания того, что вам нужно), чтобы указать метку.

Ответ 4

Самый лучший и простой способ добиться этого - использовать плагин Elastic Axis.
1. Установите pulgin.
2. Создайте задание Multi Configuration (установите, если нет)
3. В конфигурации задания вы можете найти новую ось, добавленную как Эластичная ось. Добавьте метку, как показано ниже, чтобы запустить задание на нескольких подчиненных устройствах. enter image description here

Ответ 5

  • Установить
  • Для задания, которое вы хотите запустить, включите параллельные сборки Execute при необходимости
  • Создайте другое задание помимо задания, которое вы хотите запустить на всех подчиненных устройствах и настройте его
    • Сборкa > Добавить шаг сборки > Создание триггеров/вызовов в других проектах
      • Добавить ParameterFactories > Все узлы для метки Factory > Метка: метка узлов

Ответ 6

Получил это - нет необходимости в каких-либо специальных плагинах!

Я создал родительское задание, которое запускает/вызывает другую сборку, И когда я его назову, я передаю ему Ярлык, что я не буду выполнять дочернее задание.

Таким образом, основное задание родителя. Только запускает задание, которое мне нужно, и дочернее задание будет выполняться столько раз, сколько количество ведомых в Ярлык (В моем случае 4 раза).

enter image description here

Ответ 7

Взяв несколько из приведенных выше ответов и отрегулировав их для серии 2.0.

Теперь вы можете запустить все задания на всех узлах.

// The script triggers PayloadJob on every node.
// It uses Node and Label Parameter plugin to pass the job name to the payload job.
// The code will require approval of several Jenkins classes in the Script Security mode
def branches = [:]
def names = nodeNames()
for (int i=0; i<names.size(); ++i) {
  def nodeName = names[i];
  // Into each branch we put the pipeline code we want to execute
  branches["node_" + nodeName] = {
    node(nodeName) {
      echo "Triggering on " + nodeName
      build job: 'PayloadJob', parameters: [
              new org.jvnet.jenkins.plugins.nodelabelparameter.NodeParameterValue
                  ("TARGET_NODE", "description", nodeName)
          ]
    }
  }
}

// Now we trigger all branches
parallel branches

// This method collects a list of Node names from the current Jenkins instance
@NonCPS
def nodeNames() {
  return jenkins.model.Jenkins.instance.nodes.collect { node -> node.name }
}

Взято из кода https://jenkins.io/doc/pipeline/examples/#trigger-job-on-all-nodes