Compartir a través de


Realizar una implementación de hipótesis

Por Jason Lee

En este tema se describe cómo realizar implementaciones hipotéticas (o simuladas) mediante la herramienta de implementación web (Web Deploy) de Internet Information Services (IIS) y VSDBCMD. Esto le permite determinar los efectos de la lógica de implementación en un entorno de destino determinado antes de implementar realmente la aplicación.

Este tema forma parte de una serie de tutoriales basados en los requisitos de implementación empresarial de una empresa ficticia denominada Fabrikam, Inc. Esta serie de tutoriales utiliza una solución de muestra (Contact Manager) para representar una aplicación web con un nivel de complejidad realista, que incluye una aplicación ASP.NET MVC 3, un servicio Windows Communication Foundation (WCF) y un proyecto de base de datos.

El método de implementación que constituye el núcleo de estos tutoriales se basa en el enfoque del archivo de proyecto dividido descrito en Comprensión del archivo del proyecto, en el que el proceso de compilación e implementación lo controlan dos archivos de proyecto: uno que contiene las instrucciones de compilación que se aplican a todos los entornos de destino y otro que contiene los ajustes de compilación e implementación específicos del entorno. En tiempo de compilación, el archivo de proyecto específico del entorno se combina en el archivo de proyecto independiente del entorno para formar un conjunto completo de instrucciones de compilación.

Realización de una implementación hipotética para paquetes web

Web Deploy incluye funciones que le permiten realizar implementaciones en modo hipotético (o de prueba). Al implementar artefactos en modo hipotético, Web Deploy genera un archivo de registro como si hubiera realizado la implementación, pero realmente no cambia nada en el servidor de destino. Revisar el archivo de registro puede ayudarle a comprender qué impacto tendrá la implementación en el servidor de destino, en particular:

  • Lo que se agregará.
  • Lo que se actualizará.
  • Lo que se eliminará.

Dado que una implementación hipotética no cambia realmente nada en el servidor de destino, lo que no siempre puede hacer es predecir si una implementación se realizará correctamente.

Como se describe en Implementación de paquetes web, puede implementar paquetes web mediante Web Deploy de dos maneras: mediante la utilidad de línea de comandos MSDeploy.exe directamente o ejecutando el archivo .deploy.cmd que genera el proceso de compilación.

Si usa MSDeploy.exe directamente, puede ejecutar una implementación hipotética agregando la marca –whatif al comando. Por ejemplo, para evaluar lo que sucedería si ha implementado el paquete de ContactManager.Mvc.zip en un entorno de ensayo, el comando MSDeploy debería ser similar al siguiente. Tenga en cuenta que, en el ejemplo siguiente, se usa $CREDENTIAL_PLACEHOLDER$ como marcador de posición para el par clave-valor de contraseña:

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

Cuando esté satisfecho con los resultados de la implementación hipotética, puede quitar la marca–whatif para ejecutar una implementación activa.

Nota:

A fin de obtener más información sobre las opciones de línea de comandos para MSDeploy.exe, vea Configuración de la operación de Web Deploy.

Si usa el archivo .deploy.cmd, puede ejecutar una implementación hipotética incluyendo la marca /t (modo de prueba) en lugar de la marca /y ("sí" o el modo de actualización) en el comando. Por ejemplo, para evaluar lo que sucedería si ha implementado el paquete de ContactManager.Mvc.zip ejecutando el archivo .deploy.cmd, el comando debería ser similar al siguiente:

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

Cuando esté satisfecho con los resultados de la implementación del "modo de prueba", puede reemplazar la marca /t por una marca /y para ejecutar una implementación en directo:

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

Nota:

A fin de obtener más información sobre las opciones de la línea de comandos para archivos .deploy.cmd, vea Procedimientos para instalar un paquete de implementación mediante el archivo deploy.cmd. Si ejecuta el archivo .deploy.cmd sin especificar ninguna marca, el símbolo del sistema mostrará una lista de marcas disponibles.

Realización de una implementación hipotética para bases de datos

En esta sección se supone que usa la utilidad VSDBCMD para realizar la implementación incremental de base de datos basada en esquemas. Este enfoque se describe con más detalle en Implementación de proyectos de base de datos. Se recomienda tener conocimientos sobre este tema antes de aplicar los conceptos descritos aquí.

Cuando se usa VSDBCMD en el modo Implementación, puede usar la marca /dd (o /DeployToDatabase) para controlar si VSDBCMD implementa realmente la base de datos o simplemente genera un script de implementación. Si va a implementar un archivo .dbschema, este es el comportamiento:

  • Si especifica /dd+ o /dd, VSDBCMD generará un script de implementación e implementará la base de datos.
  • Si especifica /dd- u omite el modificador, VSDBCMD solo generará un script de implementación.

