Я запускаю довольно сложный проект с несколькими независимыми приложениями. Они используют, однако, несколько общих компонентов. Итак, у меня есть исходное дерево, похожее на приведенное ниже.
- Мой проект
- Приложение A
- Shared1
- Shared2
- Заявка B
- Приложение C
Все приложения имеют собственный скрипт MSBuild, который создает проект и все необходимые ему общие ресурсы. Я также запускаю эти сборки на сервере непрерывной интеграции под управлением CruiseControl.
Когда приложения развернуты, они развернуты на нескольких серверах для распределения нагрузки. Это означает, что крайне важно отслеживать, какая сборка / ревизия развернута на каждом из различных серверов (нам нужна текущая версия в версии DLL, например, «1.0.0.68»).
Не менее важно иметь возможность воссоздать ревизию / сборку, которая была построена так, чтобы иметь возможность откатываться, если что-то не работает как задумано (о да, это происходит ...). Сегодня мы используем SourceSafe для управления исходным кодом, но это можно изменить, если мы представим веские причины для этого (SS на самом деле работает нормально для нас , поэтому далеко).
Еще один принцип, которому мы пытаемся следовать, заключается в том, что только код, созданный и протестированный сервером интеграции, мы развернем далее.
Решение "CrusieControl Build Labels"
У нас было несколько идей по решению вышеизложенного. Первым было создать сервер непрерывной интеграции, локально развернуть проект и протестировать его (он делает это сейчас). Как вы, наверное, знаете, успешная сборка в CruiseControl генерирует метку сборки, и я думаю, что мы каким-то образом могли бы использовать ее для установки версии DLL наших исполняемых файлов (поэтому метка сборки 35 создаст DLL типа «1.0.0.35»)? Идея заключалась также в том, чтобы использовать эту метку сборки для обозначения complete исходного дерева. Тогда мы, вероятно, могли бы проверить по этому ярлыку и позже воссоздать сборку.
Причина маркировки полного дерева состоит в том, чтобы включить не только фактический код приложения (который находится в одном месте в дереве исходного кода), но также и все общие элементы (которые находятся в разных местах в дереве). Таким образом, успешная сборка «Приложения A» будет меткой для всего дерева с меткой «ApplicationA35», например.
Однако может возникнуть проблема при попытке воссоздать эту сборку и установить версию DLL перед развертыванием, поскольку у нас больше нет доступа к сгенерированной метке сборки CruiseControl. Если бы все метки сборки CrusieControl были уникальными для всех проектов, мы могли бы использовать только номер для маркировки, но это не так (и приложение A, и B могли одновременно находиться в сборке 35), поэтому мы должны включить имя приложения в этикетка. Отсюда и метка SourceSafe «Приложение35». Как я могу затем воссоздать сборку 34 и установить 1.0.0.34 на номера версий DLL после того, как мы собрали сборку 35?
Решение "Номер редакции"
Кто-то сказал мне, что Subversion, например, создает номер ревизии для всего дерева исходных текстов при каждой регистрации - это так? Есть ли в SourceSafe что-то похожее? Если это правильно, идея заключается в том, чтобы получить этот номер ревизии при получении последней версии и построить на сервере CruiseControl. Затем номер редакции можно использовать для установки номера версии DLL (например, «1.0.0.5678»). Я думаю, мы могли бы тогда получить эту конкретную ревизию для Subversion, если это необходимо, и тогда она будет включать это приложение и все общие элементы, чтобы иметь возможность воссоздать определенную версию из прошлого. Будет ли это работать и может ли это быть достигнуто с помощью SourceSafe?
Суммировать
Итак, два основных требования:
- Уметь отслеживать номер сборки / редакции сборки и развернутой DLL.
- сможет перестроить прошлую ревизию/ build, установить старый номер сборки / ревизии для исполняемых файлов этой сборки (для соответствия требованию 1).
Так как бы вы решили это? Какой ваш предпочтительный подход и как вы бы решили (или у вас совершенно другая идея?)? ** Рад дать подробные ответы. **
Бонусный вопрос В чем разница между номером ревизии и номером сборки и когда на самом деле нужны оба?