1 minute read

В сегодняшней небольшой заметке хотел бы поделиться информацией о том, как корректно настроить Build step’ы в TeamCity для реализации auto deploy разработанных приложений на remote сервер.

Разворачиваем ASP.NET (Web API, MVC)

Я разворачиваю свои приложения с использованием Web Deploy, который предварительно придётся настроить на remote сервере. Подробнее об установке и настройке можно посмотреть здесь.

Далее, добавляем новый Build step в TeamCity со следующими настройками (о них далее):

mt command

Solution file path* - путь до разворачиваемого приложения из solution’a (в моём случае solution содержит несколько проектов и для deploy’a каждого используется свой собственный build step).

Configuration - наименование конфигурации вашего проекта, например, для трансформации конфигурационных файлов, таких как web.config и app.settings.

Command line parameters - перечень параметров, которые будут использованы в качестве аргументов при запуске msbuild.exe (сам процесс build & deploy выполняется именно этим приложением).

Непосредственно за deploy отвечают следующие из них:

Указание о необходимости deploy после успешного build:

/p:DeployOnBuild=true

Способ разворачивания:

/p:DeployTarget=MSDeployPublish
/p:AllowUntrustedCertificate=True

Настройки Web Deploy после конфигурации:

/p:MsDeployServiceUrl=https://62.56.35.72:8172/MsDeploy.axd
/p:Username=Deployuser
/p:Password=Deployuserpassword

Наименование IIS узла на remote сервере:

/p:DeployIisAppPath=testapi.your-company-site.ru

Если всё было выполнено корректно, то результат build log будет выглядеть следующим образом:

mt command

Разворачиваем windows сервисы

При deploy сервисов (windows служб) всё несколько сложнее, т.к. сами сервисы на remote сервере потребуется останавливать и перезапускать. Для этого я решил отредактировать небольшой скрипт написанный на PowerShell.

Для начала добавляем новый Build step в TeamCity со следующими настройками (о них далее):

mt command

Runner type - выбираем исполнение PowerShell скрипта

Script - откуда брать содержимое скрипта (из script source или отдельного файла)

Script source - непосредственно сам скрипт.

Я не буду приводить весь скрипт (он доступен на github), опишу лишь алгоритм:

  1. Инициализация переменных;
  2. Подключение к remote серверу;
  3. Поиск службы по имени на remote сервере с помощью Get-WmiObject (для этого предварительно может потребоваться конфигурация WinRM и использование Get-Credential, если TeamCity запущена не от пользователя, у которого есть доступ);
  4. Подключение к доступной сетевой папке, в которой хостится служба;
  5. Сборка проекта с помощью msbuild;
  6. Бекап текущего содержимого в отдельную папку (имя которой содержит время);
  7. Остановка ранее найденной службы;
  8. Копирование собранных исходников на remote сервер;
  9. Запуск службы.