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

87

У меня две работы в jenkins, для каждой из которых нужен один и тот же параметр.

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

Стефан Кендалл
источник
Мы можем использовать так много способов: один лучший способ - использовать текущие параметры задания или использовать предопределенные параметры в триггере нисходящего задания
ksr
1
Это название так сбивает с толку. Как это «передача переменных между заданиями?». Также принятый ответ - это плагин. Представьте себе это!
Ракиб

Ответы:

73

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

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

Лукаш Ранек
источник
10
Привет, извините, что звучу как новичок, но нормально ли, если кто-то может отредактировать это с подробностями о том, как это сделать с помощью плагина параметризованного триггера?
Фади
10
Боковое примечание: не похоже, что экспортированные переменные среды, созданные в разделах сценария bash, могут быть заменены в выходных параметрах (например, 'export VERSION' не заставит 'UPSTREAM_VERSION = $ VERSION' принять правильное значение; он просто получает '$ VERSION' вместо).
Марк МакКенна,
21
Этого ответа недостаточно
tarabyte
6
Я согласен с тем, что должен быть какой-то пример того, как передать параметры целевой задаче. Текущая страница плагина параметризованного триггера не дает точной информации об этом. Например, может быть, какой синтаксис следует использовать при передаче параметров.
skrii
2
Плагин больше не работает. См. Длинный список открытых вопросов . Я больше не могу передавать значения параметров с помощью этого плагина. Любое другое решение?
Markus L
38

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

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

Подробные инструкции можно увидеть здесь: -

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

Надеюсь, это поможет :)

Вину Джозеф
источник
Этот ответ отвечает на вопрос, который задает OP, без необходимости использования плагина или использования DSL.
BTC
8
FYI, этот ответ все еще нужен плагин.
Thomas Lee
Плагин хорош, когда, но он не может передавать значения переменных, установленные в разделах команд оболочки выполнения.
Тара Прасад Гурунг
25

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

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

Найджел Кирби
источник
Это то, что мне было нужно. Спасибо.
luckytaxi 07
Если вы хотите использовать конвейер jenkins 2.x, вы можете использовать writeFile / stash-> unstash / readFile для копирования данных состояния между заданиями. slideshare.net/ericlongtx/… Пример оформления на слайде 21.
сиеста
Это необходимо, если вы хотите, чтобы переменные SHELL передавались. Очень признателен за этот ответ.
Карл Уэйнрайт
18

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

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

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

введите описание изображения здесь

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

Тарун
источник
Полностью согласен. Это обязательное обновление, которое на 100% завершает первоначальный ответ.
CodeSlave
Я также попробовал еще два варианта, за которые проголосовали, но ни один из них не работал, пока не добавил дополнительную конфигурацию, описанную в шаге 4 выше. Мне не нужно было включать артефакты копирования, чтобы он работал.
Джефф Фол
10

(для коллег-гуглеров)

Если вы создаете серьезный конвейер с помощью подключаемого модуля Build Flow , вы можете передавать параметры между заданиями с помощью 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 '------------------------------------'
Offirmo
источник
Плагин Build Flow устарел, пользователям следует перейти на wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin
vhamon
7

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

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

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

Шон
источник
3

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

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

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

Действия сборки:

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

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

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

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

Например: отправка свойств

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

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

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

Эли Мус
источник
РЕДАКТИРОВАТЬ: Нашел ляп в том, что я написал. В определении свойств это должно было быть: echo POM_VERSION = $ POM_VERSION> play.properties, а не: echo $ POM_VERSION >> play.properties Извините за это.
Эли Мус
2

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

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

tbradt
источник
1

Вы можете использовать Hudson Groovy builder .

Первая работа в разработке

введите описание изображения здесь

Вторая работа в разработке

введите описание изображения здесь

КАМОБАП
источник
1
ответ, основанный на двух изображениях и внешней ссылке, не очень полезный ответ
Уилл Барнуэлл
0

Я понял!

Я понял это после почти 2 часов проб и ошибок.

Это РАБОТАЕТ, и это то, что вы делаете для передачи переменных удаленному заданию:

    def handle = triggerRemoteJob(remoteJenkinsName: 'remoteJenkins', job: 'RemoteJob' paramters: "param1=${env.PARAM1}\nparam2=${env.param2}")

Используйте \ n для разделения двух параметров, без пробелов ..

В отличие от параметров: '' 'someparams' ''

мы используем параметры: "someparams"

"..." - это то, что дает нам значения желаемых переменных. (Это двойные кавычки, а не две одинарные)

'' '...' '' или '...' не дадут нам этих значений. (Три одинарные кавычки или просто одинарные кавычки)

Все параметры здесь определены в блоке environment {} в начале конвейера и при необходимости изменяются поэтапно> шаги> сценарии.

Я также проверил и обнаружил, что когда вы используете "...", вы не можете использовать что-то вроде '' '... "..."' '' или "... '..'..." или любую комбинацию Это...

Уловка здесь в том, что когда вы используете "..." в разделе параметров, вы не можете передавать строковый параметр; например, это НЕ РАБОТАЕТ:

    def handle = triggerRemoteJob(remoteJenkinsName: 'remoteJenkins', job: 'RemoteJob' paramters: "param1=${env.PARAM1}\nparam2='param2'")

если вы хотите передать что-то вроде приведенного выше, вам нужно будет установить переменную окружения param2 = 'param2', а затем использовать $ {env.param2} в разделе параметров шага плагина удаленного триггера

Михир Дешпанде
источник