Лекция №17Управление построением и выпусками
Управление версиями программного обеспечения не только упрощает разработку, но и составляет основу для двух других аспектов управления конфигурацией ПО — построение и управление выпусками.
Под построением подразумевается компиляция и компоновка модулей приложения, а также создание сопутствующих программных артефактов, например, автоматически сгенерированной документации и отчетов о модульном и интеграционном тестировании. В современных программных проектах построение осуществляется автоматически одним из двух способов:
- специальные утилиты, такие как make и Apache Ant, конфигурация которых осуществляется с помощью специальных файлов сценариев;
- интегрированные среды разработки (IDE).
Использование IDE — более простое решение, которое подходит для малых проектов, но при увеличении масштаба становятся очевидными его недостатки:
- Для построения проекта необходимо «тяжелое» приложение; при этом построение — незначительная часть функциональности среды разработки. Во многих случаях за построение в IDE отвечает отдельный модуль, основанный на независимой утилите; например, в Microsoft Visual Studio используется программа построения MSBuild, которая доступна независимо (и использует значительно меньше ресурсов).
- Возможности настройки построения в IDE зачастую достаточно ограничены. Для того чтобы, скажем, добавить нестандартные режимы построения, требуются затраты, сходные с написанием сценариев построения для самостоятельных утилит.
Средства автоматизации построения можно классифицировать в зависимости от положения на шкале «Явная конфигурация — соглашение о структуре проекта»:
- Наиболее общие инструменты, такие как make и его усеченный аналог nmake от Microsoft, не делают о проекте никаких предположений. Они могут выполнять любые команды оболочки. Это позволяет с одинаковым успехом применять make для построения кода на C / C++ (для этой цели make разрабатывался) и, например, компиляции LaTeX-файлов презентаций.
- Инструменты вроде Apache Ant и MSBuild находятся в промежуточном положении: они ориентированы на сборку проектов определенного вида (Ant — Java, MSBuild — .NET), но режимы построения определяются разработчиком.
- Программы типа Apache Maven и Gradle определяют структуру проекта (например, директории, где находятся исходные файлы и тесты) и цели построения по умолчанию (компиляция, тестирование, упаковка в JAR-файл и т.п.).
Конечная цель построения программного обеспечения — создание продукта (выпуска), который может использоваться вне отдела разработки. Различают два вида выпусков:
- технические выпуски, предназначенные для тестирования и обнаружения ошибок в программе;
- публичные выпуски, которые доставляются конечным пользователям.
На частоту выпусков влияет много факторов: обнаруженные ошибки, изменение среды выполнения, конкуренция и так далее. Согласно законам эволюции ПО, частота выпусков на протяжении всего жизненного цикла программной системы остается приблизительно одинаковой.
Выпуски ПО необходимо идентифицировать, например, чтобы определять совместимость между приложениями. Существует много способов нумерации выпусков; один из наиболее популярных на сегодняшний день — семантическая нумерация (semantic versioning).
Непрерывная интеграция
Все аспекты управления конфигурацией ПО эффективно используются в рамках непрерывной интеграции (continuous integration, CI) — методологии разработки, придуманной Гради Бучем и развитой Мартином Фоулером. Основная идея состоит в том, чтобы при помощи управления версиями и инструментов автоматизации построения тестировать все изменения, вносимые разработчиками. Согласно практике непрерывной интеграции, каждый разработчик фиксирует свои изменения не реже раза в день; после каждой операции фиксации проект строится на выделенном сервере построения, схожем по своей архитектуре на целевую систему. Один из последних этапов построения — прогонка исчерпывающего набора модульных тестов. Это позволяет быстро исправлять ошибки интеграции, которые неизбежно возникают при коллективной разработке.