Сервис для
сео - оптимизаторов

Найди ошибки на сайте
Ошибки мешают продвижению сайта
Исправь ошибки на сайте
Сайт без ошибок продвигать легче
Получи новых клиентов
Новые клиенты принесут больше прибыль

Трой Хант: Вы развернули это неправильно! TeamCity, Subversion и Web Deploy, часть 3: Публикация с помощью Web Deploy

  1. Web Deploy
  2. Установка и настройка
  3. Развертывание из Visual Studio 2010 через веб-развертывание
  4. Публикация только изменений
  5. Развертывание из командной строки с помощью MSDeploy
  6. Невероятная универсальная команда build, package и deploy
  7. Поддержка Web Deploy
  8. Следующее…

В первых двух частях этой серии мы получили конфигурационные преобразования, и веб-приложение было успешно упаковано в красивый автономный развертываемый пакет. Далее: получите вещь для публикации.

По большей части, подавляющее большинство развертываний веб-приложений исторически осуществлялось путем выталкивания всего сайта поверх UNC или FTP, практика, которая имеет ряд фундаментальных недостатков, которые настраивают развертывание на возможный сбой. Начнем с того, что по умолчанию ни один протокол не зашифрован. Да есть SFTP а также FTPS но не часто вы видите, что они применяются, особенно не в качестве стандартного предложения хостинг-провайдеров. Помните, что ваши строки подключения и другая потенциально конфиденциальная информация (помимо только кода!) Передаются по сети в виде простого текста.

Тогда есть проблема содержания; огромное количество веб-контента - это раздутые HTML, CSS, изображения и файлы JS. Распространение информации о каждой публикации является очень трудоемким занятием, хотя в действительности большинство развертываний после первого обычно включают только небольшие наборы изменений.

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

Таким образом, старый способ работы обычно небезопасен, очень медленен и часто оставляет целевой сайт в несоответствующем, Франкенштейновском, состоянии различных версий. Ничего из этого не очень желательно!

Web Deploy

Это где Web Deploy приходит. Эта технология выходит далеко за рамки простого копирования через веб-контент; это облегчает синхронизацию между сайтами (не только публикацию нового контента, но и удаление избыточного контента из целевого объекта), репликацию конфигураций IIS, настройку сертификатов, настройку ACL и, кроме того, предоставление модели провайдера для расширения поведения.

В Web Deploy есть точки интеграции с рядом знакомых инструментов. Установщик веб-платформы Microsoft например, он интегрируется с IIS и Visual Studio 2010. Он также доступен через командную строку с помощью команды MSDeploy, которую мы будем использовать для получения пакета, созданного ранее. на наш веб-сервер в автоматическом режиме.

Теперь о плохих новостях; когда дело доходит до Web Deploy, IIS6 не совсем первоклассный гражданин. С другой стороны, IIS6 устарел почти на три года, так что, я думаю, понятно, что существует определенная степень компромисса. Как оказалось, большая часть работы, которую я выполнял с Web Deploy, была ограничена IIS6 благодаря инфраструктуре, которую я использую в качестве Windows Server 2003. Однако я также использую виртуальную машину в комплекте с Windows Server 2008 и IIS7, чтобы попытаться порадовать всех, я разделю информацию, относящуюся к любой версии, на две части.

Установка и настройка

Прежде всего, получите установщик из Установка Web Deployment Tool страница на TechNet. Если вы хотите действительно четкое пошаговое руководство о том, как это запустить, посмотрите на Скотта Гу Автоматизация развертывания с помощью Microsoft Web Deploy , Теперь давайте посмотрим, где мы начинаем расходиться в зависимости от версии IIS:

Одна небольшая заметка о версиях; вы все еще получаете службу агента веб-развертывания в IIS7:

Одна небольшая заметка о версиях;  вы все еще получаете службу агента веб-развертывания в IIS7:

Вы можете использовать его вместо веб-службы управления, но, учитывая модель безопасности при развертывании только администраторами, я полагаю, что существует не так много вариантов его существования на более новом веб-сервере.

Развертывание из Visual Studio 2010 через веб-развертывание

