среда, 4 декабря 2013 г.

Интеграция Octopus Deploy и TeamCity

Octopus Deploy умеет интегрироваться как с MS Build так и с TeamCity. В первом случае используется Nuget пакет OctoPack, который позволяет формировать пакеты для деплоймента. Для TeamCity же существует плагин, который позволяет вызывать команды Octopus API.

Что нужно сделать для интеграции Octopus Deploy и TeamCity?

  1. Добавить OctoPack к проекту в Visual Studio.
  2. Добавить плагин к TeamCity 
  3. Включить Nuget сервер на TeamCity.
  4. Создать деплой шаги в Octopus.
  5. Создать дополнительные шаги в TeamCity.

Добавление OctoPack к проекту в Visual Studio

Открываем наш проект в Visual Studio и добавляем Nuget пакет OctoPack в наш проект. Теперь во время билда нашего проекта, так же будут формироваться Octopus пакеты.

Добавление плагина к TeamCity 

Скачиваем плагин с http://octopusdeploy.com/downloads и просто копируем архив в соответствующую папку на машине с TeamCity. После этого перегружаем сервисы TeamCity и TemaCity агента.
В моем случае это была папка C:\ProgramData\JetBrains\TeamCity\plugins.
Более подробное описание тут http://confluence.jetbrains.com/display/TCD8/Installing+Additional+Plugins


Включение Nuget сервера на TeamCity

Открываем консоль TeamCity и переходим в раздел Administration - NuGet Settings. Включаем Nuget Server и копируем его адрес. Далее открываем консоль Octopus Server, переходим в Configuration - NuGet и добавляем этот линк. Теперь неплохо бы проверить доступ Octopus к NuGet серверу.

Создание деплой шагов в Octopus

Для начала проверим что Octopus Deploy содержит нужные нам окружения и машины с правильными ролями. У меня создано окружение Dev с машиной WebDev, у которой роль Web. Так же у меня создан проект Web Site. 
Переходим на наш проект в список шагов и создаем новый шаг с типом "Deploy a NuGet package". Задаем следующие параметры:
  • Step name: Deploy
  • NuGet package: имя вашего проекта, который был собран с TeamCity, в моем случае это Demo
  • Deploy to roles: Web
Остальные параметры оставим пока по умолчанию.
Теперь добавим переменную "PackageDirectoryPath" с значением "c:\web". Переменные так же позволяют подменять значения в Web.config нашего сайта во время деплоймента, так мы можем установить различные значения ConnectionString для Dev и Live окружений.
Вернемся к списку шагов и обновим наш шаг Deploy, изменив значения:
  • Destination folder: #{PackageDirectoryPath}
  • Update IIS: нет
  • Site/virtual directory: $OctopusParameters["OctopusProjectName"]
Теперь добавим второй шаг типом "Run a PowerShell script" и именем "Update IIS". Сам скрипт следующий:
$siteName = $OctopusParameters["OctopusProjectName"]
$path = $OctopusParameters["PackageDirectoryPath"]
$port = 80
Import-Module webadministration
New-Website -Name $siteName -PhysicalPath $path -Force -Port $port
Start-Website -Name $siteName
trap [Exception]
{
    Write-Error $_.Exception.Message
    exit 1
}
Данный скрипт настраивает IIS для нашего веб сайта. Роль конечно же "Web"

По настройкам Octopus Deploy все, теперь можно создать релиз и задеплоить его.

Создание деплой шагов в TeamCity

Открываем консоль TeamCity и переходим в редактирование нашего проекта, для этого можно нажать на имени проекта "Web Site", а потом выбрать "Edit Project Settings". Нам нужно создать новую "Build Configuration" с именем Deploy.
VCS оставляем по умолчанию и переходим собственно к "Build Step". Задаем:
  • Runner type: OctopusDeploy: Release
  • Step name: Deploy
  • Octopus URL: адрес нашего Octopus Deploy сервера
  • API key: ключ нашего аккаунта в Octopus
  • Project: Web site
  • Release number: 1.2.5.%env.BUILD_NUMBER%
  • Deploy to: Dev
  • Wait for deployment to complete: да
Осталось добавить билд тригер, если мы хотим что бы деплоймент на Dev выполнялся после каждого успешного билда. Создаем "Finished Build Trigger" зависимого от "Web Site :: Build".

Все готово, возвращаемся на главную консоли TeamCity и запускам билд конфигурацию, в результате будут автоматически выполнятся следующие действия:
  1. Получение исходного кода из репозитория
  2. Билд веб сайт и публикация пакета на Nuget сервере
  3. Запуск всех юнит тестов
  4. Создание нового релиза в Octopus Deploy
  5. Деплой этого релиза на Dev окружение

Тем самым мы реализовали стратегию "continuous delivery".