2013-06-24 2 views
18

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

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

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

+0

Есть еще один способ для добавления узлов на работу без редактирования файла resources.xml? В конечном итоге мы будем масштабировать до тысяч узлов, а их добавление вручную в файл XML немного утомительно, особенно потому, что узлы могут меняться. Кроме этого, Rundeck выглядит так, что у него много функций, которые я хочу. – user2406467

+0

@ MarkO'Connor - Я думаю, что Rundeck может выполнить то, что мы делаем, тогда :) Мы в конечном итоге будем использовать EC2. Если вы хотите добавить свои ответы в качестве ответа, я должен принять его. Благодаря! – user2406467

ответ

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

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

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

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

+1

Необходимость выбора отдельных узлов была бы очень неудобной, поскольку мы хотели бы увеличить до нескольких тысяч в какой-то момент. Я посмотрел плагин Job DSL и смог сгенерировать одно задание, но я не совсем понимаю, как перебирать все подчиненные. Также .. кажется, что после создания заданий мне все равно придется вручную их выполнять. – user2406467

+0

@ ^^^ вот хорошее введение в работу DSL, которая немного ослабила его: https://www.youtube.com/watch?v=Gyccyj6lA8k – dyodji

11

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

8

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

+0

мне кажется, что это единственный приемлемый ответ –

+1

Это не работает. Помещение одной метки в ось будет строить задание на одном узле с этой меткой. – jwg

+1

Да, он построит задание на этом единственном узле. Обычно у нас есть метки, которые являются общими, т. Е. Несколько узлов используют одно и то же имя метки в соответствии с их использованием. (мы не используем уникальные имена ярлыков для всех узлов, поскольку имя узла уже является уникальным и служит для этой цели). Кроме того, вы можете указать более одного имени ярлыка в текстовой области. Это единственное решение, которое я нашел. Пожалуйста, помогите мне, если у вас есть лучшее решение. –

5

У него есть - не нужно никаких специальных плагинов!

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

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

enter image description here

+0

. Что произойдет, когда узел выбранной метки займет слишком много времени запустить одну из запущенных сборников? Не будет ли он работать на другом узле того же ярлыка, который уже запускает запущенную сборку? – ldnunes

+1

@ldnunes Нет, сборка не завершится до тех пор, пока она не будет запущена на всех узлах этой метки (только для подключенных ведомых устройств) –

+3

Для этого требуется «параметризованный триггер + плагин с параметрами нодабель» для всех, кто не может найти эти параметры в своих Jenkins (т.е. меня). – medwards

9
  1. Установите
  2. Для задания вы хотите запустить, включите Выполнить одновременно создает при необходимости
  3. Создайте другую работу, кроме работы, которую вы хотите запустить на всех подчиненных и настроить его
    • Сложение> Добавить шаг сборки> Trigger/вызов основывается на других проектах
      • Добавить ParameterFactories> Все узлы для фабрики этикетки> метка: метка узлов
+0

Правильный ответ. –

5

принимая некоторые из вышеуказанных ответов и регулировочных их для серии 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