Давайте продолжим с развертыванием чего-либо. Для этой серии публикаций я настроил виртуальный ПК с Windows Server 2008 под управлением IIS, как я упоминал ранее, но он также работает VisualSVN Server а также JetBrains TeamCity , Название машины - «AutoDeploy», поэтому вы увидите, как это имя всплывает в скриншотах и ​​примерах кода.

Хорошо, давайте вернемся к приложению, которое мы опубликовали локально, в файловую систему в части 1, и щелкните правой кнопкой мыши веб-проект и выберите «Опубликовать…», но на этот раз я изменю метод публикации на «Веб-развертывание». URL-адрес службы - это конечная точка, предоставляемая Web Deploy, и она будет отличаться в зависимости от вашей версии IIS:

Для любого сервера имя сайта / приложения указывается при создании веб-сайта IIS. Это выглядит немного по-другому в II6 и IIS7, но концептуально это одно и то же. Вот что я вижу в своем VPC при создании сайта:

В этом случае мой сайт называется «AutoDeployWebsite». Я добавлю это на страницу публикации в Visual Studio 2010 вместе с другими конфигурациями, описанными выше, и вот что мы в итоге получим:

Нажмите кнопку «Опубликовать», и мы должны быть в отъезде. Visual Studio может запросить аутентификацию, прежде чем идти дальше. Ради простоты я просто собираюсь пройти аутентификацию как администратор. Очевидно, что это единственный вариант, который у вас есть с IIS6 в любом случае (или, по крайней мере, с учетной записью в группе администраторов), но для IIS7, посмотрите на пост IIS на сайте Настройте обработчик веб-развертывания ,

Интересно, что если вы не введете учетные данные при вызове, Visual Studio попытается использовать NTML вместо базовой аутентификации. Честно говоря, я нахожу это очень не интуитивным и совершенно запутанным. Люди привыкли предоставлять учетные данные, когда им бросают вызов, и для этого подразумевать возврат к базовой аутентификации немного неожиданно.

Немного подумав, вы увидите, что окно вывода возвращает несколько значимых результатов:

Немного подумав, вы увидите, что окно вывода возвращает несколько значимых результатов:

Это должно включать:

  1. Конфигурация преобразования применяется к проекту
  2. Расположение успешно упакованного проекта
  3. URL-адрес службы для MsDepSvc (IIS6) или WMSvc (IIS7)
  4. Название сайта в IIS
  5. Результат развертывания, который (надеюсь) должен быть успешным

Теперь мы взглянем на сайт и убедимся, что все выглядит нормально. Это просто старое веб-приложение ASP.NET, поэтому оно должно быть вам знакомо. Как мы видели ранее, я установил порт 90, поэтому давайте посмотрим, что там:

Итак, вот оно, успешное развертывание через Web Deploy!

Публикация только изменений

Давайте снова запустим тот же самый процесс публикации и проверим результаты сборки:

Видеть, что? Где все файлы, которые мы видели в предыдущем развертывании ?! Оказывается, Web Deploy немного умнее простого копирования и вставки. Вот как Скотт Гу объясняет это :

Web Deploy достаточно умен, чтобы сравнивать удаленный сервер с вашим локальным проектом - и копировать только те файлы, которые ему нужны. Поэтому, если вы внесете несколько изменений в большой проект, а затем повторно опубликуете его, будут скопированы только те файлы, которые были изменены. Файлы, которые не были обновлены, больше не нужно копировать. Это значительно ускоряет повторное развертывание / обновление сайта, особенно когда в проекте много статического контента и больших изображений.

Так что это чрезвычайно дружественный к сети способ публикации. Эта практика не только значительно сокращает общую продолжительность публикации, но также расширяет время простоя приложения до минимума. Это также означает, что вы можете быть уверены, что целевой веб-сайт будет выглядеть точно так же, как и в вашем пакете. Правила предсказуемости!

Развертывание из командной строки с помощью MSDeploy

