Execução de uma implantação "What If"
por Jason Lee
Este tópico descreve como executar implantações "e se" (ou simuladas) usando a Ferramenta de Implantação da Web dos Serviços de Informações da Internet (IIS) (Implantação da Web) e o VSDBCMD. Isso permite determinar os efeitos da lógica de implantação em um ambiente de destino específico antes de realmente implantar seu aplicativo.
Este tópico faz parte de uma série de tutoriais baseados nos requisitos de implantação corporativa de uma empresa fictícia chamada Fabrikam, Inc. Esta série de tutoriais usa uma solução de exemplo, a solução do Contact Manager, para representar um aplicativo Web com um nível realista de complexidade, incluindo um aplicativo ASP.NET MVC 3, um serviço WCF (Windows Communication Foundation) e um projeto de banco de dados.
O método de implantação no centro desses tutoriais baseia-se na abordagem de arquivo de projeto dividido descrita em Noções básicas sobre o Arquivo de Projeto, na qual o processo de build e implantação é controlado por dois arquivos de projeto, um contendo instruções de build que se aplicam a cada ambiente de destino e outro que contém configurações de build e implantação específicas do ambiente. No momento do build, o arquivo de projeto específico do ambiente é mesclado no arquivo de projeto independente do ambiente para formar um conjunto completo de instruções de build.
Executando uma implantação "What If" para pacotes Web
A Implantação da Web inclui a funcionalidade que permite executar implantações no modo "e se" (ou avaliação). Quando você implanta artefatos no modo "e se", a Implantação da Web gera um arquivo de log como se você tivesse executado a implantação, mas ele não altera nada no servidor de destino. A revisão do arquivo de log pode ajudá-lo a entender o impacto que sua implantação terá no servidor de destino, em particular:
- O que será adicionado.
- O que será atualizado.
- O que será excluído.
Como uma implantação "e se" não altera nada no servidor de destino, o que nem sempre pode fazer é prever se uma implantação terá êxito.
Conforme descrito em Implantando pacotes Web, você pode implantar pacotes web usando a Implantação da Web de duas maneiras, usando o utilitário de linha de comando MSDeploy.exe diretamente ou executando o arquivo .deploy.cmd gerado pelo processo de build.
Se você estiver usando MSDeploy.exe diretamente, poderá executar uma implantação "e se" adicionando o sinalizador –whatif ao seu comando. Por exemplo, para avaliar o que aconteceria se você implantasse o pacote ContactManager.Mvc.zip em um ambiente de preparo, o comando MSDeploy deve ser semelhante ao seguinte. Observe que o exemplo a seguir está usando $CREDENTIAL_PLACEHOLDER$ como um espaço reservado para o par chave-valor de senha:
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
Quando estiver satisfeito com os resultados da implantação do "e se", você poderá remover o sinalizador –whatif para executar uma implantação dinâmica.
Observação
Para obter mais informações sobre opções de linha de comando para MSDeploy.exe, consulte Configurações de operação de implantação da Web.
Se você estiver usando o arquivo .deploy.cmd , poderá executar uma implantação "e se" incluindo o sinalizador /t (modo de avaliação) em vez do sinalizador /y ("sim" ou modo de atualização) em seu comando. Por exemplo, para avaliar o que aconteceria se você implantasse o pacote ContactManager.Mvc.zip executando o arquivo .deploy.cmd , seu comando deve ser semelhante a este:
ContactManager.Mvc.deploy.cmd /t /m:TESTWEB1 /a:NTLM
Quando estiver satisfeito com os resultados da implantação do "modo de avaliação", você poderá substituir o sinalizador /t por um sinalizador /y para executar uma implantação ao vivo:
ContactManager.Mvc.deploy.cmd /y /m:TESTWEB1 /a:NTLM
Observação
Para obter mais informações sobre opções de linha de comando para arquivos .deploy.cmd , consulte Como instalar um pacote de implantação usando o arquivo deploy.cmd. Se você executar o arquivo .deploy.cmd sem especificar nenhum sinalizador, o prompt de comando exibirá uma lista de sinalizadores disponíveis.
Executando uma implantação "What If" para bancos de dados
Esta seção pressupõe que você esteja usando o utilitário VSDBCMD para executar a implantação de banco de dados incremental baseada em esquema. Essa abordagem é descrita mais detalhadamente em Implantando projetos de banco de dados. Recomendamos que você se familiarize com este tópico antes de aplicar os conceitos descritos aqui.
Ao usar o VSDBCMD no modo Implantar , você pode usar o sinalizador /dd (ou /DeployToDatabase) para controlar se o VSDBCMD realmente implanta o banco de dados ou apenas gera um script de implantação. Se você estiver implantando um arquivo .dbschema, esse será o comportamento:
- Se você especificar /dd+ ou /dd, o VSDBCMD gerará um script de implantação e implantará o banco de dados.
- Se você especificar /dd- ou omitir a opção, o VSDBCMD gerará apenas um script de implantação.
Observação
Se você estiver implantando um arquivo .deploymanifest em vez de um arquivo .dbschema, o comportamento da opção /dd será muito mais complicado. Essencialmente, o VSDBCMD ignorará o valor da opção /dd se o arquivo .deploymanifest incluir um elemento DeployToDatabase com um valor True. A implantação de projetos de banco de dados descreve esse comportamento na íntegra.
Por exemplo, para gerar um script de implantação para o banco de dados ContactManager sem realmente implantar o banco de dados, o comando VSDBCMD deve ser semelhante a este:
vsdbcmd.exe /a:Deploy
/manifest:"…\ContactManager.Database.deploymanifest"
/cs:"Data Source=TESTDB1;Integrated Security=true"
/p:TargetDatabase=ContactManager
/dd-
/script:"…\Publish-ContactManager-Db.sql"
O VSDBCMD é uma ferramenta de implantação de banco de dados diferencial e, como tal, o script de implantação é gerado dinamicamente para conter todos os comandos SQL necessários para atualizar o banco de dados atual, se houver, para o esquema especificado. A revisão do script de implantação é uma maneira útil de determinar o impacto que sua implantação terá no banco de dados atual e nos dados que ele contém. Por exemplo, talvez você queira determinar:
- Se alguma tabela existente será removida e se isso resultará em perda de dados.
- Se a ordem das operações traz um risco de perda de dados, por exemplo, se você estiver dividindo ou mesclando tabelas.
Se você estiver satisfeito com o script de implantação, poderá repetir o VSDBCMD com um sinalizador /dd+ para fazer as alterações. Como alternativa, você pode editar o script de implantação para atender aos seus requisitos e executá-lo manualmente no servidor de banco de dados.
Integrando a funcionalidade "What If" em arquivos de projeto personalizados
Em cenários de implantação mais complexos, você desejará usar um arquivo de projeto de Microsoft Build Engine personalizado (MSBuild) para encapsular sua lógica de build e implantação, conforme descrito em Noções básicas sobre o arquivo de projeto. Por exemplo, na solução de exemplo do Contact Manager , o arquivo Publish.proj :
- Cria a solução.
- Usa a Implantação da Web para empacotar e implantar o aplicativo ContactManager.Mvc.
- Usa a Implantação da Web para empacotar e implantar o aplicativo ContactManager.Service.
- Implanta o banco de dados ContactManager .
Ao integrar a implantação de vários pacotes Web e/ou bancos de dados em um processo de etapa única dessa maneira, você também pode querer a opção de executar toda a implantação em um modo "e se".
O arquivo Publish.proj demonstra como você pode fazer isso. Primeiro, você precisa criar uma propriedade para armazenar o valor "e se":
<PropertyGroup>
<WhatIf Condition=" '$(WhatIf)'=='' ">false</WhatIf>
</PropertyGroup>
Nesse caso, você criou uma propriedade chamada WhatIf com um valor padrão de false. Os usuários podem substituir esse valor definindo a propriedade como true em um parâmetro de linha de comando, como você verá em breve.
O próximo estágio é parametrizar todos os comandos De implantação da Web e VSDBCMD para que os sinalizadores reflitam o valor da propriedade WhatIf . Por exemplo, o próximo destino (obtido do arquivo Publish.proj e simplificado) executa o arquivo .deploy.cmd para implantar um pacote da Web. Por padrão, o comando inclui uma opção /Y ("sim" ou modo de atualização). Se WhatIf for definido como true, isso será substituído por uma opção /T (modo de avaliação ou "e se").
<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>
Da mesma forma, o próximo destino usa o utilitário VSDBCMD para implantar um banco de dados. Por padrão, uma opção /dd não está incluída. Isso significa que o VSDBCMD gerará um script de implantação, mas não implantará o banco de dados, em outras palavras, um cenário de "e se". Se a propriedade WhatIf não estiver definida como true, um comutador /dd será adicionado e o VSDBCMD implantará o banco de dados.
<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>
Você pode usar a mesma abordagem para parametrizar todos os comandos relevantes no arquivo de projeto. Quando quiser executar uma implantação "e se", você pode simplesmente fornecer um valor de propriedade WhatIf da linha de comando:
MSBuild.exe Publish.proj /p:WhatIf=true;TargetEnvPropsFile=EnvConfig\Env-Dev.proj
Dessa forma, você pode executar uma implantação "e se" para todos os componentes do projeto em uma única etapa.
Conclusão
Este tópico descreveu como executar implantações "e se" usando Implantação da Web, VSDBCMD e MSBuild. Uma implantação "e se" permite avaliar o impacto de uma implantação proposta antes de realmente fazer alterações no ambiente de destino.
Leitura Adicional
Para obter mais informações sobre a sintaxe de linha de comando Implantar na Web, consulte Configurações da Operação de Implantação da Web. Para obter diretrizes sobre opções de linha de comando ao usar o arquivo .deploy.cmd , consulte Como instalar um pacote de implantação usando o arquivo deploy.cmd. Para obter diretrizes sobre a sintaxe de linha de comando VSDBCMD, consulte Referência de linha de comando para VSDBCMD.EXE (Implantação e Importação de Esquema).