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
}

Это преобразует любые периоды в подчеркивания и использует заглавные буквы. Использование сценария сценария гарантирует, что у вас есть метод, который работает независимо от того, какой "плагин суп" вы используете.

Другие вопросы по тегам