Как избежать сборки и развертывания зависимостей без изменений кода

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

Мы уже используем продукты Microsoft, такие как TFS для управления версиями, Visual Studio для разработки и Team Foundation Build для сборок с непрерывной интеграцией. В настоящее время мы склоняемся к развертыванию InRelease, поскольку он хорошо интегрируется с Team Foundation Build.

Но сначала вот наша текущая установка ...

  1. Существует более 200 файлов решений C #, каждый из которых содержит один или несколько проектов. В окружающей среде нецелесообразно объединять эти проекты в меньшее количество решений, то есть по дизайну. Проекты в рамках решения используют ссылки на проекты для разрешения зависимостей и ссылок на файлы для проектов в других решениях. Насколько мне известно, это рекомендованный подход Microsoft при работе с большим количеством проектов.

  2. Мы используем стратегию «переход по функции», например изолированная разработка на параллельных ветвях функций, которая по завершении объединяется в стабильную основную ветвь. Когда приходит время выпуска, выпуск отделяется от основного и изолирован для исправлений и развертывания. В ветвях функций и основной ветке есть сборка CI, запускаемая проверками кода. Релизы обычно запускаются вручную из InRelease для выбранной ветки релиза. Релиз будет развернут в различных средах, включая ИНТЕГРАЦИЮ / ТЕСТ, UAT и, в конечном итоге, для всех наших клиентов. Мы все еще конкретизируем детали стратегии ветвления, но это вопрос в другой раз.

Текущие проблемы, которые необходимо решить:

1. Избегайте перестроения зависимостей, в которых нет изменений кода ...

Когда мы развертываем новую функциональность или патч для клиента, мы хотим разместить в файлах минимум файлов. У нашей компании очень большая клиентская база (тысячи клиентов) с иногда медленным подключением к Интернету, поэтому полное развертывание всех сборок (200+) для каждого клиента не вариант. Я частично решил проблему, установив инкрементные сборки, которые правильно перестраивают только измененные проекты, как ожидалось, но также перестраивают все зависимые проекты, даже если в них не было внесено НИКАКИХ ИЗМЕНЕНИЙ КОДА. Это приводит к тому, что как измененные сборки, так и зависимости имеют новые отметки времени. Если мы используем изменение метки времени для определения того, какие сборки следует развернуть, это приведет к развертыванию функционально неизмененных сборок. Цель здесь - развернуть только сборки, в которых был изменен код, и сборки, в которых происходят критические изменения.

Например:

У решения B есть проект под названием Project B, у решения A есть проект под названием Project A

Проект B -> Проект A (где проект A имеет файловую зависимость от проекта B)

Когда в проекте A выполняется неразрывное изменение, скажем, во внутренней части метода, то ожидаемый результат таков: создается только A и, следовательно, кандидат для развертывания. Когда в проект A вносится критическое изменение, которое нарушает работу проекта B, ожидаемый результат таков: оба элемента A и B созданы и, следовательно, являются кандидатом для развертывания. В настоящее время MSBuild восстанавливает все иждивенцы независимо от того, что нам нужно.

2. Автоматически определять, какие сборки следует развернуть ...

У меня есть частичное решение проблемы. Когда сборка выполняется, мой шаблон процесса сборки настроен на запуск сценария MSBuild, содержащего список решений для сборки в определенном порядке. Эта операция выполняется в рабочей области агента сборки. Каждый раз, когда выполняется новая сборка, шаблон процесса сборки создает уникальную папку для размещения в формате и копирует двоичные файлы из рабочей области агента сборки в папку для размещения. Это готовая к работе функция, о которой позаботился стандартный шаблон процесса сборки. Сборка была настроена так, чтобы не очищать рабочую область агента сборки, поэтому при первом запуске она будет создавать все проекты в рамках решения, но последующие сборки будут создавать только те проекты, которые имеют изменения кода или зависят от других проектов (инкрементная сборка?). Поэтому неизмененные сборки будут иметь исходные метки времени, а измененные сборки будут иметь новые метки времени. У нас есть инструмент, который может сравнивать папки между перетаскиваемыми папками и выводить результаты в текстовый файл. Это позволяет нам определить, какие двоичные файлы были добавлены / изменены / удалены с момента последнего развертывания. Это также дает нам дополнительное преимущество сравнения списка фактических артефактов с манифестом ожидаемых артефактов, определенным разработчиком. Это гарантирует, что не будут развернуты никакие сборки, которые не были указаны и не прошли модульное тестирование.

Вопрос в том, как мы можем использовать InRelease для развертывания только необходимых файлов, как в приведенном выше примере, а не всех файлов в папке для размещения?


person reinovb    schedule 29.05.2014    source источник


Ответы (1)


  1. Установите прокси TFS перед вашей машиной сборки, это уменьшит сетевой трафик
  2. Вы начнете со стратегии ветвления, такой как Service Pack, вы можете прочитать документацию в руководстве ALM Rangers ... И адаптировать свой шаблон процесса для создания только той части кода, которая была изменена. Я думаю, что в BRD Lite, еще одном руководстве ALM Rangers, вы найдете больше информации.
person egomesbrandao    schedule 01.06.2014