Continuous Integration и Continuous Delivery де-факто являются неотъемлемой частью современной разработки проектов. Для автоматизации CI существует множество программ от различных вендоров, а вот с автоматизированием развертывания приложений дела обстоят скромнее. Одним из помощников развертывания является Octopus Deploy.





Введение


Давайте рассмотрим распространенный подход в процессе разработки. Разработчики пишут код, прогоняют unit-тесты по затронутому коду, делают commit. И делают это как можно чаще, согласно идеологии CI. Далее CI приложение (TeamCity, TFS, Jenkins, Bamboo, или другое любимое в вашей команде) собирает приложение и прогоняет автоматические тесты.
Наступает момент, когда пора отдать приложение на ручное тестирование и член команды (DevOps) развертывает приложение для тестеров.

А вот и следующий момент, пора отдавать на тестирование заказчику (User Acceptance Test или Staging).
Ну и после зеленого сигнала от заказчика наступает главный по значимости момент, публикация приложение в production. Причем часто заказчик ожидает, что если что-то пойдет не так в production'e, то ваша команда сможет откатить все изменения щелчком пальца, максимум в течение получаса.

На помощь в развертывании .NET приложений приходит Octopus Deploy. Octopus забирает пакет с приложением и развертывает его на сервере. Обычно первым идет Dev Environment сервер. Далее можно легко продвинуть приложение на Test, UAT/Staging, а затем и Production environment сервера. Но обо всем по порядку.



Устройство Octopus


Осьминожка использует Octopus Server, который забирает NuGet пакеты с приложениями. Забирать их может автоматически из NuGet репозитория, подписавшись на NuGet Feed CI сервера по http/https, или из обычной папки на сервере. Как правило NuGet пакет должен содержать полное приложение, например ваш полный ASP.NET Web сайт, или все файлы необходимые для установки Windows Service'a.

Дотягивается Octopus до серверов публикации с помощью щупалец. Tentacle Agent представляет собой легковесную программу, которая запускается в виде Windows Service'a, забирает Nuget пакет с Octopus Server'a и разворачивает приложение. Есть режим общения pull и push, т.е. Tentacle периодически опрашивает сервер на новые пакеты, или Tentacle ждет сигнала от сервера и сервер push'ит. Octopus Server также запускается в виде Windows сервиса, и общается со своими щупальцами через защищенной HTTPS (TLS и X.509 сертификат). Для большей безопасности при установке Octopus необходимо настроить каким Tentacle агентам доверяет сервер и наоборот.

В текущей версии 2.0 для хранения всех данных используется встроенная база данных RavenDB, но по ряду причин в новой версии 3.0 перейдут на MS SQL Server. Кстати новая версия выйдет в ближайшие месяцы, хотя согласно политике компании у вас будет возможность обновиться до новой версии в ближайший год после покупки, после года вас не бросает на полный произвол и дают скачать критические обновления бесплатно, но уже, конечно, без новых фитч.

Среда, роли и приложения


Остановимся немного подробнее на структуре, которая может получится.

У нас три environment'a (Test, Staging и Production). Шесть серверов, на которые установлены Tentacles и куда будет устанавливаться приложение. И две роли: octo-web и octo-app. Создание ролей очень удобно, например можно указать: установить сайт только на машины, у которых есть роль octo-web, а приложение только на машины с ролью octo-app. Заметьте, что для тестирования отведен один сервер, на котором будет находится и сайт, и приложение. А на production целых три сервера, один под приложение, и два под сайт. Это очень реалистичный сценарий с развертыванием двух копий сайта (без базы данных) и последующим запуском балансировщика.

Приложение OctoFX, с ролью octo-app, будет выглядеть следующим образом:

Жизненный цикл приложения будет заключаться в прохождении Test среды, далее Staging, а затем запуска на Production.
Настройки очень широкие и можно выбирать доступные среды для разных приложений.

Шаги и переменные


Шаги

Каждое развертывание делается пошагово. И в каждом шаге есть возможность:
  • Скачать и разместить содержимое NuGet пакета в папке, FTP или MS Azure сервере
  • Запустить Power Shell скрипт, передать в скрипт переменные
  • Обновить config файлы с помощью специальных переменных
  • Трансформировать config файлы. Как правило при сборке будет запускаться config.Release, но вы можете добавить еще одну XML трансформацию поверх, например config.Staging
  • Отправлять сообщения по электронной почте
  • Останавливать процесс развертывания и запросить действия пользователя.
  • Запускать специальный шаг для удобного разворачивания Windows сервиса
  • Запускать специальный шаг для разворачивания сайта, включая обновление binding'ов и портов




Переменные

Переменные вынесены в отдельный блок и позволяют модифицировать значение в зависимости от среды, роли или имени сервера.
Рассмотрим пример с Хабром, если нам необходимы разные значения для адреса нашего сайта и мы хотим поменять переменную в web config'e, то достаточно ее добавить в блок

