Я и моя группа ужасно стараются увеличивать номера версий сборок, и мы часто отправляем сборки с версиями 1.0.0.0. Очевидно, это вызывает много головной боли.
Мы становимся намного лучше с нашими практиками с помощью нашей платформы CI, и я действительно хотел бы настроить ее на автоматическое увеличение значений в assemblyinfo.cs
файле, чтобы версии наших сборок автоматически обновлялись с изменениями кода в этой сборке.
Я ранее установил (до того, как мы нашли Hudson ) способ увеличения значения либо msbuild
через командную строку (не могу вспомнить), но с Hudson, это обновит репозиторий SVN и запустит ДРУГОЙ сборку. Это приведет к медленному бесконечному циклу, поскольку Хадсон опрашивает SVN каждый час.
Плохая идея, если Хадсон увеличивает номер версии? Что было бы альтернативным способом сделать это?
В идеале, мой критерий решения был бы таким:
- Увеличивает номер сборки
assemblyinfo.cs
перед сборкой - Увеличивает номер сборки только в измененных сборках. Это может быть невозможно, поскольку Хадсон стирает папку проекта каждый раз, когда выполняет сборку.
- Фиксирует измененный файл assemblyinfo.cs в репозитории кода (в настоящее время VisualSVN )
- Не заставляет Hudson запускать новую сборку при следующем сканировании на предмет изменений.
Проработав это в своей голове, я мог бы легко придумать решение большинства из этих проблем с помощью командных файлов / команд, но все мои идеи заставили бы Хадсон запускать новую сборку при следующем сканировании. Я не ищу кого-то, кто бы все делал за меня, просто укажите мне правильное направление, возможно, метод, позволяющий заставить Хадсона игнорировать определенные коммиты SVN и т.
Все, что я нашел до сих пор, - это просто статья, объясняющая, как автоматически увеличивать номер версии, ничто не учитывает платформу CI, которая может быть развернута в бесконечный цикл.
источник
Вот что я сделал для отметки атрибута AssemblyFileVersion.
Убран AssemblyFileVersion из AssemblyInfo.cs.
Добавьте в проект новый пустой файл с именем AssemblyFileInfo.cs.
Установите набор инструментов MSBuild для задач сообщества на машине сборки hudson или как зависимость NuGet в вашем проекте.
Отредактируйте файл проекта (csproj), это просто файл msbuild, и добавьте следующее.
Где-то будет
<PropertyGroup>
изложение версии. Измените это так, чтобы он читался, например,Hudson предоставляет те переменные env, которые вы видите там, когда проект построен на Hudson (при условии, что он получен из Subversion).
Внизу файла проекта добавьте
Это использует MSBuildCommunityTasks для создания AssemblyFileVersion.cs, чтобы включить атрибут AssemblyFileVersion перед построением проекта. Вы можете сделать это для любого / всех атрибутов версии, если хотите.
В результате всякий раз, когда вы запускаете сборку hudson, результирующая сборка получает AssemblyFileVersion со значением 1.0.HUDSON_BUILD_NR.SVN_REVISION, например 1.0.6.2632, что означает 6-й номер сборки в hudson, созданный из версии 2632 subversion.
источник
Вот элегантное решение, которое требует небольшой предварительной работы при добавлении нового проекта, но очень легко справляется с процессом.
Идея состоит в том, что каждый проект связан с файлом решения, который содержит только информацию о версии сборки. Таким образом, ваш процесс сборки должен обновить только один файл, и все версии сборки извлекают из одного файла при компиляции.
шаги:
Когда вы добавляете файл в качестве ссылки, он сохраняет данные в файле проекта, а после компиляции извлекает информацию о версии сборки из этого файла.
В системе управления версиями вы добавляете файл bat или файл сценария, который просто увеличивает файл SharedAssemblyProperties.cs, и все ваши проекты обновят информацию о своей сборке из этого файла.
источник
Hudson можно настроить на игнорирование изменений определенных путей и файлов, чтобы не запрашивать новую сборку.
На странице конфигурации задания в разделе « Управление исходным кодом» нажмите кнопку « Дополнительно» . В поле Excluded Regions вы вводите одно или несколько регулярных выражений для соответствия исключениям.
Например, чтобы игнорировать изменения в файле version.properties, вы можете использовать:
Это будет работать для языков, отличных от C #, и позволит вам хранить информацию о вашей версии в Subversion.
источник
.NET сделает это за вас. В файле AssemblyInfo.cs установите версию сборки major.minor. * (Например: 1.0. *).
Когда вы создаете свой проект, версия создается автоматически.
Номера сборки и ревизии генерируются на основе даты, я полагаю, с использованием эпохи unix. Сборка основана на текущем дне, а ревизия основана на количестве секунд, прошедших с полуночи.
источник
Я никогда не видел, чтобы функция 1.0. * Работала в VS2005 или VS2008. Есть ли что-то, что нужно сделать, чтобы VS увеличивал значения?
Если AssemblyInfo.cs жестко запрограммирован с использованием 1.0. *, То где хранятся настоящие сборки / версии?
После помещения 1.0. * В AssemblyInfo мы не можем использовать следующий оператор, потому что ProductVersion теперь имеет недопустимое значение - он использует 1.0. *, А не значение, присвоенное VS:
Вздох - кажется, это одна из тех вещей, о которых все спрашивают, но почему-то никогда не бывает однозначного ответа. Несколько лет назад я увидел решения для генерации номера ревизии и сохранения его в AssemblyInfo как часть процесса после сборки. Я надеялся, что такой танец не потребуется для VS2008. Может VS2010?
источник
Я предполагаю, что это также можно сделать с помощью текстового шаблона, в котором вы создаете соответствующие атрибуты сборки на лету из среды, как это делает AssemblyVersion.tt ниже.
источник
В продолжение ответа MikeS я хотел бы добавить, что для этого необходимо установить VS + Visual Studio Visualization and Modeling SDK, а также изменить файл проекта. Также следует упомянуть, что я использую Jenkins в качестве сервера сборки, работающего на сервере Windows 2008 R2 с модулем версии, где я получаю BUILD_NUMBER.
Файл My Text Template version.tt выглядит так
У меня есть следующие группы свойств
после импорта Microsoft.CSharp.targets у меня есть это (в зависимости от того, где вы устанавливаете VS
На моем сервере сборки у меня есть следующий сценарий для запуска преобразования текста перед фактической сборкой, чтобы получить последний номер набора изменений в TFS.
Таким образом, я могу отслеживать сборки и наборы изменений, поэтому, если я ничего не проверял с момента последней сборки, последняя цифра не должна изменяться, однако я мог бы внести изменения в процесс сборки, следовательно, мне нужно второе последнее число . Конечно, если вы сделаете несколько проверок перед сборкой, вы получите только последнее изменение, отраженное в версии. Я думаю, вы могли бы объединить то, что требуется.
Я уверен, что вы можете сделать что-нибудь более интересное и вызвать TFS прямо из шаблона tt, но у меня это работает.
Затем я могу получить свою версию во время выполнения следующим образом
источник
Мое решение не требует добавления внешних инструментов или языков сценариев - оно почти гарантированно будет работать на вашей машине сборки. Решаю эту проблему в нескольких частях. Во-первых, я создал файл BUILD.BAT, который преобразует параметр Jenkins BUILD_NUMBER в переменную среды. Я использую функцию Jenkins «Выполнить пакетную команду Windows» для запуска пакетного файла сборки, вводя следующую информацию для сборки Jenkins:
В среде сборки у меня есть файл build.bat, который начинается следующим образом:
Как только я это сделал, я щелкнул правой кнопкой мыши проект, который должен быть построен в области обозревателя решений Visual Studio, выбрал Свойства, выберите События сборки и ввел следующую информацию в качестве командной строки события перед сборкой, которая автоматически создает файл .cs содержащий информацию о номере сборки на основе текущих настроек переменных среды:
Возможно, вам придется подстроиться под свой вкус. Я создаю проект вручную один раз, чтобы сгенерировать исходный файл Version.cs в каталоге свойств основного проекта. Наконец, я вручную включаю файл Version.cs в решение Visual Studio, перетаскивая его в панель «Обозреватель решений» под вкладкой «Свойства» для этого проекта. В будущих сборках Visual Studio затем считывает этот CS-файл во время сборки Jenkins и получает из него правильную информацию о номере сборки.
источник
Итак, у нас есть проект с одним решением, который содержит несколько проектов, в которых есть сборки с разными номерами версий.
Изучив несколько из вышеперечисленных методов, я просто реализовал этап сборки для запуска сценария Powershell, который выполняет поиск и замену файла AssemblyInfo.cs. Я по-прежнему использую номер версии 1.0. * В системе управления версиями, а Jenkins просто вручную обновляет номер версии перед запуском msbuild.
Я добавил параметр -Encoding «UTF8», потому что git начал обрабатывать файл .cs как двоичные файлы, если я этого не сделал. Конечно, это не имело значения, поскольку я никогда не фиксировал результат; это просто появилось, когда я тестировал.
В нашей среде CI уже есть возможность связать сборку Jenkins с конкретным коммитом git (спасибо плагину Stash!), Поэтому я не волнуюсь, что нет коммита git с прикрепленным к нему номером версии.
источник
Это более простой механизм. Он просто включает добавление этапа сборки задачи Windows Batch перед этапом MSBuild и использование простой программы поиска и замены (FART).
Пакетный шаг
Если вы используете систему управления версиями, отличную от svn, измените параметр --svn на соответствующий для вашей среды scm.
Скачать Fart
источник
Я решил использовать несколько методов, используя предварительно собранный сценарий Powershell ( https://gist.github.com/bradjolicoeur/e77c508089aea6614af3 ) для увеличения при каждой успешной сборке, тогда в Global.asax я сделал что-то вроде этого:
Я все еще думаю, что весь процесс слишком сложен, и я собираюсь найти более эффективный метод достижения того же результата. Я хотел этого в основном для передачи версии в SVN, а затем в Jenkin без слишком большого количества дополнительных инструментов.
источник