Как запустить сборку jenkins на конкретном узле с помощью плагина конвейера?

У меня есть задание конвейера Jenkins под названием «TestPipeline». Я хочу запустить сборку на двух разных ведомых устройствах, которые помечены как «tester1» и «tester2». И сценарий конвейера здесь довольно прост:

node('tester1') {
    build 'test_job'
}
node('tester2') {
    build 'test_job'
}

Однако, когда я запускаю задание TestPipeline, «test_job» не запускается на узлах, которые я назначил. Но вместо этого запустите случайный узел.

Мне интересно, должен ли я установить «Ограничить, где этот проект может быть запущен» в моем «test_job». Поэтому я установил для него значение «tester» (метка «tester» содержит и узел «tester1», и «tester2»). Но когда я снова запускаю задание конвейера, «test_job» запускается на «tester2» дважды. Я должен ожидать, что задание сначала будет запущено на «tester1», а затем на «tester2». Это почему? Это потому, что шаг «узел» не имеет значения, когда дело доходит до того, на каком узле должен быть построен шаг сборки?


person Andy Wang    schedule 07.07.2016    source источник
comment
Я пробовал использовать подключаемый модуль параметров NodeLabel. Но я застрял в том, как указать параметр узла в скрипте конвейера. Синтаксис конвейера выводит только как задание сборки: 'test_print', параметры: [‹объект типа org.jvnet.jenkins.plugins.nodelabelparameter.NodeParameterValue›] в зависимости от того, какой узел я выберу.   -  person Andy Wang    schedule 07.07.2016


Ответы (4)


См. Ошибку здесь. Решение следующее.

  1. Установите плагин параметров узла и метки
  2. В конфигурации test_job выберите «Эта сборка параметризована», добавьте параметр Label и установите для имени параметра значение «node»
  3. В сценарии конвейера используйте код:
build job: 'test_job', parameters: [[$class: 'LabelParameterValue', name: 'node', label: 'tester1']]
build job: 'test_job', parameters: [[$class: 'LabelParameterValue', name: 'node', label: 'tester2']]

И работа будет построена так, как я хотел.

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

person Andy Wang    schedule 13.07.2016
comment
Как сказал Джесси Глик: метка на узле выбирает, какой узел выделяется во время его блока. Обертывание сборки внутри узла вообще не имеет смысла; контекст узла игнорируется, вы просто теряете слот исполнителя. Использование LabelParameterValue - подходящее решение запрошенной проблемы. - person Andy Wang; 20.09.2016
comment
Я уже какое-то время борюсь, как сделать шаг 2, но на другом задании конвейера со сценарием. Я создал связанный вопрос stackoverflow.com/questions/55470917/. Спасибо за любые предложения - person Jernej Gorički; 02.04.2019

Я сделал то же самое, но с помощью параметра Node, поэтому я могу использовать список узлов, выполняющее задание напрямую, или работающий конвейер (в конвейере я использую параметр Choice, чтобы получить список доступных узлов). Так что в моем случае:

  1. Установите плагин параметров узла и метки
  2. В конфигурации test_job выберите «Эта сборка параметризована», добавьте параметр узла и установите для имени параметра значение node_name.
  3. В конвейере добавьте параметр Choice, назовите его node, укажите возможные варианты, чтобы при запуске конвейера вы могли выбрать, на каком узле он должен запускаться.

Код для вставки в сценарий конвейера:

build job: 'my_job', 
  parameters: [[$class: 'NodeParameterValue', name: 'node_name', labels: ["$node"], nodeEligibility: [$class: 'AllNodeEligibility']]]
person Grysik    schedule 27.02.2017

Вот как у меня это работает

  1. создать «задание» «test_job» с типом параметра «метка», именем «узел», значением может быть любая строка. (это задание, которое должно быть запущено). Установите 'Ограничить, где этот проект может быть запущен' для значения метки

  2. создать «конвейер» с типом параметра «Узел». Из раздела конвейера используйте следующий скрипт

Обратите внимание, что ярлык для test_job - $ {env.NODE_NAME}, который будет установлен конвейером по выбору пользователя.

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
              echo 'Building..'
              script {
                build job: 'test_job', parameters: [
                [$class: 'LabelParameterValue', name: 'node', label: "${env.NODE_NAME}" ]
                ]
}}}}}
 

person cannie    schedule 10.11.2018
comment
Кэнни, есть ли способ параметризовать имя агента в параметрах сборки, я искал что-то вроде этого: pipeline { agent ${'node'} } } } - person prakash krishnan; 05.10.2019

Я только что проверил это на своей установке, и он правильно запускал каждый сценарий на каждом узле. Возможно, вы захотите проверить, правильно ли вы настроили свои ведомые устройства. Я считаю, что в документации говорится, что им нужен запуск ведомых агентов через настройку Java Web Start, вы можете это проверить.

person Alex Haynes    schedule 07.07.2016
comment
Мои рабы запускаются по ssh. Думаю, может быть, это сработает, если я изменю настройки на Java Web Start. Поэтому я снова протестировал, используя Java Web Start. Однако результат тот же. Задание по-прежнему выполняется на случайных узлах. - person Andy Wang; 11.07.2016