Разворачивание веб-сайтов с помощью MSDeploy

Дата публикации: 2016-06-04

Сегодня мы поговорим об особенностях разворачивания веб-сайтов с использованием инструментов от Microsoft: IIS, Visual Studio, MSBuild, MSDeploy. Недавно я обещал товарищам написать небольшой пост на эту тему, и вот, выполняю обещание.

Мне кажется, что самым основным сценарием разворачивания при активной разработке сайтов должен быть вот такой:

  1. Удалить всё лишнее с целевого сервера.
  2. Обновить файлы, которые нужно обновить.

Казалось бы, что может быть проще? "Да с этим и стандартная деплоилка из Visual Studio справится!" — решил в своё время я. Ах, как же я ошибался...

На самом деле, стандартные средства разворачивания из Visual Studio действительно могут справиться со сценарием, если на этапе удаления "лишнего" вы хотите удалить все файлы, без исключения для каких-то каталогов. Если это так — можете дальше не читать и спокойно использовать встроенные в Visual Studio инструменты публикации.

Вкладка Settings окна публикации 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:

Вкладка Connection окна публикации Visual
Studio

Теперь на билдсервере можно подготовить пакет такой командой:

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