Теперь, когда мы знаем, что преобразования конфигурации работают прекрасно, приложение упаковывается, а в целевом приложении выполняется Web Deploy, нам нужно, чтобы развертывание происходило из командной строки. Как я уже говорил, когда говорил о MSBuild, процесс развертывания должен происходить без присмотра, как только мы доберемся до сервера сборки, поэтому пришло время вернуться к командной строке.

Сказать привет msdeploy.exe , После запуска того же установщика Web Deploy, который использовался в дальнейшем для сервера, вы обнаружите этого маленького парня, сидящего в C: \ Program Files \ IIS \ Microsoft Web Deploy (или Program Files (x86) для нас, 64-битных пользователей). Это команда, которая поможет нам опубликовать пакет.

На самом деле, это только частично правильно, потому что есть абстракция к MSDeploy, которая немного облегчает задачу. Во второй части, когда мы опубликовали приложение локально, в папке obj / Deploy-Dev / Package было создано несколько файлов, в том числе один Web.deploy.cmd , Как объяснено в ссылке, этот командный файл можно использовать для установки пакета на локальном сервере или для удаленной установки с помощью MsDepSvc или WMSvc.

Но прежде чем мы это сделаем, мы хотим сделать еще одну конфигурацию для веб-приложения. Давайте откроем свойства проекта, выберите конфигурацию сборки для Deploy-Dev и затем зайдите на веб-сайт IIS:

Давайте откроем свойства проекта, выберите конфигурацию сборки для Deploy-Dev и затем зайдите на веб-сайт IIS:

Причина, по которой мы нуждаемся в этом, заключается в том, что он используется в файле SetParameters.xml, который мы рассматривали ранее при создании пакета, который определил строку подключения для целевой среды. Фактически веб-сайт IIS публикуется в своем собственном узле setParameter чуть выше строки подключения, когда вы в следующий раз создаете пакет из приложения:

<setParameter name = "Имя веб-приложения IIS" value = "AutoDeployWebsite" /> <setParameter name = "AutoDeployDb-Web.config Строка подключения ...

Возвращаясь к Web.deploy.cmd, мы будем вызывать его с минимальным набором параметров, чтобы он выглядел так:

Web.deploy.cmd
/ Y
/M:https://AutoDeploy:8172/MsDeploy.axd
-allowUntrusted
/ U: AutoDeploy \ Administrator
/ Р: passw0rd
/ A: Basic

Эта команда состоит из 5 важных частей:

  1. Переключатель / Y, который вызывает MSDeploy без Флаг «-whatif» , Нам не нужен отчет о том, что изменится операцией, мы просто хотим это сделать.
  2. Ключ / M, очевидно, является тем местом назначения, которое мы публикуем.
  3. Параметр –allowUntrusted эквивалентен установке флажка «Разрешить ненадежный сертификат» в диалоговом окне публикации Visual Studio ранее.
  4. Ключи / U и / P - это учетные данные, необходимые для доступа к Web Deploy. В мире IIS7 вы не хотели бы использовать учетную запись администратора, но это упрощает демонстрацию.
  5. Переключатель / A на самом деле причинял мне немного боли в течение дня. Дело в том, что без этого - который явно устанавливает аутентификацию на «Basic» - ваши учетные данные в виде простого текста не будут аутентифицированы (есть еще один крик о помощи в переполнении стека ). Одна из причин, по которой меня это вызвало, заключается в том, что я довольно долго развертывался на IIS6 через MsDepSvc и даже IIS7 с почти идентичным синтаксисом и у меня не было проблем. Очевидно, что WMSvc работает немного по-другому.

Когда команда выполняется, выходные данные показывают, что на самом деле это просто оболочка для MSDeploy (вы можете увидеть, что msdeploy.exe вызывается в строке 12 ниже), которая затем добавляет целый ряд других параметров. Остальная часть вывода довольно напоминает то, что мы видели в Visual Studio:

Тем не менее, есть одна вещь, на которую стоит обратить внимание: она является своего рода фундаментальной для принципа полного развертывания приложения с нуля с помощью этой команды, и это сообщение «0 удалено». Посмотрите, что происходит, когда я создаю произвольный текстовый файл на целевом веб-сайте, а затем снова запускаю тот же комментарий развертывания:

