Разворачивание веб-сайтов с помощью 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
, что нам и
требовалось.