Тогда config файл
<appSettings>
    <add key="HabrahabrSiteRoot" value="testkey"/>
  </appSettings>
  <deepConfigSection>
    <anotherTagExample someAttribute ="Site #{HabrahabrSiteRoot}" />
  <deepConfigSection>

может быть автоматически трансформирован в Dev среде в
<appSettings>
    <add key="HabrahabrSiteRoot" value="http://dev-habrahabr.local"/>
  </appSettings>
  <deepConfigSection>
    <anotherTagExample someAttribute ="Site http://dev-habrahabr.local" />
  <deepConfigSection>

Удобнее всего хранить в переменных пароли, так как Octopus их шифрует и не позволяет скопировать или увидеть в дальнейшем в панели Variables. Существует возможность создать пользователей и ограничить доступ в средам. Таким образом с помощью блока переменных и ограничения доступа пользователям можно сделать так, что только администратор или Release менеджер может развернуть приложение в Production и соответсвенно увидеть пароли в конечном варианте config файла.

Имеются и специальные системные переменные. Их можно использовать также, как и пользовательские переменные, т.е. в PowerShell скриптах или Config файлах. Например, один из наших клиентов использует Umbraco сайт. Конечно в NuGet пакет имеет смысл складывать только исполняемую часть сайта, а не Гигабайты медиа контента. При обновлении сайта Octopus создает новую папку, т.е. на самом деле новый сайт, например, кладет его в папку \Octopus\Applications\UmracoSite\1.20.0\. И мы копируем с помощью PowerShell скрипта и переменной Octopus.Deployment.PreviousSuccessful.Id весь media контент из старой версии сайта в новую.

Заключение


До сих пор я встречаю ручной бэкап базы данных перед развертыванием приложения, ручное изменение config файлов, множество вариантов самописных скриптов, которые хранятся локально и отличаются у программистов и системных администраторов, и даже ручное копирование папки приложения в production и test environment.
Попробуйте минимизировать человеческий фактор и рутину в этом процессе. И удачного вам deployment'a!

Полезные ссылки:


Проект
Видео уроки
Документация

Комментарии (8)


  1. return_true
    13.07.2015 22:34
    +1

    Хочу отметить наличие неплохого REST API
    docs.octopusdeploy.com/display/OD/Octopus+REST+API


  1. Denisio
    16.07.2015 14:28

    Не очень понял какие минимальные права задать конечному пользователю, чтобы он смог установить tentacle и зарегистрироваться в Octopus.

    Вкратце задача следующая — есть более 300 клиентов с слегка специфичным сайтом (IIS 6/7/7.5, .NET 4, ASP.NET + SQLExpress + ещё один сервис). Задача — CI этого проекта у клиентов. Клиенты ни формально, ни неформально нам не подчиняются и обычно ставят этот сайт себе силами своих админов. Так вот задача облегчить им регулярные обновления. Так что ищется минимально необходимые права, которые надо дать сторонним пользователям, чтобы они смогли настроить себе тентаклю и получить CI.


    1. lair
      16.07.2015 14:33

      На машине, на которой тентакль работает, ему лучше всего иметь административные права (иначе устанете выяснять, из-за чего очередная ошибка). Соответственно, чтобы поставить такой тентакль — тоже нужны административные права.

      При этом в самом октопусе этим людям вообще никаких прав иметь не надо.

      (PS Только это не CI, вы же тесты у них не гоняете?)


      1. Denisio
        16.07.2015 14:36

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


        1. lair
          16.07.2015 14:40

          Вы, видимо, ставите polling tentacle, а вам надо ставить listening. В этом случае все, что тентаклю нужно знать об октопусе — это отпечаток его ключа.


          1. Denisio
            16.07.2015 19:43

            Как октопус узнаёт о тентаклях, который находятся в состоянии listening?


            1. lair
              16.07.2015 19:45

              Они в нем явно настраиваются.


        1. a-artur Автор
          19.07.2015 13:34

          Не уверен, что Октопус именно то, что вам подойдет лучше всего. Вопрос: кто отвечает за сервер, где установлен Tentacle, клиент или вы? Кто будет делать Security обновления сервера, и кто будет обновлять Octopus Tentacle (не деплой, а security update)? Возможно, что обычный выпуск msi пакетов будет лучше, когда клиент решает надо им обновить сайт или нет. Как правило, используя Octopus вы фактически берете на себя ответственность за поддержку Tentacle. Иначе в будущем при расхождении версии Octopus Server'a и Octopus Tentacle обновление просто не пройдет.

          По поводу прав для установки, скорее всего нужно иметь права администратора, как советуют lair, но это опять же зависит от настроек ОС вашими клиентами. Octopus Tentacle — это обычный Виндоус сервис. Можете узнать у клиентов, под каким пользователем разрешено устанавливать сервисы. Вот список прав, которые в конечном итоге нужны для успешной работы сервиса (не установки).

          Если вам все же подходит Octopus для ваших задач, рекомендую посмотреть на шаблоны для развертывания Tentacle.

          С радостью постараюсь ответить на ваши вопросы и помочь.