Видеть, что? Файл «Junk.txt», который я создал, теперь исчез. Концептуально это важно, потому что это означает, что каждый раз, когда вы развертываете веб-сайт, он будет в том же состоянии, что и последнее развертывание, независимо от файлов, накопленных на веб-сервере с момента последнего. Очевидно, вы хотите убедиться, что ваше приложение структурировано так, что вы не потеряете данные, которые вы не должны. Предсказуемость, предсказуемость, предсказуемость.

Между прочим, вы можете (и действительно должны ) всегда снимать флажок «Оставлять дополнительные файлы в месте назначения (не удалять)» в окне публикации Visual Studio, чтобы добиться того же, он просто уже установлен по умолчанию, тогда как командная строка работает в перевернуть и удалит лишние файлы по умолчанию. IDE является своего рода анти-паттерном предсказуемости по умолчанию!

Невероятная универсальная команда build, package и deploy

Я говорю «невероятно», потому что, честно говоря, я не думал, что это сработает, и когда вы увидите характерную особенность его реализации, вы поймете, почему. При написании этой серии блогов я старался убедиться, что все работает против VPC с IIS7, который не присоединен к домену AD и должен проходить аутентификацию извне с помощью базовой аутентификации, и гарантировать, что все работает хорошо в более формальной среде с AD. и встроенная проверка подлинности NTML, но с использованием IIS6. Нет ничего хуже, чем читать примеры кода, которые прекрасно работают в концептуальном контексте, а затем разваливаются, когда вы представляете их в реальном мире!

Давайте ненадолго вернемся к MSBuild, и мы восстановим команду для сборки, упаковки и развертывания:

msbuild Web.csproj
/ Р: Конфигурация = Развертывание-Дев
/ P: DeployOnBuild = True
/ Р: DeployTarget = MSDeployPublish
/P:MsDeployServiceUrl=https://AutoDeploy:8172/MsDeploy.axd
/ P: AllowUntrustedCertificate = True
/ Р: MSDeployPublishMethod = WMSvc
/ P: CreatePackageOnPublish = True
/ P: UserName = AutoDeploy \ Administrator
/ P: Пароль = passw0rd

Исходя из того, что мы уже рассмотрели в этом посте, это должно быть в основном самоочевидным. Эту же команду можно успешно выполнить с MsDepSvc, используя соответствующий URL-адрес службы и изменив значение MSDeployPublishMethod с «WMSvc» на «RemoteAgent».

С трудом, с которым я столкнулся с этой проблемой в интегрированном мире аутентификации, я просто не мог заставить его работать над NTML. Вернуться к переполнению стека снова и оказывается, что удаление одного имени пользователя и пароля и даже явное указание типа аутентификации в качестве NTML ничего не даст. В конце концов, решение было таким же простым, как передача параметра имени пользователя без значения. Пойди разберись!

Так что вот и все для командной строки, теперь мы можем написать сценарий сборки, пакета и развертывания, что очень хорошо настраивает нас на автоматизацию.

Поддержка Web Deploy

Еще одна вещь, прежде чем завершить часть 3; насколько распространен Web Deploy? Это технология довольно новой эпохи, так что же такое поддержка Web Deploy от провайдеров хостинга? Это на самом деле очень хорошо, многие из них делают его доступным в своих стандартных предложениях. Например, есть WinHost :

А также Скидка ASP.NET :

... и много других. Дело в том, что веб-развертывание начинает восприниматься как средство простого и эффективного развертывания веб-контента .NET. Учитывая плохие старые времена FTP, наличие хоста, предлагающего безопасную конечную точку Web Deploy, является очень хорошим дополнением к сервису.

Следующее…

Затем мы перейдем к TeamCity и получим все решение, автоматически основывающееся на каждом изменении VCS, а затем в заключительной части серии мы получим автоматическое развертывание этого веб-приложения.

TeamCity Непрерывная интеграция диверсия Web Deploy IIS Visual Studio

Где все файлы, которые мы видели в предыдущем развертывании ?
Это технология довольно новой эпохи, так что же такое поддержка Web Deploy от провайдеров хостинга?