Параметризация задания Jenkins с версиями нескольких вышестоящих заданий

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

SVN A --> build A --\
                    |
SVN B --> build B --|
                    |
SVN C ----------------> build C

Конвейер должен работать так, чтобы при внесении изменений в SVN-репозиторий любого из проектов этот проект создавался автоматически. Кроме того, после того, как A или B был построен, он запускает здание C.

Каждая сборка создает двоичные файлы с уникальным номером версии ("XYBuildNumber"), и C должен получить в качестве параметра номера версий как A, так и B, чтобы C мог быть построен с использованием этих версий. По умолчанию C должен использовать последние успешные сборки A и B, но также должна быть возможность инициировать C вручную, используя более старую версию A или B (например, если мы хотим развернуть более старую версию одного из проектов).

Создание конвейера, подобного этому, может быть выполнено в готовом виде на Go, но моя компания считает это слишком дорогим. (Обновление 2014-02-27: Go не является открытым исходным кодом и бесплатен!) Так что теперь я пытаюсь выяснить, как добиться того же, используя Jenkins, но пока не нашел пути. Я нашел только инструкции по созданию простых линейных и ромбовидных конвейеров в Jenkins, но не конвейеров с несколькими независимыми проектами.

2 ответа

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

Для получения дополнительной информации см. Взаимозависимые конвейеры сборки с Jenkins.

Мы используем build-pipe-plugin для чего-то похожего, и мы предоставляем простой сценарий, который хранит информацию о сборке во время выполнения для передачи в последующие проекты:

Немного многословно, потому что мы включаем информацию SVN для последующих сборок:

import hudson.model.*
def thr = Thread.currentThread()
def build = thr?.executable

def workspace = build.getWorkspace()

def ant = new AntBuilder() 
ant.exec(executable: "svn", outputproperty: "output", dir: workspace){ 
    arg(line: "info") 
}
svnInfo = ant.project.getProperty("output")
print svnInfo 

def pattern = /Last\s+Changed\s+Author:\s+(\w+)/ 
def matcher = (svnInfo =~ pattern)
def user = matcher[0][1]

def langs = new XmlParser().parseText(build.getParent().getWorkspace().child('pom.xml').readToString())
def appVer = langs.properties.release.text()
def artifactId = langs.artifactId.text()

def params = [
new StringParameterValue('PL_SVN_REVISION', build.getEnvVars()['SVN_REVISION']),
new StringParameterValue('PL_BUILD_NUMBER', build.getEnvVars()['BUILD_NUMBER']),
new StringParameterValue('PL_APP_NAME', 'FooApp'),
new StringParameterValue('PL_COMMITTER_NAME',user ),
new StringParameterValue('PL_APP_VERSION',appVer),
new StringParameterValue('PL_ARTIFACT_ID',artifactId) 
]
build.addAction(new ParametersAction(params))

Тогда в последующей сборке они должны быть доступны примерно так:

Пример 1. Установка ввода имени сборки:

#${BUILD_NUMBER} - ${ENV,var="PL_APP_NAME"} - ${ENV,var="PL_APP_VERSION"} - ${ENV,var="PL_SVN_REVISION"}

Пример 2. Вызов целевого ввода Ant:

deploy
  -Denvironment=ONT-base
  -DWAR-LOCATION=%war-repo%/%PL_APP_NAME%/%PL_BUILD_NUMBER%-%PL_SVN_REVISION%/
  -DWAR-NAME=%PL_ARTIFACT_ID%-%PL_APP_VERSION%.%PL_BUILD_NUMBER%-%PL_SVN_REVISION%.war

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

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