#versioning #teamcity
#управление версиями #teamcity
Вопрос:
Я использую TeamCity 6.5.4, и мне нужно иметь 3 конфигурации сборки для одного и того же пакета развертывания. Я хотел бы сохранить номер версии во всех трех конфигурациях сборки и иметь возможность использовать этот номер для версии сборки, пометки vcs, версии файла nuspec и т.д.
Вот конфигурации и желаемые номера версий:
Configuration | Version
-------------------|---------
CI/Nightly Build | 1.1.*
Minor Release | 1.*.0
Major Release | *.0.0
Похоже, что TeamCity использует отдельный модуль увеличения сборки для каждой конфигурации. Это означает, что каждый раз, когда у нас выходит основной или второстепенный выпуск, мне придется вручную обновлять сохраненные значения (1) во всех последующих конфигурациях. Я программист, и я ленивый. Я хочу, чтобы одна кнопка делала все за меня.
Я видел примеры сохранения номера сборки на этапах сборки конфигурации с зависимыми моментальными снимками, но это работает только в той же конфигурации.
Плагин Autoincrementer увеличивает номер каждый раз, когда вы ссылаетесь на идентификатор. Это хорошо для изменяющихся чисел (*), но не так хорошо для ссылки на сохраняемые значения (1).
Есть ли способ для TeamCity, либо изначально, либо через плагин, позволяющий мне читать и записывать эту версию в файл или переменную, которая может сохраняться в конфигурациях сборки?
Ответ №1:
Вы можете ссылаться на номер сборки зависимой конфигурации (артефакт / моментальный снимок), используя dep.btx.build.number
где btx
— идентификатор bt последней. Получив номер сборки, передайте номер сборки своему скрипту, запущенному в конфигурации, проанализируйте номер сборки в скрипте и отправьте из скрипта в Teamcity служебные сообщения, чтобы задать номер сборки нужным вам образом. Выполните этот синтаксический анализ и задайте номер в качестве первого шага в вашем скрипте / первого шага в шагах сборки.
Комментарии:
1. Спасибо за ваш ответ. Это отлично работает в той же конфигурации сборки с зависимыми артефактами. Здесь у меня есть три отдельные конфигурации сборки, которые имеют три разных набора шагов. Мне нужно иметь возможность сохранять номера версий в конфигурациях, а не на этапах сборки.
2. Для дальнейшего уточнения, сборка CI произойдет при фиксации vcs и, например, должна быть выпущена версия 2.19.123. Сборка младшего выпуска будет запущена вручную и должна выпустить версию 2.20.0. Сборка основного выпуска также будет выполняться вручную и должна выпустить версию 3.0.0. Для того, чтобы все это произошло, должно быть центральное место, в котором версия может храниться и на которое можно ссылаться при последующих сборках.
3. @DaveBaxter — Вы не поняли мой ответ. Я не говорю об одинаковых конфигурациях сборки. Я говорю о разных конфигурациях. Пожалуйста, попробуйте прочитать это еще раз.
4. Вы правы, я не понял вашего ответа, потому что есть части, которые несколько расплывчаты. Каковы настройки для номера сборки конфигурации сборки? Почему я ссылаюсь на зависимую конфигурацию, если у меня нет зависимостей? Есть ли что-то, что необходимо настроить в зависимой конфигурации (артефакт / моментальный снимок), чтобы заставить это работать? Если версия сборки поступает из библиотеки dll зависимостей (?), как я могу управлять номерами версий, если мне нужно изменить их вручную? Есть ли какой-либо шанс, что вы сможете уточнить или предоставить примеры?
Ответ №2:
Спасибо за предложения. Я решил написать набор пользовательских целевых объектов для использования с моим скриптом MSBuild, который поддерживает метаданные сборки в удаленном файле xml «manifest». При создании нового проекта TeamCity мой сценарий сборки вызывает целевой объект инициализации, который создает новый файл манифеста из незаселенного шаблона.
<Copy SourceFiles="@(ManifestTemplate)" DestinationFiles="@(ManifestTemplate->'$(ManifestFile)')" Condition="!Exists('$(ManifestFile)')" />
Я использую пакет расширений MSBuild для чтения атрибутов, таких как информация о версии, из файла манифеста.
<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="ReadElementText" File="$(ManifestFile)" XPath="/Package/Version/Major">
<Output PropertyName="PackageVersionMajor" TaskParameter="Value"/>
</MSBuild.ExtensionPack.Xml.XmlFile>
У меня есть конфигурации сборки TeamCity, разделенные на CI, Test, Minor Release и Major Release, каждая из которых запускается разными событиями. Из соответствующей цели в моем сценарии сборки проекта я добавляю новую цель в DependsOnTargets
атрибут для вызова пользовательской цели для обновления соответствующего номера версии и сохранения его в файле манифеста.
<Target Name="Test" DependsOnTargets="IntializeBuildProject;Build-UpdateVersion-Build">
<MSBuild Projects="$(SolutionFile)" Targets="Rebuild" Properties="Configuration=$(Configuration)" />
<TeamCitySetBuildNumber BuildNumber="$(PackageVersion)" />
Код в пользовательском целевом объекте для обработки обновления версии:
<MSBuild.ExtensionPack.Science.Maths TaskAction="Add" Numbers="$(PackageVersionBuild);1">
<Output PropertyName="PackageVersionBuild" TaskParameter="Result"/>
</MSBuild.ExtensionPack.Science.Maths>
<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="UpdateElement" File="$(ManifestFile)" XPath="/Package/Version/Build" InnerText="$(PackageVersionBuild)"/>
Этот файл обрабатывает сохранение версии и других метаданных, таким образом игнорируя номер сборки TeamCity. Поскольку файл метаданных XML централизован, я могу использовать значения для заполнения метаданных моих Nuspec, AssemblyInfo и установщика WiX, а также передавать версию и другую соответствующую информацию обратно в TeamCity через служебные сообщения.
Я добавил простой веб-интерфейс MVC, позволяющий моей команде удаленно редактировать содержимое файла, если изменяются детали пакета. Теперь у нас есть единственное место для обновления таких вещей, как информация об авторских правах и любые другие метаданные для данного проекта сборки. Я также могу предоставить пользователям, не являющимся разработчиками, доступ к сайту MVC для обновления информации о брендинге, не предоставляя им доступа к конфигурациям сборки TeamCity.
За исключением служебных сообщений, используемых для передачи версии в TeamCity, здесь очень мало того, что связано с TeamCity. Мне нравится, когда функциональные возможности пользовательских целевых объектов и скриптов сборки удалены из TeamCity на случай, если мы перейдем к другому решению для управления сборкой. По этой причине я не предполагаю, что потребуется время на создание плагина TeamCity, но скоро может появиться серия блогов.
Я буду рад предоставить больше кода и дополнительных объяснений любому заинтересованному.
Ответ №3:
Да, вы можете создать плагин, чтобы сделать это проще. Вы можете воспользоваться моим плагином автоматического увеличения номера сборки (для разных конфигураций) и изменить его в соответствии с вашими потребностями. Номер сборки будет сохранен в текстовом файле, который настраивается с экрана администратора в TeamCity.
http://github.com/ornatwork/tc_plugins/tree/master/unique
Вы можете связаться со мной, чтобы узнать, как это изменить, если вам нужно.
Комментарии:
1. Я просто рассматривал возможность написания подобного плагина для решения проблемы. Я знал , что не могу быть единственным, кому нужен этот тип настройки. Позвольте мне просмотреть код, который у вас уже есть, и я посмотрю, какие изменения мне, возможно, потребуется внести в мою среду. Спасибо!