Версии сборки с помощью TeamCity - PullRequest
18 голосов
/ 03 августа 2009

Я работаю над проектом C # / VB.Net, который использует SVN и сервер сборки TeamCity. Десяток или около того сборок производится сборкой. Я хочу контролировать версии сборки, чтобы они совпадали, а также соответствовали метке сборки TeamCity.

Я настроил TeamCity для использования метки сборки

MAJOR.MINOR. {Строить}. {Revision}

Где Major и Minor - это константы, которые я установил вручную, {Revision} определяется версией хранилища SVN при извлечении, а {Build} - счетчиком сборки TeamCity с автоматическим приращением. Таким образом, пример метки сборки будет

2.5.437.4423

Какие методы вы бы предложили, чтобы все версии сборки соответствовали метке сборки TeamCity?

Ответы [ 4 ]

31 голосов
/ 19 октября 2011

Я бы предложил использовать функцию сборки патча TeamInity AssemblyInfo:

http://confluence.jetbrains.net/display/TCD65/AssemblyInfo+Patcher

Просто создайте свои проекты из VisualStudio, настройте функцию сборки на странице BuildSteps (см. http://confluence.jetbrains.net/display/TCD65/Adding+Build+Features), и, пока вы сохраняете файл AssemblyInfo.cs по умолчанию, он будет работать.

Этот подход отлично работает для меня.

Преимущества:

  • Разработчики могут создавать решения на своих машинах.
  • Вам не нужно трогать файлы .sln или .csproj. Это просто работает.
  • Используя переменные TeamCity, вы можете легко сделать так, чтобы номер версии соответствовал версии какого-либо другого проекта и т. Д.

Недостатки:

  • Вы не можете легко переключиться на другой сервер CI из TeamCity, потому что у вас нет сценария сборки (но переключение серверов CI похоже на переключение ORM или базы данных: это очень маловероятно и в любом случае потребует большой работы).
7 голосов
/ 03 января 2012

Я оставляю ответ Хэмиша как принятый ответ, но для полноты я подумал, что стоило бы документировать подход, который мы наконец приняли.

Я поддерживаю 2 отдельные конфигурации сборки в TeamCity, одна из которых - сборка CI, а другая - сборка, которая запускается еженедельно, когда есть какие-либо изменения (или вручную), и является нашей официальной сборкой выпуска. Я остановился на подходе с двумя сборками, потому что сборка занимает около 40 минут, и я хотел, чтобы разработчики получали быструю обратную связь по любым вопросам сборки, когда они вносят изменения. Поэтому сборка CI является подмножеством полной сборки выпуска, но она собирает весь код. Управление версиями также отличается между двумя сборками:

  • Сборка CI имеет номера версий {Major.minor.BuildCounter.SvnRevision}
    • BuildCounter начинается с 0
    • не помечает svn-репозиторий
  • Сборка Weekly / Release имеет похожую систему управления версиями, но
    • счетчик сборки начинается с (Major * 1000), поэтому, если Major равен '8', счетчик построения начинается с 8000.
    • Создает тег с именем 'Build_ {Version}' в хранилище svn

Причина этого несколько произвольного выбора состоит в том, чтобы позволить нам четко и просто различать сборки CI и сборки Release.

У нас есть файл для решения под названием AssemblyVersionInfo, который включается (мягко связан) в каждый проект решения. Файл содержит (по сути) это:

using System.Reflection;
// Revision and Build both set to 9999 indicates a private build on a developer's private workstation.
[assembly: AssemblyFileVersion("6.0.9999.9999")]        // Win32 File Version (not used by .NET)

Таким образом, все сборки разработчика используют один и тот же статический и легко идентифицируемый номер версии, который больше, чем что-либо, генерируемое сервером сборки, так что при конфликте версий файл разработчика выигрывает.

На сервере сборки мы используем задачи сообщества MSBuild для создания нового файла AssemblyVersionInfo, который перезаписывает содержимое по умолчанию. Мы используем строку сборки TeamCity в качестве новой версии. Таким образом, мы можем легко различить следующие 3 ситуации:

  • Частная сборка на рабочей станции разработчика
  • Сборка CI выполняется на сервере сборки, но не должна выпускаться
  • Официально разрешенная сборка релиза, помеченная в хранилище Svn

В другом повороте обратите внимание, что я устанавливаю AssemblyFileVersion, а не AssemblyVersion. Мы заставляем наши версии сборки быть статической фиксированной версией версии Major.Minor.0.0. Мы делаем это так, чтобы мы могли выпускать исправления ошибок, не беспокоясь о проблемах с версиями. AssemblyFileVersion позволяет нам выяснить, какую сборку установил пользователь, не являясь частью идентификации сборки.

5 голосов
/ 05 августа 2009

Мы используем CruiseControl.net и SVN. Мы едем по-другому. Мы используем задачу MSBuildCommunityTasks Version в сценарии MSBuild, чтобы увеличить номер версии для сборок CI, и используем этот номер версии для тегирования исходного кода.

РЕДАКТИРОВАТЬ: Просили более подробную информацию о целях MSBuild ...
Мы используем отдельный скрипт, предназначенный для сборки CI и не используемый для сборок разработчика. Мы пытались использовать разные цели в файлах MSBuild, которые студия использует в качестве файлов проекта, но это было головной болью и требовало ручного редактирования файлов, которые создавала студия.
Структура файла MSBuild довольно проста:

  1. Импорт лишних частей

    <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
    <!-- contains some variables that set project names, paths etc. -->
    <Import Project="Properties.msbuild"/>

  2. BeforeBuild: установить новый номер версии и переписать файл AssemblyInfo

    <Version VersionFile="$(VersionFile)" BuildType="None" RevisionType="Increment">
    <Output TaskParameter="Major" PropertyName="Major" />
    <Output TaskParameter="Minor" PropertyName="Minor" />
    <Output TaskParameter="Build" PropertyName="Build" />
    <Output TaskParameter="Revision" PropertyName="Revision" />
    </Version>

    <!--Modify Assembly Info-->
    <AssemblyInfo CodeLanguage="CS"
    OutputFile="Properties\AssemblyInfo.cs"
    AssemblyTitle="$(TargetAssembly)"
    AssemblyDescription="$(AssemblyDescription) svn:@(SanitizedSvnUrl) revision:$(SvnRevision)"
    AssemblyCompany="Your company name"
    AssemblyProduct="Name of product"
    AssemblyCopyright="Copyright © your company 2009"
    ComVisible="false" Guid="$(WindowGuid)"
    AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)"
    AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)"
    Condition="$(Revision) != '0' " />

  3. Сборка: сборка фактического файла проекта MSBuild скрипт в режиме выпуска

  4. AfterBuild: мы запускаем наши проекты модульных тестов (в качестве защиты от создания тегов для поврежденных сборок на следующих шагах), используем задачи SvnInfo и некоторые задачи RegexReplace, чтобы установить некоторые переменные с путями и именами тегов, и используйте задачу SvnCopy для создания тега.

<SvnCopy UserName="username"
Password="password"
SourcePath="@(SvnTrunkPath)"
DestinationPath="@(SvnTagsPath)/BUILD-$(TargetAssembly)-$(Major).$(Minor).$(Build).$(Revision)" Message="Tagging successful build" />

0 голосов
/ 16 августа 2013

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

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

По этой причине мы создали простой файл кода, который определяет константу для фактической версии, а затем все проекты наследуют эту константу и нас в файле информации о сборке. Тогда скрипт сборки должен обновить только один файл.

Еще одним преимуществом здесь является то, что это также несколько ускоряет процесс сборки, так как не нужно просматривать много файлов и вносить изменения.

...