Implementar una compilación concreta

por Jason Lee

En este tema se describe cómo implementar paquetes web y scripts de base de datos desde una compilación anterior específica en un nuevo destino, como un entorno de ensayo o producció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. En esta serie de tutoriales se utiliza una solución de ejemplo (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 Descripción del archivo del proyecto, en el que el proceso de compilación e implementación lo controlan dos archivos del proyecto: uno que contiene las instrucciones de compilación que se aplican a todos los entornos de destino y otro que contiene los valores de compilación e implementación específicos del entorno. En tiempo de compilación, el archivo del proyecto específico del entorno se combina en el archivo del proyecto independiente del entorno para formar un conjunto completo de instrucciones de compilación.

Resumen de las tareas

Hasta ahora, los temas de este conjunto de tutoriales se han centrado en cómo compilar, empaquetar e implementar aplicaciones web y bases de datos como parte de un proceso de un solo paso o automatizado. Pero en algunos escenarios comunes, querrá seleccionar los recursos que implemente en una lista de compilaciones de una carpeta desplegable. En otras palabras, es posible que la compilación más reciente no sea la que quiere implementar.

Considere el escenario de integración continua (CI) descrito en el tema anterior, Creación de una definición de compilación que admita la implementación. Ha creado una definición de compilación en Team Foundation Server (TFS) 2010. Cada vez que un desarrollador confirma el código en TFS, Team Build compilará el código, creará paquetes web y scripts de base de datos como parte del proceso de compilación, ejecutará las pruebas unitarias e implementará los recursos en un entorno de prueba. En función de la directiva de retención que haya configurado al crear la definición de compilación, TFS conservará un número determinado de compilaciones anteriores.

Depending on the retention policy you configured when you created the build definition, T F S will retain a certain number of previous builds.=======

Ahora, imagine que ha realizado pruebas de comprobación y validación en una de estas compilaciones en el entorno de prueba y ya puede implementar la aplicación en un entorno de ensayo. Mientras tanto, es posible que los desarrolladores hayan insertado en el repositorio el nuevo código. No quiere recompilar la solución e implementarla en el entorno de ensayo y no quiere implementar la compilación más reciente en el entorno de ensayo. En su lugar, quiere implementar la compilación específica que ha comprobado y validado en los servidores de prueba.

Para ello, debe indicar a Microsoft Build Engine (MSBuild) dónde encontrar los paquetes web y los scripts de base de datos generados por una compilación específica.

Invalidación de la propiedad OutputRoot

En la solución de ejemplo, el archivo Publish.proj declara una propiedad denominada OutputRoot. Como el nombre sugiere, es la carpeta raíz que contiene todo lo que genera el proceso de compilación. En el archivo Publish.proj, puede ver que la propiedad OutputRoot hace referencia a la ubicación raíz de todos los recursos de implementación.

Nota:

OutputRoot es un nombre de propiedad que se usa habitualmente. Los archivos del proyecto de Visual C# y Visual Basic también declaran esta propiedad para almacenar la ubicación raíz de todas las salidas de compilación.

<PropertyGroup>
  <!--This is where the .deploymanifest file will be written to during a build-->    
  <_DbDeployManifestPath>
    $(OutputRoot)ContactManager.Database.deploymanifest
  </_DbDeployManifestPath>    
  
  <!-- The folder where the .zip and .cmd file will be located for 
                ContactManager.Mvc Web project -->
  <_ContactManagerDest>
    $(OutputRoot)_PublishedWebsites\ContactManager.Mvc_Package\
  </_ContactManagerDest>
  
  <!-- The folder where the .zip and .cmd file will be located for 
                ContactManager.Service Web project -->
   <_ContactManagerSvcDest>
    $(OutputRoot)_PublishedWebsites\ContactManager.Service_Package\
  </_ContactManagerSvcDest>
  
  <!-- ... -->
</PropertyGroup>

Si quiere que el archivo del proyecto implemente paquetes web y scripts de base de datos desde otra ubicación, como las salidas de una compilación de TFS anterior, simplemente tiene que invalidar la propiedad OutputRoot. Debe establecer el valor de propiedad en la carpeta de compilación correspondiente en el servidor de Team Build. Si ejecuta MSBuild desde la línea de comandos, podría especificar un valor para OutputRoot como argumento de línea de comandos:

msbuild.exe Publish.proj /p:TargetEnvPropsFile=EnvConfig\Env-Dev.proj 
  /p:OutputRoot=\\TFSBUILD\Drops\DeployToTest\DeployToTest_20120228.3\

Pero en la práctica, también querrá omitir el destino de compilación; no tiene sentido compilar la solución si no tiene previsto usar las salidas de compilación. Para ello, podría especificar los destinos que quiera ejecutar desde la línea de comandos:

msbuild.exe Publish.proj /p:TargetEnvPropsFile=EnvConfig\Env-Dev.proj 
  /p:OutputRoot=\\TFSBUILD\Drops\DeployToTest\DeployToTest_20120228.3\
  /target:GatherPackagesForPublishing;PublishDBPackages;PublishWebPackages

Pero en la mayoría de los casos, querrá compilar la lógica de implementación en una definición de compilación de TFS. Esto permite a los usuarios con el permiso Compilaciones en cola desencadenar la implementación desde cualquier instalación de Visual Studio con una conexión al servidor TFS.

Creación de una definición de compilación para implementar compilaciones específicas

En el procedimiento siguiente se describe cómo crear una definición de compilación que permita a los usuarios desencadenar implementaciones en un entorno de ensayo con un solo comando.

En este caso, no quiere que la definición de compilación compile nada, solo que ejecute la lógica de implementación en el archivo del proyecto personalizado. El archivo Publish.proj incluye lógica condicional que omite el destino Build si el archivo se ejecuta en Team Build. Para ello, evalúa la propiedad integrada BuildingInTeamBuild, que se establece automáticamente en true si ejecuta el archivo del proyecto en Team Build. Como resultado, puede omitir el proceso de compilación y simplemente ejecutar el archivo del proyecto para implementar una compilación existente.

Para crear una definición de compilación para desencadenar la implementación manualmente

  1. En Visual Studio 2010, en la ventana Team Explorer, expanda el proyecto de equipo, haga clic con el botón derecho en Compilaciones y, después, haga clic en Nueva definición de compilación.

    In Visual Studio 2010, in the Team Explorer window, expand your team project node, right-click Builds, and then click New Build Definition

  2. En la pestañaGeneral, asigne un nombre a la definición de compilación (por ejemplo, DeployToStaging) y una descripción opcional.

  3. En la pestaña Desencadenador, seleccione Manual – las inserciones en el repositorio no desencadenan una nueva compilación.

  4. En la pestaña Valores predeterminados de compilación, en el cuadro Copiar salida de compilación en la siguiente carpeta desplegable, escriba la ruta de Convención de nomenclatura universal (UNC) de la carpeta desplegable (por ejemplo, \TFSBUILD\Drops).

    On the Build Defaults tab, in the Copy build output to the following drop folder box, type the Universal Naming Convention (U N C) path of your drop folder (for example, \TFSBUILD\Drops).

  5. En la pestaña Proceso, en la lista desplegable Archivo del proceso de compilación, deje DefaultTemplate.xaml seleccionado. Es una de las plantillas de proceso de compilación predeterminadas que se agregan a todos los nuevos proyectos de equipo.

  6. En la tabla Parámetros del proceso de compilación, haga clic en la fila Elementos para compilar y después en el botón de puntos suspensivos.

    In the Build process parameters table, click in the Items to Build row, and then click the ellipsis button.

  7. En el cuadro de diálogo Elementos para compilar, haga clic en Aceptar.

  8. En la lista desplegable Elementos de tipo, seleccione Archivos del proyecto de MSBuild.

  9. Vaya a la ubicación del archivo del proyecto personalizado con el que controla el proceso de implementación, seleccione el archivo y, después, haga clic en Aceptar.

    Browse to the location of the custom project file with which you control the deployment process, select the file, and then click OK.

  10. En el cuadro de diálogo Elementos para compilar, haga clic en Aceptar.

  11. En la tabla Parámetros del proceso de compilación, expanda la sección Opciones avanzadas.

  12. En la fila Argumentos de MSBuild, especifique la ubicación del archivo del proyecto específico del entorno y agregue un marcador de posición para la ubicación de la carpeta de compilación:

    /p:TargetEnvPropsFile=EnvConfig\Env-Stage.proj;
    OutputRoot=PLACEHOLDER
    

    In the MSBuild Arguments row, specify the location of your environment-specific project file and add a placeholder for the location of your build folder.

    Nota:

    Tendrá que invalidar el valor OutputRoot cada vez que ponga en cola una compilación. Esto se describe en el procedimiento siguiente.

  13. Haga clic en Save(Guardar).

Al desencadenar una compilación, debe actualizar la propiedad OutputRoot para que apunte a la compilación que quiera implementar.

Para implementar una compilación específica a partir de una definición de compilación

  1. En la ventana Team Explorer, haga clic con el botón derecho en la definición de compilación y, después, haga clic en Poner nueva compilación en cola.

    In the Team Explorer window, right-click the build definition, and then click Queue New Build.

  2. En el cuadro de diálogo Compilación en cola, en la pestaña Parámetros, expanda la sección Avanzadas.

  3. En la fila Argumentos de MSBuild, reemplace el valor de la propiedad OutputRoot por la ubicación de la carpeta de compilación. Por ejemplo:

    /p:TargetEnvPropsFile=EnvConfig\Env-Stage.proj;
       OutputRoot=\\TFSBUILD\Drops\DeployToTest\DeployToTest_20120228.3\
    

    In the MSBuild Arguments row, replace the value of the OutputRoot property with the location of your build folder.

    Nota:

    Asegúrese de incluir una barra diagonal al final de la ruta de acceso a la carpeta de compilación.

  4. Haga clic en Poner en cola.

Al poner en cola la compilación, el archivo del proyecto implementará los scripts de base de datos y los paquetes web desde la carpeta de colocación de compilación que ha especificado en la propiedad OutputRoot.

Conclusión

En este tema se ha descrito cómo publicar recursos de implementación, como paquetes web y scripts de base de datos, desde una compilación anterior específica mediante el modelo de implementación de archivos del proyecto divididos. Se ha explicado cómo invalidar la propiedad OutputRoot y cómo incorporar la lógica de implementación en una definición de compilación de TFS.

Lecturas adicionales

Para más información sobre cómo crear definiciones de compilación, vea Creación una definición de compilación básica y Definición del proceso de compilación. Para obtener más instrucciones sobre cómo poner en cola las compilaciones, vea Poner una compilación en cola.