Как я могу иметь уникальные номера сборки для разных веток с помощью Jenkins и подключаемого модуля Pipeline Multibranch?

Мы используем плагин Jenkins Pipeline Multibranch Plugin с Blue Ocean.

Насколько я читал, я считаю, что довольно часто привязывают номер сборки вашего проекта к запуску Jenkins, поскольку это позволяет отслеживать от установленного приложения до системы CI, затем до изменения в системе управления версиями, а затем до проблемы, которая вызвала перемена.

Проблема в том, что для каждой ветки номер запуска начинается с 0. Для проекта с несколькими ветками кажется невозможным гарантировать уникальный номер сборки.


person pingu    schedule 16.01.2018    source источник
comment
Я не понимаю, как номер сборки обеспечивает эту прослеживаемость от развернутого артефакта до сборки, которая его создала — не могли бы вы дать ссылку или объяснить немного больше?   -  person mghicks    schedule 24.01.2018
comment
Зачем вам когда-либо хотеть выпускать ветки? Если номер вашей версии зависит от номера сборки, скажем, ветки master, все будет отслеживаться, как вы описали.   -  person Sergej Lopatkin    schedule 24.01.2018


Ответы (3)


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

В соответствии с «синтаксисом конвейера: ссылка на глобальные переменные» currentBuild.displayName является записываемым свойством. Таким образом, вы могли бы, например. добавьте дополнительную информацию к номеру сборки (чтобы сделать его глобально уникальным) и используйте эту строку в последующих шагах сборки артефакта/приложения (чтобы включить ее в вывод версии приложения для желаемой отслеживаемости), например. что-то вроде:

currentBuild.displayName = "${env.BRANCH_NAME}-${currentBuild.id}"

Также может быть полезно использовать расписание сборки или время начала, отформатированное (currentBuild.timeInMillis), как удобочитаемую дату, или использовать версию SCM, например. в результате получается "20180119-091439-rev149923".

Смотрите также:

person Reinhold Füreder    schedule 24.01.2018
comment
Мне все еще очень интересно узнать больше о том, как переименование сборок создает прослеживаемость от установленного приложения до сборки, которая его создала. -- О, образы докеров используют имя сборки? - person mghicks; 24.01.2018
comment
Это не сработает, если вам нужны последовательные сборки с целым числом в качестве номера сборки, и вы работаете с многоветвевым конвейером (например, сборки Fabric Beta Android). Количество коммитов тоже не вариант. Я еще не знаю чистого решения для этого и исследую его. - person Veaceslav Gaidarji; 21.02.2018

Вы можете получить имя ветки Git из $GIT_BRANCH. и добавьте это к $BUILD_NUMBER, чтобы сделать идентификатор уникальным для разных филиалов (если только ваша компания не сделает что-то вроде захвата крупной корпорацией, которая мигрирует вас на другой сервер Jenkins и сбрасывает все номера сборки: для защиты от это, вы можете использовать $BUILD_URL).

Единственная загвоздка в том, что $GIT_BRANCH содержит символ / плюс любые символы, которые вы использовали при именовании ветки, и они могут быть разрешены или запрещены во всех местах, где вам нужен идентификатор. ($BUILD_URL также будет содержать такие символы, как : и /). Если это проблема, одним из обходных путей может быть удаление нежелательных символов с помощью tr:

export MY_ID=$(echo $GIT_BRANCH-$BUILD_NUMBER | tr -dc [A-Za-z0-9-])

(-dc означает удаление дополнения к этим символам, поэтому A-Z, a-z, 0-9 и - — это символы, которые вы хотите сохранить.)

person Silas S. Brown    schedule 31.03.2020

Один из способов - иметь задание, которое вызывается из всех веток и использует его номер сборки. Эта работа может быть обычной конвейерной работой с фиктивным Jenkinsfile, например, echo hello. Тогда просто назовите это так

def job = build job: 'build number generator', quietPeriod: 0, parameters: [
        string(value: "${BRANCH_NAME}-${BUILD_NUMBER}", name: 'UID')  
]
def BNUMBER = job.getNumber().toString()
currentBuild.displayName = "build #"+BNUMBER
echo BNUMBER

Не уверен, что этот параметр UID необходим, но он заставляет все вызовы задания генератора номеров сборок быть уникальными, поэтому Jenkins не будет оптимизировать сборки, которые происходят в одно и то же время, для использования одного и того же задания генератора номеров сборок.

person Hannu Taskinen    schedule 26.01.2021