Как управлять ветками обслуживания / исправления ошибок в Subversion, когда нужно создавать проекты установки? - PullRequest
1 голос
/ 22 апреля 2010

У нас есть набор связанных продуктов, написанных на VB6, с некоторыми проектами на C # и VB.NET, и весь исходный код хранится в одном репозитории Subversion.

Мы не использовали ветки в Subversion (хотя мы сейчас делаем выпуски тегов), и просто делаем всю разработку в транке, создавая новые выпуски, когда транк достаточно стабилен. Это не дает конца печали, когда мы выпускаем новую версию, с ней обнаруживаются проблемы, и мы уже начали работать над новыми функциями или существенными изменениями в магистрали. В прошлом мы решали эту проблему одним из двух способов, в зависимости от серьезности проблем и от того, насколько стабильной мы считали магистраль:

  1. Спешите стабилизировать транк, исправить проблемы, а затем выпустить обновление обслуживания, основанное на ревизии HEAD, но это имело побочный эффект выпусков, которые исправляли ошибки, но вводили новые проблемы из-за неполных функций или исправления, которые были в стволе.

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

Мы хотим изменить нашу политику, чтобы лучше справляться с этой ситуацией. Я думал о создании «ветки обслуживания» в Subversion всякий раз, когда я отмечаю официальный релиз. Затем новая разработка продолжится в транке, и я могу периодически объединять конкретные исправления из транка в ветку обслуживания и создавать выпуск для техобслуживания, когда накопится достаточно исправлений, в то время как мы продолжаем параллельно работать над следующим крупным обновлением. Я знаю, что мы могли бы также иметь более стабильную магистраль и вместо этого создать ветку для новых обновлений, но мне проще держать текущую разработку в магистрали.

Основная проблема заключается в том, что, хотя мы можем легко разветвлять исходный код из тега выпуска и перекомпилировать его, чтобы получить двоичные файлы для этого выпуска, я не уверен, как обрабатывать проекты установки и установки. Мы используем QSetup для создания всех наших программ установки, и сейчас, когда нам нужно изменить проект установки, мы просто редактируем файл проекта на месте (все проекты установки и любые зависимости, которые мы не делаем Скомпилированные сами хранятся на отдельном сервере, и мы всегда компилируем установочные проекты только на этом компьютере). Однако, поскольку мы можем добавлять или удалять файлы в настройке при изменении нашего кода, нет никакой гарантии, что сегодняшние проекты установки будут работать со вчерашним исходным кодом.

Я собирался поместить все проекты QSetup в Subversion, чтобы справиться с этим, но я вижу некоторые проблемы с этим подходом.

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

Однако, когда кому-то нужно изменить проект установки (добавить новую зависимость, которая требуется для транка, или внести другие изменения), возникает проблема. Если они обрабатывают его как исходный файл и проверяют его на своем компьютере, чтобы отредактировать, они не смогут добавлять файлы в проект, если сначала не скопируют файлы, необходимые для добавления на компьютер сборки (поэтому они другим разработчикам), затем скопируйте все остальные зависимости со сборочной машины на свою машину, убедившись, что она соответствует структуре папок точно . Проблема здесь в том, что QSetup использует абсолютные пути для любых файлов, добавленных в проект установки. Однако это означает установку множества зависимостей установки на машины разработки, которые кажутся грязными (и которые могут дестабилизировать среду разработки, если кто-то случайно запустит проект установки на своей машине).

Кроме того, как мы управляем сторонними зависимостями? Например, если текущая ветвь обслуживания использовала MSXML 3.0, а для магистрали теперь требуется MSXML 4.0, мы не сможем вернуться и создать версию обслуживания, если мы уже заменили библиотеку MSXML на компьютере сборки на последнюю версию (при условии, что обе версии имеют одинаковое имя файла). Единственное решение, которое я могу придумать, - это либо поместить все сторонние зависимости в Subversion вместе с исходным кодом, либо убедиться, что мы поместили разные версии библиотеки в отдельные папки (т.е. C:\Setup\Dependencies\MSXML\v3.0 и C:\Setup\Dependencies\MSXML\v4.0). Один способ «лучше» или более распространен, чем другой?

Есть ли лучшие практики для решения этой ситуации? По сути, если мы выпускаем v2.0 нашего программного обеспечения, мы хотим иметь возможность выпускать v2.0.1, v2.0.2 и v.2.0.3, пока мы работаем над v2.1, но весь проект установки / установки и настройки проблема зависимости делает это более сложным, чем типичный ответ «просто создайте ветку в Subversion и перекомпилируйте при необходимости».

1 Ответ

3 голосов
/ 22 апреля 2010

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

Там, где я работаю, мы храним все установочные файлы, проекты, зависимости - ВСЕ - в том же хранилище кода, где находится основной код. Таким образом, когда мы создаем ветвь, все компоненты установки разветвляются вместе с ней и сохраняются в той же самой форме, какой она была в момент ветвления.

Единственная проблема, которую я вижу здесь, это то, что, как вы упомянули, QSetup использует абсолютные пути. Хотя я нахожу это совершенно нелепым, я понимаю, что вы, вероятно, не подумаете о переходе на что-то более профессиональное (кстати, мы используем NSIS).

Однако мне кажется, что может быть применено относительно простое решение. Здесь я предполагаю, что QSetup хранит свои проекты в каком-то текстовом, понятном человеку формате (иначе это просто смешно за пределами понимания). Таким образом, вы можете создать копию ваших файлов проекта QSetup и заменить все ваши пути относительными, с каким-то маркером в начале, например так: %ROOT%\Dependencies\SomeDep.dll

Затем вы можете заставить свой скрипт сборки запускать простую утилиту непосредственно перед вызовом QSetup, которая создаст «настоящий» файл проекта, заменив %ROOT% на соответствующий путь, где происходит извлечение хранилища.

После реализации вы можете создать сборку на любой машине - будь то назначенная машина сборки, или машина разработки, или что-то еще.

...