Разворачиваем ASP.NET приложения и windows сервисы с использованием TeamCity
В сегодняшней небольшой заметке хотел бы поделиться информацией о том, как корректно настроить Build step’ы в TeamCity для реализации auto deploy разработанных приложений на remote сервер.
Разворачиваем ASP.NET (Web API, MVC)
Я разворачиваю свои приложения с использованием Web Deploy, который предварительно придётся настроить на remote сервере. Подробнее об установке и настройке можно посмотреть здесь.
Далее, добавляем новый Build step в TeamCity со следующими настройками (о них далее):
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 будет выглядеть следующим образом:
Разворачиваем windows сервисы
При deploy сервисов (windows служб) всё несколько сложнее, т.к. сами сервисы на remote сервере потребуется останавливать и перезапускать. Для этого я решил отредактировать небольшой скрипт написанный на PowerShell.
Для начала добавляем новый Build step в TeamCity со следующими настройками (о них далее):
Runner type - выбираем исполнение PowerShell скрипта
Script - откуда брать содержимое скрипта (из script source или отдельного файла)
Script source - непосредственно сам скрипт.
Я не буду приводить весь скрипт (он доступен на github), опишу лишь алгоритм:
- Инициализация переменных;
- Подключение к remote серверу;
- Поиск службы по имени на remote сервере с помощью Get-WmiObject (для этого предварительно может потребоваться конфигурация WinRM и использование Get-Credential, если TeamCity запущена не от пользователя, у которого есть доступ);
- Подключение к доступной сетевой папке, в которой хостится служба;
- Сборка проекта с помощью msbuild;
- Бекап текущего содержимого в отдельную папку (имя которой содержит время);
- Остановка ранее найденной службы;
- Копирование собранных исходников на remote сервер;
- Запуск службы.