Выполнение развертывания "Что если"

Джейсон Ли

В этом разделе описывается, как выполнять анализ "что, если" (или имитационные развертывания) с помощью средства развертывания служб IIS (Internet Information Services), Web Deploy и VSDBCMD. Это позволяет определить влияние логики развертывания на определенную целевую среду перед развертыванием приложения.

Этот раздел является частью серии учебников, основанных на требованиях к развертыванию предприятия вымышленной компании Fabrikam, Inc. В этой серии учебников используется пример решения — решение Contact Manager— для представления веб-приложения с реалистичным уровнем сложности, включая приложение MVC 3 ASP.NET MVC 3, службу Windows Communication Foundation (WCF) и проект базы данных.

Метод развертывания в центре этих учебников основан на подходе к разделенному файлу проекта, описанному в разделе "Общие сведения о файле проекта", в котором процесс сборки и развертывания управляется двумя файлами проекта — одним из которых содержатся инструкции по сборке, которые применяются к каждой конечной среде, а также один из них содержит параметры сборки и развертывания для конкретной среды. Во время сборки файл проекта для конкретной среды объединяется в файл проекта, не зависящем от среды, чтобы сформировать полный набор инструкций по сборке.

Выполнение тестового развертывания веб-пакетов

Веб-развертывание включает функции, которые позволяют выполнять развертывания в режиме "что если" (или пробная версия). При развертывании артефактов в режиме "что если" Web Deploy генерирует лог-файл так, как если бы вы выполнили развертывание, но на самом деле не вносит изменений на целевой сервер. Просмотр файла журнала поможет вам понять, какое влияние развертывание окажет на целевой сервер, в частности:

  • Что будет добавлено.
  • Что будет обновлено.
  • Что будет удалено.

Поскольку развертывание в режиме "что если" фактически не вносит изменений на целевой сервер, оно не всегда может предсказать, будет ли развертывание успешным.

Как описано в разделе "Развертывание веб-пакетов", вы можете развернуть веб-пакеты с помощью веб-развертывания двумя способами, используя программу командной строки MSDeploy.exe непосредственно или запустив файл .deploy.cmd , который создает процесс сборки.

Если вы используете MSDeploy.exe напрямую, можно запустить развертывание "что если", добавив флаг Whatif в команду. Например, чтобы оценить, что произойдет, если вы развернули пакет ContactManager.Mvc.zip в промежуточной среде, команда MSDeploy должна выглядеть следующим образом. Обратите внимание, что в следующем примере используется $CREDENTIAL_PLACEHOLDER$ в качестве заполнителя для пары "ключ-значение пароля":

MSDeploy.exe
  -whatif
  -source:package="[path]\ContactManager.Mvc.zip"
  -dest:auto,
        computerName="https://stageweb1:8172/MSDeploy.axd?site=DemoSite",
        username="FABRIKAM\stagingdeployer",
        password=$CREDENTIAL_PLACEHOLDER$,
        authtype="Basic",
        includeAcls="False"
  -verb:sync
  -disableLink:AppPoolExtension
  -disableLink:ContentExtension
  -disableLink:CertificateExtension
  -setParamFile:"[path]\ContactManager.Mvc.SetParameters.xml"
  -allowUntrusted

Если вы удовлетворены результатами развертывания "что если", можно удалить флаг whatif для запуска динамического развертывания.

Замечание

Дополнительные сведения о параметрах командной строки для MSDeploy.exeсм. в разделе "Параметры операции веб-развертывания".

Если вы используете файл .deploy.cmd , можно запустить развертывание "что если", включив флаг /t (пробный режим) вместо флага /y ("да" или режима обновления) в команде. Например, чтобы оценить, что произойдет, если вы развернули пакет ContactManager.Mvc.zip, выполнив файл .deploy.cmd , команда должна выглядеть следующим образом:

ContactManager.Mvc.deploy.cmd /t /m:TESTWEB1 /a:NTLM

Если вы удовлетворены результатами развертывания в режиме пробной версии, можно заменить флаг /t флагом /y для запуска динамического развертывания:

ContactManager.Mvc.deploy.cmd /y /m:TESTWEB1 /a:NTLM

Замечание

Дополнительные сведения о параметрах командной строки для файлов .deploy.cmd см. в разделе "Практическое руководство. Установка пакета развертывания с помощью файла deploy.cmd". Если вы запускаете файл .deploy.cmd без указания флагов, в командной строке отобразится список доступных флагов.

Выполнение развертывания "Что если" для баз данных

В этом разделе предполагается, что вы используете служебную программу VSDBCMD для выполнения добавочного развертывания баз данных на основе схем. Этот подход подробно описан в разделе "Развертывание проектов баз данных". Мы рекомендуем ознакомиться с этим разделом, прежде чем применять описанные здесь понятия.

При использовании VSDBCMD в режиме развертывания можно использовать флаг /dd (или /DeployToDatabase) для управления тем, развертывает ли VSDBCMD базу данных или просто создает скрипт развертывания. Если вы развертываете файл .dbschema, поведение будет следующим:

  • Если указать /dd+ или /dd, VSDBCMD создаст скрипт развертывания и развернет базу данных.
  • Если вы укажете параметр /dd- или не укажете этот переключатель, VSDBCMD создаст только скрипт развертывания.

Замечание

Если вы развертываете файл .deploymanifest, а не dbschema-файл, поведение параметра /dd гораздо сложнее. По сути, VSDBCMD будет игнорировать значение параметра /dd , если файл .deploymanifest содержит элемент DeployToDatabase со значением True. Развертывание проектов баз данных описывает это поведение полностью.

Например, чтобы создать скрипт развертывания для базы данных ContactManager без фактического развертывания базы данных, команда VSDBCMD должна выглядеть следующим образом:

