﻿# Платформа автоматизации сборок CruiseControl\.NET

В ходе разработки структурно\-сложных программных продуктов, в какой\-то момент возникает необходимость автоматизировать процессы сборки и интеграции разрабатываемых проектов и дистрибутивов\. Непрерывная интеграция \- это практика разработки программного обеспечения, предполагающая частую \(до нескольких раз в течение дня\) автоматизированную сборку и последующее автоматическое тестирование текущей версии продукта\. Такой подход позволяет снизить трудоёмкость самой интеграции, и выявлять в ней ошибки и противоречия, начиная с самых ранних этапов\. Заметим, что данная методика предполагает использование системы управления версиями \(как например CVSNT, Subversion\) для хранения исходных кодов и всего остального, что необходимо для сборки и тестирования проекта\.

Ранее разрабатывая статический анализатор кода PVS\-Studio для поиска 64\-битных и параллельных ошибок, мы решали данную задачу с помощью файлов сценариев командной строки Windows\. Хотя такой подход кажется наиболее простым и не требует использования каких\-либо специализированных инструментов, его применение неизбежно приводит к возникновению ряда проблем, а именно:

* сложность поддержания скриптов в актуальном состоянии;
* трудности в переносе скриптов на другую машину и использования их другими разработчиками;
* сложность добавления новых процессов сборки в существующие скрипты;

Для разрешения данных проблем было решено воспользоваться специализированной платформой для организации непрерывной интеграции \- CruiseControl\.NET\. Перед системой сборки были поставлены следующие задачи:

* Выполнение полной сборки и установки основного проекта;
* Выполнение сборки, установки и запуска системы тестирования проекта;
* Выполнение сборки вспомогательных проектов;
* Формирование резервных копий сайта проекта и репозитория системы управления версиями\.
* Запуск всех команд по расписанию, возможность принудительного запуска сборки по запросу\.

## Сервер интеграции CruiseControl\.NET

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

* интервальный триггер
* фильтр по времени и дням недели
* по сборке другого проекта
* по расписанию
* по изменению страницы на указанном URL

По завершении сборки сервер системы сообщит разработчикам о её результатах и опубликует их\. Конечно, сборку любого проекта можно запустить и принудительно вручную\. Как правило сервер интеграции размещают на специально выделенной машине, конфигурация которой максимально соответствует окружению в котором проект будет развернут\. Результат только такой сборки можно считать конечным\.

Ниже приведена схема организации сервера системы непрерывной интеграции:

![0059_CruiseControl_NET_-_build_automation_platform_ru/image1.png](https://import.viva64.com/docx/blog/0059_CruiseControl_NET_-_build_automation_platform_ru/image1.png)

Управлять сервером сборки возможно при помощи специального конфигурационного XML файла\. По умолчанию он имеет имя ccnet\.config и находится в одной с сервером директории\. На самом верхнем уровне данного файла расположены очереди интеграции и проекты интеграции, а все остальные настройки описаны в подуровнях отдельных проектов\. Проектов может быть много и они могут собираться или не собираться одновременно и в зависимости друг от друга, что и определяется их расположением в очередях интеграции\. Несколько очередей могут собираться одновременно, а проекты внутри этих очередей могут собираться только последовательно\.

Каждый проект представляет собой набор различных интеграционных заданий, триггеров для его запуска и блок, определяющий параметры взаимодействия сервера с системой контроля версий\. Каждый из данных блоков описывается на соответствующих подуровнях проекта\. Сами задания разделены на 3 блока: предшествующие сборке, составляющие непосредственно сборку и следующие за сборкой\. Эти задания представляют из себя отдельные действия \(такие, как выполнение команды из командной строки, запуск тестов или публикация результатов сборки\), из которых и складывается процесс интеграции проекта\. В CruiseControl\.NET для сборки можно использовать много разных методов:

* выполнение команды из командной строки Windows
* проекты MSBuild
* сборка из solution\-файла Visual Studio
* с использованием NAnt \- свободно распространяемого ПО для автоматизации процесса сборки

Сборка отдельного проекта будет считаться успешно выполненной только при условии успешного выполнения всех задач из 2\-ого \(сборочного\) блока\. CruiseControl\.NET имеет большой набор методов публикации результатов:

* Web Dashboard \- веб\-приложение для IIS;
* почтовая рассылка с различными режимами;
* копирование файлов из одной директории в другую;
* включение XML логов сторонних программ в свои логи;
* запуск сборки на другом сервере;
* создание XML файла с изменениями между сборками;
* сбор статистики по сборкам;

В дополнение к серверу автоматизации пакет CruiseControl\.NET включает в себя инструменты CCTray и Web Dashboard\. CCTray \- это утилита Windows, которая висит в области нотификаций и показывает статус сборок на удаленном сервере\. С ее помощью также можно наблюдать статус нескольких сборок на разных серверах одновременно и заставлять сервер производить сборки\. Web Dashboard \- веб приложение для сервера IIS\. Оно призвано отображать данные по сборкам через веб интерфейс\. При помощи него можно отображать данные с разных серверов\.

Польза от внедрения подобной системы очевидна\. В первую очередь это безболезненная интеграция всего проекта\. Интеграция различных модулей и правок разных программистов происходит в автоматическом режиме, и при возникновении каких\-либо ошибок об этом становится сразу известно\. Более того, непрерывная интеграция полезна не только для определения состояния дел в текущий момент, но и для анализа тенденций\. Однако стоит заметить, что и сам процесс автоматизированной интеграции также требует постоянной наладки и подстройки в соответствии с изменениями в собираемых им проектах\.