Поделиться через


Выполнение имитации развертывания

Джейсон Ли

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

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

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

Выполнение развертывания "What If" для веб-пакетов

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

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

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

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

Если вы используете MSDeploy.exe напрямую, можно запустить развертывание what if, добавив в команду флаг –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

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

Примечание

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

Если вы используете файл .deploy.cmd , можно запустить развертывание what if, включив флаг /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+ , чтобы внести изменения. Кроме того, можно изменить скрипт развертывания в соответствии с вашими требованиями, а затем выполнить его вручную на сервере базы данных.

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

В более сложных сценариях развертывания вам потребуется использовать пользовательский файл проекта 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 в параметре командной строки, как вы увидите вскоре.

Следующим этапом является параметризация всех команд Web Deploy и 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>

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

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

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

Заключение

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

Дополнительные материалы

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