Я оставляю ответ Хэмиша в качестве принятого ответа, но для полноты я подумал, что стоит документировать подход, который мы наконец приняли.
Я поддерживаю две отдельные конфигурации сборки в TeamCity, одна из них - сборка CI, а другая - сборка, которая запускается еженедельно, когда есть какие-либо изменения (или вручную) и является нашей официальной версией. Я пошел на двухстрочный подход, потому что сборка занимает, возможно, 40 минут в конце, и я хотел, чтобы разработчики быстро получали отзывы о любых проблемах сборки, когда они вносили изменения. Поэтому сборка CI является подмножеством полной версии сборки, но она создает весь код. Версионирование также отличается между двумя сборки:
- сборки CI имеет номер версии {Major.minor.BuildCounter.SvnRevision}
- BuildCounter начинается с 0
- не помечать в репозиторий SVN
- Параметр/сборки выпуска Еженедельно имеет подобную систему управления версиями, но
- счетчик сборки начинается (Major * 1000), так что если майор является «8», бу ИСД счетчик начинается с 8000.
- Создает тег под названием «Build_ {Version}» в репозитории SVN
Причина этого несколько произвольного выбора, чтобы позволить нам просто и ясно различать CI строит и выпускает сборки.
У нас есть файл решения, называемый 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 Community Tasks создаем новый файл AssemblyVersionInfo, который перезаписывает содержимое по умолчанию. Мы используем строку сборки TeamCity как новую версию.Таким образом, можно легко различить следующие 3 ситуации:
- Частная сборка выполняется на рабочей станции разработчика
- Скопление CI выполняется на сервере сборки, но которые не должны быть освобождены
- официально санкционировал выпуск сборки, который помечен в хранилище Svn
в другом твист, обратите внимание, что я устанавливаю AssemblyFileVersion
, не AssemblyVersion
. Мы заставляем наши версии сборки быть статической, фиксированной версией строки «Major.Minor.0.0». Мы делаем это, чтобы мы могли выпускать исправления ошибок, не беспокоясь о проблемах с версиями. AssemblyFileVersion позволяет нам выяснить, что создала пользователь, не будучи частью идентификатора сборки.
Я также должен спросить: как вы управляете номерами версий для частных сборок, выполненными отдельными разработчиками, и автоматическими сборками, выполненными TeamCity? –
[как обычно] мнения меняются ... если разработчики просто создают визуальную студию, тогда они получают значения по умолчанию в файлах информации о сборке. если разработчики используют скрипт/build, у вас есть возможность сделать их разными. Один проект, который я устанавливаю, локально строит версии версии 0.0.0.DaysSinceBeginningOfProject. Это было в первые дни работы ci, поэтому я смог обнаружить любые локально собранные сборки, которые были вручную помещены в среду (вместо использования сценария сборки/развертывания)./jhd –