Разворачивание веб-сайтов с помощью MSDeploy
Сегодня мы поговорим об особенностях разворачивания веб-сайтов с использованием инструментов от Microsoft: IIS, Visual Studio, MSBuild, MSDeploy. Недавно я обещал товарищам написать небольшой пост на эту тему, и вот, выполняю обещание.
Мне кажется, что самым основным сценарием разворачивания при активной разработке сайтов должен быть вот такой:
- Удалить всё лишнее с целевого сервера.
- Обновить файлы, которые нужно обновить.
Казалось бы, что может быть проще? "Да с этим и стандартная деплоилка из Visual Studio справится!" — решил в своё время я. Ах, как же я ошибался...
На самом деле, стандартные средства разворачивания из Visual Studio действительно могут справиться со сценарием, если на этапе удаления "лишнего" вы хотите удалить все файлы, без исключения для каких-то каталогов. Если это так — можете дальше не читать и спокойно использовать встроенные в Visual Studio инструменты публикации.

В настройках публикации есть две вот таких интересных галочки: "Remove
additional files at destination" и "Exclude files from the App_Data folder". К
сожалению, нигде не указано, что друг на друга они не влияют. Даже если вы
попытаетесь исключить каталог App_Data из разворачивания - опция очистки всё
равно будет пытаться его удалить.
Чтобы это поведение поменять — нам придётся довольно существенно поменять сценарий разворачивания сайта. В дальнейшем я предполагаю, что вы уже успешно настроили и проверили Web Deploy на целевом сервере.
Для начала настроим в Visual Studio разворачивание не напрямую с помощью Web Deploy, а в Web Deploy Package:

Теперь на билдсервере можно подготовить пакет такой командой:
msbuild Solution.sln /p:DeployOnBuild=true /p:PublishProfile=Production.pubxml /t:Clean,Rebuild
(Разумеется, вы можете тот же самый пакет подготовить и с помощью Visual Studio, просто опубликовав проект.)
Эта команда подготовит пакет publish.zip в текущем каталоге, а также скрипт
разворачивания publish.deploy.cmd. Этот скрипт будет запускать MSDeploy с
нужными параметрами.
Всё, что нам остаётся сделать — это передать скрипту нужные параметры
publish.deploy.cmd /y /m:Domain /U:User "/P:Password" "-skip:Directory=\\App_Data"
Здесь Domain — машина, на которую мы разворачиваем сайт, User — имя
пользователя, у которого есть права на разворачивание, а Password — его
пароль. Обратите внимание на расстановку кавычек и символов \, это важно.
Ну и пароли с символом ^ я передавать в MSDeploy не научился, так что лучше
всего не делайте таких паролей :)
А, ну и, если вы используете PowerShell, то лучше всего в начале списка
аргументов добавьте --%, чтобы PowerShell не пытался их распарсить и
чего-нибудь испортить:
publish.deploy.cmd --% /y /m:Domain /U:User "/P:Password" "-skip:Directory=\\App_Data"
Эта команда сделает как раз то, что нам нужно: удалит лишние файлы, обновит
остальные, и не будет ничего делать с каталогом App_Data, что нам и
требовалось.