it-roy-ru.com

Дженкинс - передача переменных между заданиями?

У меня есть две работы в Jenkins, обе из которых нуждаются в одном и том же параметре. 

Как запустить первое задание с параметром, чтобы при запуске второго задания использовался тот же параметр?

69
Stefan Kendall

Вы можете использовать Parameterized Trigger Plugin , который позволит вам передавать параметры из одной задачи в другую.

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

64
Łukasz Rżanek

1.Пост-действия по сборке> Выберите «Запустить параметризованную сборку для других проектов».

2.Введите переменную окружения со значением. Значением также могут быть параметры сборки Jenkins.

Подробные шаги можно увидеть здесь: -

https://itisatechiesworld.wordpress.com/jenkins-related-articles/jenkins-configuration/jenkins-passing-a-parameter-from-one-job-to-another/

Надеюсь, это полезно :)

26
Vinu Joseph

Принятый ответ здесь не работает для моего варианта использования. Мне нужно было иметь возможность динамически создавать параметры в одном задании и передавать их в другое. Как отмечает Mark McKenna , по-видимому, нет способа экспортировать переменную из шага сборки Shell в действия после сборки.

Я достиг обходного пути, используя Parameterized Trigger Plugin , записав значения в файл и используя этот файл в качестве параметров для импорта через «Добавить действие после сборки» -> «Триггерная параметризованная сборка ...», затем выбрав « Добавить параметры '->' Параметры из файла свойств '.

16
Nigel Kirby

Я думаю, что ответ выше нуждается в некотором обновлении:

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

  1. Я скопировал артефакты из моей текущей работы, используя плагин копирования артефактов.
  2. В последующем действии сборки верхнего уровня я добавил переменную типа «SOURCE_BUILD_NUMBER = $ {BUILD_NUMBER}» и настроил ее для запуска нижестоящего задания.
  3. Все работало, за исключением того, что моя нижестоящая работа не смогла получить $ SOURCE_BUILD_NUMBER для создания каталога.
  4. Итак, я обнаружил, что для использования этой переменной я должен определить ту же переменную в задании вниз по потоку, что и переменная параметра, как показано на следующем рисунке:

 enter image description here

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

10
Tarun

(для коллег по Google)

Если вы строите серьезный конвейер с помощью Build Flow Plugin , вы можете передавать параметры между заданиями с помощью DSL следующим образом:

Предположим доступный строковый параметр "CVS_TAG", чтобы передать его другим работам:

build("pipeline_begin", CVS_TAG: params['CVS_TAG'])
parallel (
   // will be scheduled in parallel.
   { build("pipeline_static_analysis", CVS_TAG: params['CVS_TAG']) },
   { build("pipeline_nonreg", CVS_TAG: params['CVS_TAG']) }
)
// will be triggered after previous jobs complete
build("pipeline_end", CVS_TAG: params['CVS_TAG'])

Подсказка для отображения доступных переменных/параметров:

// output values
out.println '------------------------------------'
out.println 'Triggered Parameters Map:'
out.println params
out.println '------------------------------------'
out.println 'Build Object Properties:'
build.properties.each { out.println "$it.key -> $it.value" }
out.println '------------------------------------'
9
Offirmo

Просто добавьте мой ответ в дополнение к Найджелу Кирби, поскольку я пока не могу комментировать:

Чтобы передать динамически созданный параметр, вы также можете экспортировать переменную в плитку «Выполнить оболочку» и затем передать ее через «Параметризованная сборка триггера для других проектов» => «Предопределенные параметры» => дать «YOUR_VAR = $ YOUR_VAR». Моя команда использует эту функцию для передачи версии пакета npm из задания сборки в задания развертывания

ОБНОВЛЕНИЕ: описанное выше работает только для введенных параметров Jenkins, параметр, созданный из Shell, все еще должен использовать тот же метод. например. echo YOUR_VAR = $ {YOUR_VAR}> variable.properties и передать этот файл вниз по течению

7
Shawn

Вы можете использовать Hudson Groovy builder , чтобы сделать это.

Первая работа в трубопроводе

enter image description here

Вторая работа в трубопроводе

enter image description here

2
CAMOBAP

Я столкнулся с той же проблемой, когда мне пришлось передать версию pom в последующую работу Rundeck.

Я использовал инъекцию параметров через файл свойств как таковой:

1) Создание свойств в файле свойств через Shell:

Построить действия:

  • Выполнить сценарий оболочки
  • Внедрить переменные среды

Например: определение свойств

2) Передача определенных свойств в последующее задание: Действия после сборки: 

  • Триггерная параметризованная сборка на другом проекте
  • Добавить параметры: Текущие параметры сборки
  • Добавить параметры: предопределенные параметры

E.g: свойства отправки

3) Тогда можно было использовать $ POM_VERSION как таковой в последующем задании Rundeck. 

/!\Jenkins версия: 1.636

/!\По какой-то причине при создании триггерной сборки было необходимо добавить параметр «Параметры текущей сборки» для передачи свойств.

2
Eli Mous

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

В этих случаях я предпочитаю выводить значения в файл свойств, а затем вставлять их в любую нужную мне работу, используя плагин EnvInject . Это можно сделать динамически, что является еще одним способом решения проблемы из другого ответа выше, где параметризованные задания все еще использовались. Это решение очень хорошо масштабируется во многих сценариях.

2
tbradt

Смотрите мой ответ в этом другом посте:

Работал для меня (параметр должен быть указан в обоих заданиях, а не только в родительском задании)

https://stackoverflow.com/a/40348900/2010136

0
user2010136