Nota:

Si va a implementar un archivo .deploymanifest en lugar de un archivo .dbschema, el comportamiento del modificador /dd es mucho más complicado. Básicamente, VSDBCMD omitirá el valor del modificador /dd si el archivo .deploymanifest incluye un elemento DeployToDatabase con un valor True. La implementación de proyectos de base de datos describe este comportamiento por completo.

Por ejemplo, a fin de generar un script de implementación para la base de datos ContactManager sin implementar la base de datos, el comando VSDBCMD debe ser similar al siguiente:

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 es una herramienta de implementación de base de datos diferencial y, como tal, el script de implementación se genera dinámicamente para contener todos los comandos SQL necesarios a fin de actualizar la base de datos actual, si existe, al esquema especificado. Revisar el script de implementación es una manera útil de determinar qué impacto tendrá la implementación en la base de datos actual y los datos que contiene. Por ejemplo, puede que quiera determinar lo siguiente:

  • Si se quitarán las tablas existentes y si se producirá una pérdida de datos.
  • Si el orden de las operaciones conlleva un riesgo de pérdida de datos como, por ejemplo, si va a dividir o combinar tablas.

Si está satisfecho con el script de implementación, puede repetir VSDBCMD con una marca /dd+ para realizar los cambios. Como alternativa, puede editar el script de implementación para cumplir sus requisitos y, después, ejecutarlo manualmente en el servidor de bases de datos.

Integración de la función hipotética en archivos de proyecto personalizados

En escenarios de implementación más complejos, querrá usar un archivo de proyecto personalizado de Microsoft Build Engine (MSBuild) para encapsular la lógica de compilación e implementación, como se describe en Descripción del archivo de proyecto. Por ejemplo, en la solución de ejemplo de Contact Manager, el archivo Publish.proj:

  • Compila la solución.
  • Usa Web Deploy para empaquetar e implementar la aplicación ContactManager.Mvc.
  • Usa Web Deploy para empaquetar e implementar la aplicación ContactManager.Service.
  • Implementa la base de datos ContactManager.

Al integrar la implementación de varios paquetes web o bases de datos en un proceso de un solo paso de esta manera, también puede que quiera la opción de realizar toda la implementación en un modo hipotético.

El archivo Publish.proj muestra cómo puede hacerlo. En primer lugar, debe crear una propiedad para almacenar el valor hipotético:

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

En este caso, ha creado una propiedad denominada WhatIf con un valor predeterminado de false. Los usuarios pueden invalidar este valor estableciendo la propiedad en true en un parámetro de línea de comandos, como verá en breve.

La siguiente fase consiste en parametrizar los comandos Web Deploy y VSDBCMD para que las marcas reflejen el valor de propiedad WhatIf. Por ejemplo, el siguiente destino (tomado del archivo Publish.proj y simplificado) ejecuta el archivo .deploy.cmd para implementar un paquete web. De manera predeterminada, el comando incluye un modificador /Y ("sí" o modo de actualización). Si WhatIf se establece en true, lo reemplaza un modificador /T (versión de prueba o modo hipotético).

<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>

Del mismo modo, el siguiente destino usa la utilidad VSDBCMD para implementar una base de datos. De manera predeterminada, no se incluye un modificador /dd. Esto significa que VSDBCMD generará un script de implementación, pero no implementará la base de datos, es decir, un escenario hipotético. Si la propiedad WhatIf no está establecida en true, se agrega un modificador /dd y VSDBCMD implementará la base de datos.

<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>

Puede usar el mismo enfoque para parametrizar todos los comandos pertinentes en el archivo de proyecto. Cuando quiera ejecutar una implementación hipotética, basta con proporcionar un valor de propiedad WhatIf desde la línea de comandos:

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

De este modo, puede ejecutar una implementación hipotética para todos los componentes del proyecto en un solo paso.

Conclusión

En este tema se describe cómo ejecutar implementaciones hipotéticas mediante Web Deploy, VSDBCMD y MSBuild. Una implementación hipotética le permite evaluar el impacto de una implementación propuesta antes de realizar cambios en el entorno de destino.

Lecturas adicionales

Para obtener más información sobre la sintaxis de la línea de comandos de Web Deploy, vea Configuración de la operación de Web Deploy. Para obtener instrucciones sobre las opciones de la línea de comandos al usar el archivo .deploy.cmd, vea Procedimientos para instalar un paquete de implementación mediante el archivo deploy.cmd. A fin de obtener instrucciones sobre la sintaxis de la línea de comandos de VSDBCMD, vea Referencia de línea de comandos para VSDBCMD.EXE (implementación e importación de esquemas).