vsdbcmd.exe /a:Deploy
            /manifest:"…\ContactManager.Database.deploymanifest"
            /cs:"Data Source=TESTDB1;Integrated Security=true"
            /p:TargetDatabase=ContactManager
            /dd-
            /script:"…\Publish-ContactManager-Db.sql"

VSDBCMD — это разностное средство развертывания базы данных, и такой скрипт развертывания динамически создается, чтобы содержать все команды SQL, необходимые для обновления текущей базы данных, если она существует, до указанной схемы. Просмотр скрипта развертывания — это полезный способ определить влияние развертывания на текущую базу данных и содержащиеся в ней данные. Например, может потребоваться определить следующее:

  • Будут ли удалены существующие таблицы и будут ли они привести к потере данных.
  • Указывает, несет ли порядок операций риск потери данных, например при разбиении или слиянии таблиц.

Если вы удовлетворены скриптом развертывания, вы можете повторить VSDBCMD с флагом /dd+ , чтобы внести изменения. Кроме того, можно изменить скрипт развертывания в соответствии с вашими требованиями, а затем вручную выполнить его на сервере базы данных.

Интеграция функций "What if" в пользовательские файлы проекта

В более сложных сценариях развертывания необходимо использовать пользовательский файл проекта Microsoft Build Engine (MSBuild), чтобы инкапсулировать логику сборки и развертывания, как описано в разделе "Общие сведения о файле проекта". Например, в примере решения Диспетчера контактов файл Publish.proj :

  • Создает решение.
  • Использует веб-развертывание для упаковки и развертывания приложения ContactManager.Mvc.
  • Использует веб-развертывание для упаковки и развертывания приложения ContactManager.Service.
  • Развертывает базу данных ContactManager .

При интеграции развертывания нескольких веб-пакетов и (или) баз данных в одношаговый процесс можно также выбрать вариант выполнения всего развертывания в режиме "что если".

В файле Publish.proj показано, как это сделать. Сначала необходимо создать свойство для хранения значения what if:

<PropertyGroup>
  <WhatIf Condition=" '$(WhatIf)'=='' ">false</WhatIf>
</PropertyGroup>

В этом случае вы создали свойство WhatIf со значением false по умолчанию. Пользователи могут переопределить это значение, установив для свойства значение true в параметре командной строки, как вы увидите в ближайшее время.

Следующий этап — параметризация любых команд веб-развертывания и VSDBCMD, чтобы флаги отражали значение свойства WhatIf . Например, следующий целевой объект (взятый из файла Publish.proj и упрощен) запускает файл .deploy.cmd для развертывания веб-пакета. По умолчанию команда включает переключатель /Y ("да" или режим обновления). Если параметр WhatIf имеет значение true, он заменяется параметром /T (пробной версией или режимом "что если").

<Target Name="PublishWebPackages" Outputs="%(PublishPackages.Identity)">
  <PropertyGroup>
    <_WhatIfSwitch>/Y</_WhatIfSwitch>
    <_WhatIfSwitch Condition=" '$(WhatIf)'=='true' ">/T</_WhatIfSwitch>
    <_Cmd>%(PublishPackages.FullPath) $(_WhatifSwitch)  
         /M:$(MSDeployComputerName) 
         /U:$(MSDeployUsername) 
         /P:$(MSDeployPassword) 
         /A:$(MSDeployAuth) 
         %(PublishPackages.AdditionalMSDeployParameters)
    </_Cmd>
  </PropertyGroup>
  <Exec Command="$(_Cmd)"/>
</Target>

Аналогичным образом следующий целевой объект использует служебную программу VSDBCMD для развертывания базы данных. По умолчанию параметр /dd не включен. Это означает, что VSDBCMD создаст скрипт развертывания, но не развернет базу данных, другими словами, сценарий "что если". Если свойство WhatIf не установлено в true, добавляется параметр /dd, а VSDBCMD запустит процесс развертывания базы данных.

<Target Name="PublishDbPackages" Outputs="%(DbPublishPackages.Identity)">
  <PropertyGroup>
    <_DbDeployOrScript></_DbDeployOrScript>
    <_DbDeployOrScript Condition=" '$(Whatif)'!='true' ">/dd</_DbDeployOrScript>
    <_Cmd>"$(VsdbCmdExe)" /a:Deploy 
           /cs:"%(DbPublishPackages.DatabaseConnectionString)" 
           /p:TargetDatabase=%(DbPublishPackages.TargetDatabase) 
           /manifest:"%(DbPublishPackages.FullPath)" 
           /script:"$(_CmDbScriptPath)" 
           $(_DbDeployOrScript)
    </_Cmd>
  </PropertyGroup>
  <Exec Command="$(_Cmd)"/>
</Target>

Вы можете использовать тот же подход для параметризации всех соответствующих команд в файле проекта. Если вы хотите запустить развертывание "что если", можно просто указать значение свойства WhatIf из командной строки:

MSBuild.exe Publish.proj /p:WhatIf=true;TargetEnvPropsFile=EnvConfig\Env-Dev.proj

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

Conclusion

В этом разделе описано, как запускать пробные развертывания с помощью Web Deploy, VSDBCMD и MSBuild. Развертывание "что если" позволяет оценить влияние предлагаемого развертывания перед внесением изменений в целевую среду.

Дальнейшее чтение

Дополнительные сведения о синтаксисе командной строки веб-развертывания см. в разделе "Параметры операции веб-развертывания". Инструкции по параметрам командной строки при использовании файла .deploy.cmd см. в статье "Практическое руководство. Установка пакета развертывания с помощью файла deploy.cmd". Для получения информации о синтаксисе командной строки VSDBCMD см. раздел Command-Line Reference for VSDBCMD.EXE (развертывание и импорт схемы).