Jenkins + Build Flow, как передать переменную из одного задания в другое
У меня есть сценарий потока сборки, похожий на пример документации: два задания, одно выполняется за другим.
b = build("job1")
build("job2", param1: b.????)
мой job1
скрипт оболочки, который собирает пакет из проверенной репозитории git и распечатывает версию собранного пакета
Мне нужно извлечь версию из job1
(разобрать вывод??) и сделать его доступным как-то в качестве параметра job2
, Как этого достичь? Обратите внимание, что я не могу знать версию перед запуском job1
,
4 ответа
Проблема с простым использованием export
на этапе создания сценария оболочки то, что экспортированные переменные исчезают при выходе из сценария оболочки, они не распространяются до задания.
Используйте плагин EnvInject для создания переменных среды в вашей сборке. Если вы записываете файл свойств как часть вашей сборки, EnvInject может прочитать файл и внедрить переменные в качестве шага сборки. Файл свойств имеет простой KEY=VALUE
формат:
MY_BUILD_VERSION=some_parsed_value
Как только в вашей работе установлена переменная окружения, в плагине Build Flow вы можете извлечь значение переменной и использовать его в последующих работах:
def version = build.environment.get( "MY_BUILD_VERSION" )
out.println String.format("Parameters: version: %s", version)
build( "My Second Build", MY_BUILD_VERSION: version )
Когда ты бежишь job1
экспортировать версию с именем в качестве системного свойства.
export appVersion="stringOfVersion-123"
Тогда это зависит, если вы знаете, как долго версия (количество цифр или других символов). Если вы знаете это, вы можете проанализировать переменную с конца во второй сборке как новую переменную и использовать ее.
Как разобрать строку вы можете найти в этом вопросе с хорошими примерами.
Если job2 всегда должен получать некоторую информацию от job1, вы можете использовать подход без параметров. Job1 может опубликовать артефакт с версией, и Job2 будет использовать этот артефакт (например, с плагином Copy Artifact). При таком подходе job2 может выполняться также как отдельная работа.
Для всех, кто сталкивается с этим, другое решение - использовать скрипт сценария, в котором вы передаете путь к файлу.properties, и скрипт добавит свойства в список переменных задания:
Properties properties = new Properties()
FilePath workspace = build.getWorkspace()
FilePath sourceFile = workspace.child(path)
properties.load(sourceFile.read())
properties.each { key, value ->
key = key.replace(".", "_").toUpperCase()
Job.setVariable(build, key, value)
println "Created Variable: " + key + "=" + value
}
Это преобразует любые периоды в подчеркивания и использует заглавные буквы. Использование сценария сценария гарантирует, что у вас есть метод, который работает независимо от того, какой "плагин суп" вы используете.