Implementar la integración continua mediante Azure DevOps

En este capítulo, vas a aprender lo siguiente:

  • Integración continua: crear una definición de compilación
  • Integración continua: poner en cola una compilación y desencadenarla manualmente
  • Configurar y desencadenar una compilación automatizada
  • Integración continua: ejecutar casos de pruebas unitarias en la canalización
  • Crear una definición de versión
  • Desencadenar la versión automáticamente

Introducción

Como profesional de software, es posible que ya conozcas las distintas metodologías de desarrollo de software que se utilizan. Con independencia de la metodología, habrá distintos entornos (por ejemplo, desarrollo, ensayo y producción), en los que  el ciclo de vida de la aplicación debe preceder a estas fases críticas relacionadas con el desarrollo:

  1. Desarrollar en base a los requisitos
  2. Compilar la aplicación y corregir los errores
  3. Implementar/publicar el paquete en un entorno (desarrollo/ensayo/ producción)
  4. Probar según los requisitos
  5. Promover el paso al siguiente entorno (de desarrollo a ensayo y de ensayo a producción)

Ten en cuenta que, para facilitar la tarea, las fases iniciales, como la recopilación de requisitos, la planificación, el diseño y la arquitectura, se han excluido. De esta forma, se da mayor énfasis a las fases relevantes para este capítulo.

Para cada cambio que debas aplicar al software, es necesario compilar e implementar la aplicación en distintos entornos. Puede darse el caso de que distintos equipos sean responsables de publicar las compilaciones en entornos diferentes. Dado que intervienen distintos entornos y equipos, el cálculo de la cantidad de tiempo necesario para ejecutar las compilaciones e implementarlas en entornos diferentes dependería más de los procesos que utilicen los equipos.

Con el fin de agilizar y automatizar los pasos mencionados anteriormente, en este capítulo analizaremos algunas de las técnicas populares del sector para publicar el software rápidamente y con una infraestructura mínima.

En los capítulos anteriores, la mayoría de las recetas nos han proporcionado una solución para un problema empresarial concreto. Sin embargo, en este capítulo intentaremos proporcionar una solución para la integración y la entrega continuas de la aplicación fundamental para el negocio.

El equipo de Azure DevOps añade continuamente nuevas funciones a Azure DevOps en https://dev.azure.com (anteriormente denominado VSTS en https://www.visualstudio.com) y actualiza la interfaz de usuario. Es posible que las capturas de pantalla que se muestran en este capítulo no coincidan con las pantallas de https://dev.azure.com cuando leas esto.

Requisitos previos

Si no lo has hecho previamente, crea lo siguiente:

  1. Crea la organización de Azure DevOps que quieras en https://dev.azure. com y un nuevo proyecto en la cuenta. Al crear el proyecto, puedes elegir Git o Control de versiones de Team Foundation como repositorio con control de versiones. He utilizado Control de versiones de Team Foundation para mi proyecto:
  • Configura el proyecto de Visual Studio que has desarrollado en el capítulo 4, Comprender la experiencia de desarrollador integrada de Visual Studio Tools para Azure Functions, en Azure DevOps. Puedes consultar el enlace https://www. visualstudio.com/en-us/docs/setup-admin/team-services/set-up-vs para seguir el procedimiento paso a paso de creación de una cuenta y un proyecto nuevos mediante Azure DevOps.

Voy a aplicar pequeños cambios a los mensajes de respuesta integrados en el código para que muestren distinta información. Asegúrate de modificar las pruebas unitarias en consecuencia. De lo contrario, se producirá un error en la compilación.

Integración continua: crear una definición de compilación

La definición de compilación es un conjunto de tareas necesarias para configurar una compilación automatizada del software. En esta receta, seguiremos estos pasos:

  • Crear la plantilla de definición de compilación
  • Proporcionar toda la información de entrada necesaria para los distintos pasos de creación de la definición de compilación

Preparación

Establece los siguientes requisitos previos:

  1. Crear una cuenta de Azure DevOps.
  2. Para crear un proyecto, selecciona Control de versiones de Team

Foundation, tal como se muestra en la siguiente captura de pantalla:

Cómo hacerlo…

Sigue estos pasos:

  1. Ve a la pestaña Canalizaciones de la cuenta de Azure DevOps, haz clic en Versiones y selecciona Nueva canalización para iniciar el proceso de creación de una nueva definición de compilación, tal como se muestra en la siguiente captura de pantalla:
  • En el próximo paso, haz clic en el enlace de uso del diseñador visual, tal como se muestra en la siguiente captura de pantalla:
  • Accederás a la pantalla Seleccione el repositorio en la que podrás seleccionar el repositorio. Para este ejemplo, he obtenido el código en TFVC. Como se muestra a continuación, selecciona TFVC y haz clic en Continuar. Asegúrate de elegir tu proyecto. En mi caso, AzureServerlessCookBook:
  • Llegarás al paso Seleccionar una plantilla, en el que podrás seleccionar la plantilla necesaria para tu aplicación. Para esta receta seleccionaremos Función de C#, tal como se muestra en la siguiente captura de pantalla. Haz clic en el botón Aplicar:
  • El paso de creación de compilación consta de un conjunto de pasos que se utilizan para definir la plantilla de compilación. Cada paso tiene determinados atributos que debemos revisar y proporcionar información de entrada para todos los campos necesarios en base a nuestros requisitos. Para empezar, vamos a proporcionar un nombre significativo en el paso de la canalización y a garantizar la selección de Hosted VS2017 en el desplegable Grupo de agentes, tal como se muestra en la siguiente captura de pantalla:
  • En el paso Obtener orígenes, asegúrate de seleccionar lo siguiente:
    • Selecciona el sistema de control de versiones que desees.
    • Elige el repositorio que desees compilar. En mi ejemplo, he elegido AzureServerlessCookBook:
  • Deja las opciones predeterminadas en los siguientes pasos:

°     Usar NuGet y Restaurar NuGet: este espacio es necesario para descargar e instalar todos los paquetes que requiere la aplicación.

°     Compilar solución: este paso utiliza la compilación de MS y tiene todos los comandos predefinidos para crear la compilación.

°     Ensamblados de prueba: resultaría muy útil si tuviésemos pruebas automatizadas. Vamos a aplicar cambios a este paso en la receta Integración continua: ejecutar casos de pruebas unitarias en la canalización más adelante en este capítulo.

°     Archivos de almacenamiento: este paso nos permite archivar las carpetas en el formato necesario

°     Ruta de publicación de símbolos: estos símbolos resultan útiles si quieres depurar la aplicación hospedada en el agente de VM.

°     Publicar artefacto: en este paso se relaciona la configuración con los artefactos y la ruta de almacenamiento del artefacto (paquete de compilación).

8. Cuando revises todos los valores de todos los campos, haz clic en Guardar, tal como se muestra en la siguiente captura de pantalla. Vuelve a hacer clic en Guardar en el cuadro emergente Guardar definición de compilación:

Cómo funciona…

La definición de compilación es un esquema de las tareas necesarias para compilar una aplicación de software. En esta receta, hemos utilizado una plantilla predeterminada para crear la definición de compilación. También podemos elegir una plantilla en blanco y crear la definición mediante la selección de las tareas disponibles en Azure DevOps.

Cuando ejecutes la definición de compilación (de forma manual o automática, lo que se explicará en las recetas posteriores), las distintas tareas se ejecutarán en el orden en el que las hayas configurado. También puedes reorganizar los pasos: arrástralos y suéltalos en la sección de la canalización.

El proceso de compilación comienza con la obtención del código fuente del repositorio elegido y la descarga de los paquetes NuGet necesarios y, a continuación, inicia el proceso de compilación del paquete. Cuando el proceso se haya completado, creará un paquete y lo almacenará en una carpeta configurada para el directorio build.artifactstagingdirectory (consulta el campo Ruta de acceso para publicar de la tarea Publicar artefacto).

Obtén más información sobre los distintos tipos de variables de la pestaña Variables que se muestran aquí:

Y eso no es todo…

  • Azure DevOps proporciona muchas tareas. Para elegir una nueva tarea para la plantilla, haz clic en el botón Agregar tarea (+), tal como se muestra en la siguiente captura de pantalla:
  • Si no encuentras una tarea que se ajuste a tus requisitos, busca la adecuada en el Marketplace. Para ello, haz clic en el botón Marketplace que aparece en la captura de pantalla previa.
  • La función C# tiene el conjunto adecuado de tareas necesarias para configurar la definición de compilación para Azure Functions.

Integración continua: poner en cola una compilación y desencadenarla manualmente

En la receta anterior has aprendido a crear y configurar la definición de compilación. En esta aprenderás a desencadenar la compilación manualmente y comprenderás el proceso de compilación de la aplicación.

Preparación

Antes de comenzar, asegúrate de lo siguiente:

  • Has configurado la definición de compilación tal como se mencionaba en la receta anterior.
  • Todo el código fuente se ha registrado en el proyecto de Azure DevOps.

Cómo hacerlo…

Sigue estos pasos:

  1. Dirígete a la definición de compilación denominada

AzureServerlessCookBook-C# Function-CI y haz clic en el botón Cola disponible en el lado derecho, tal como se muestra en la siguiente captura de pantalla:

  • En el cuadro emergente Compilación en cola para

AzureServerlessCookBook-C# Function-CI, asegúrate de seleccionar la opción Hosted VS2017 en el desplegable Grupo de agentes si utilizas Visual Studio 2017 y haz clic en el botón Cola, tal como se muestra en la siguiente captura de pantalla:

  • En unos minutos, la compilación se pondrá en la cola y aparecerá el mensaje, tal como se muestra en la siguiente captura de pantalla:
  • Al hacer clic en Id. de compilación (en nuestro caso, 20181025.1) comenzará el proceso. Esperará unos segundos a que un agente disponible lo inicie.
  • Después de unos instantes, se iniciará el proceso de compilación. Poco después, la compilación se completará y podrás revisar los pasos de la compilación en los registros, tal como se muestra a continuación. Por ahora, haz caso omiso de la advertencia que aparece en Ensamblados de prueba. Resolveremos este problema en la receta Integración continua: ejecutar casos de pruebas unitarias en la canalización más adelante en este capítulo:
  • Si deseas ver el resultado de la compilación, haz clic en el botón Artefactos destacado en la siguiente captura de pantalla. Para descargar los archivos, haz clic en el botón Descargar que se muestra a continuación:

Configurar y desencadenar una compilación automatizada

Para la mayoría de las aplicaciones, es posible que no tenga sentido realizar compilaciones manuales en Azure DevOps. Lo tendría si pudiésemos configurar la integración continua (CI) mediante la automatización del proceso de activación de la compilación para cada inserción/confirmación de los desarrolladores.

En esta receta, aprenderás a configurar la integración en Azure DevOps para el proyecto del equipo. Además, descubrirás cómo desencadenar la compilación automatizada mediante la aplicación de cambios al código de la función de Azure de desencadenador de HTTP que hemos creado en el capítulo 4, Comprender la experiencia de desarrollador integrada de Visual Studio Tools para Azure Functions.

Cómo hacerlo…

Sigue estos pasos:

  1. Dirígete a la definición de compilación AzureServerlessCookBook-C# Function-CI. Para ello, haz clic en el botón Editar, tal como se muestra en la siguiente captura de pantalla:
  • En la definición de compilación, haz clic en el menú Desencadenadores que se muestra a continuación:
  • Ahora, haz clic en la casilla de verificación Habilitar la integración continua para activar el desencadenador de compilación automatizado.
  • Para guardar los cambios, haz clic en la flecha junto al botón Guardar y cola y en el botón Guardar disponible en el menú desplegable, que se muestra en la siguiente captura de pantalla:
  • Vamos a dirigirnos al proyecto de función de Azure en Visual Studio. Aplica un pequeño cambio a la última línea del código fuente de la función Run que se muestra a continuación. He sustituido la palabra hola por Prueba de desencadenador de compilación automatizada:

return name != null ? (ActionResult)new OkObjectResult($»Automated

Build Trigger test by, { name}»)

          : new BadRequestObjectResult(«Please pass a name on the query string or in the request body»);

  • Vamos a registrar el código y a confirmar los cambios en el control de código fuente. Tal como se muestra aquí, se generará un nuevo Id. de conjunto de cambios. En este caso, es Changeset 32:
  • De forma inmediata, regresa a la definición de compilación de Azure DevOps para comprobar que se ha desencadenado automáticamente una nueva compilación y que está en curso, tal como se muestra en la siguiente captura de pantalla:

Cómo funciona…

A continuación, se indican los pasos que hemos seguido en esta receta:

  1. Hemos activado el desencadenador de compilación automático para la definición de compilación.
  2. Hemos aplicado un cambio al código base y lo hemos registrado en TFVC.
  3. De forma automática, se ha desencadenado una nueva compilación en Azure DevOps (se compila inmediatamente después de confirmar el código en TFVC).

Y eso no es todo…

Si quieres que los desarrolladores solo inserten el código después de una compilación correcta, habilita la inserción en el repositorio validada. Para ello, edita la definición de compilación, dirígete a la pestaña Desencadenadores y a la opción Habilitar la inserción en el repositorio validada, tal como se muestra en la siguiente captura de pantalla:

Regresa a Visual Studio y aplica algunos cambios al código. Si intentas insertar el código sin compilar la aplicación en Visual Studio, aparecerá una alerta, tal como se muestra a continuación:

Haz clic en Cambios de compilación en el paso anterior para iniciar la compilación en Visual Studio. En cuanto se complete la compilación en Visual Studio, el código se insertará en Azure DevOps y, a continuación, se desencadenará automáticamente una nueva compilación, tal como se muestra a continuación:

Integración continua: ejecutar casos de pruebas unitarias en la canalización

Uno de los pasos más importantes de cualquier metodología de desarrollo de software es escribir pruebas unitarias automatizadas que validen la precisión de nuestro código. También es importante que realicemos estas pruebas unitarias cada vez que el desarrollador publique código nuevo, para proporcionar cobertura de código de prueba.

En esta receta, aprenderemos a incorporar el proceso de compilación de las pruebas unitarias que hemos desarrollado en la receta Desarrollar pruebas unitarias para los desencadenadores de HTTP de Azure Functions del capítulo 6, Explorar las herramientas de pruebas para la validación de Azure Functions.

Cómo hacerlo

Sigue estos pasos:

  1. En la receta Integración continua: crear una definición de compilación de este capítulo, hemos utilizado una plantilla de compilación que tenía los pasos Compilar solución y Ensamblados de prueba de la compilación, tal como se muestra en la siguiente captura de pantalla:
  • Haz clic en Ensamblados de prueba, tal como se muestra en la captura de pantalla anterior. Sustituye la configuración predeterminada por la que se proporciona aquí en el campo Archivos de prueba:

**\$(BuildConfiguration)\**\*test*.dll

!**\obj\**

!**\*TestAdapter.dll

  • Los ajustes anteriores permiten al Ejecutor de pruebas hacer lo siguiente:

°     Buscar los archivos .dll con la palabra Test en el nombre de la carpeta de release en cualquier ubicación de los artefactos. Quizá te preguntes de dónde ha salido la carpeta release. Se trata del valor de la variable $(BuildConfiguration) de la sección Variables que se muestra en la siguiente captura de pantalla:

°     Haz caso omiso de todos los archivos .dll de la carpeta obj, ya que nuestro objetivo es trabajar solo en los archivos .dll ubicados en la carpeta release.

  • Eso es todo. Ahora vamos a poner la compilación en cola. Para ello, haremos clic en el botón Cola después de guardar los cambios. Transcurridos unos minutos, la canalización de compilación se superará sin advertencias, tal como se muestra en la siguiente captura de pantalla:
  • A continuación, se muestra el resumen de los casos de prueba. Puedes ver el gráfico que muestra el porcentaje de casos de prueba que se han superado y los que han fallado:

Y eso no es todo…

Si has respetado las convenciones de nomenclatura que se indican en las instrucciones, no tendrás problemas con la receta. Sin embargo, si has utilizado un nombre diferente para el proyecto unitario y no has incluido la palabra test en el nombre del proyecto (el mismo nombre del archivo .dll generado), cambia el formato en el siguiente ajuste:

**\$(BuildConfiguration)\**\*whateverwordyouhaveinthenameofthedllfi le*.dll

En la receta has utilizado *, ** y !, que se denominan patrones de coincidencia de archivos. Puedes obtener más información sobre los patrones de coincidencia de archivos en https://docs.microsoft.com/en-us/azure/devops/pipelines/ tasks/file-matching-patterns?view=vsts.

Crear una definición de versión

Ya sabemos cómo crear una definición de compilación y desencadenar una compilación automatizada en las canalizaciones de Azure DevOps. El siguiente paso es publicar o implementar el paquete en un entorno en el que los que participan en el proyecto puedan revisarlo y proporcionar comentarios. Para ello, primero tenemos que crear una definición de versión de la misma forma que creamos las definiciones de las compilaciones.

Preparación

He utilizado el nuevo editor de definiciones de versión para visualizar las canalizaciones de implementación. El editor de definiciones de versión aún está en estado preview. Al leer este documento, si sigue en versión preview, actívalo. Para ello, haz clic en la imagen de perfil y, a continuación, en el enlace Características de versión preview, tal como se muestra en la siguiente captura de pantalla:

A continuación, podrás habilitar el nuevo editor de definiciones de versión, tal como se muestra en la siguiente captura de pantalla:

Vamos a comenzar la creación de una nueva definición de versión.

Cómo hacerlo…

Sigue estos pasos:

  1. Ve a la pestaña Versiones, tal como se muestra en la siguiente captura de pantalla. Haz clic en el enlace Nueva canalización:
  • El siguiente paso es seleccionar una plantilla de definición de versión. En el cuadro emergente Seleccionar una plantilla, elige Implementación de Azure App Service y haz clic en el botón Aplicar, tal como se muestra en la siguiente captura de pantalla. Inmediatamente después de hacer clic en el botón Aplicar, se mostrará el cuadro emergente del nuevo entorno (fase). Por ahora, cierra el cuadro emergente Entorno:
  • Haz clic en el botón Agregar disponible en el cuadro Artefactos para añadir un nuevo artefacto, tal como se muestra en la siguiente captura de pantalla:
  • En el cuadro emergente Agregar un artefacto, asegúrate de elegir lo siguiente:
  • Tipo de origen: Compilación
  • Proyecto: el proyecto de equipo al que está vinculado el código fuente
  • Origen (definición de compilación): el nombre de la definición de compilación en la que se crean las compilaciones
  • Versión predeterminada: Más reciente
  • Después de revisar todos los valores de la página, haz clic en el botón Agregar para añadir el artefacto.
  • Cuando se añada el artefacto, el siguiente paso será configurar las fases en las que el paquete se debe publicar. Haz clic en el enlace 1 fase, 1 tarea que se muestra en la siguiente captura de pantalla. Además, cambia el nombre de la definición de versión por release-def-stg:
  • Se te dirigirá a la pestaña Tareas que se muestra a continuación. Proporciona un nombre descriptivo en el campo Nombre de fase. He utilizado el nombre Entorno de ensayo para este ejemplo. A continuación, selecciona la suscripción de Azure en la que te gustaría implementar la función de Azure. Haz clic en el botón Autorizar para otorgar permisos, tal como se muestra a  continuación:
  • Tras autorizar la suscripción, asegúrate de indicar que el Tipo de aplicación es Aplicación de función. A continuación, elige el nombre de la aplicación de función en el Nombre de App Service para el que te gustaría implementar el paquete, tal como se muestra a continuación:
  • Haz clic en el botón Guardar para guardar los cambios. Ahora vamos a utilizar la definición de versión para intentar crear una nueva versión mediante el clic en Crear versión, tal como se muestra en la siguiente captura de pantalla:
  1. A continuación, accederás al cuadro emergente Crear nueva versión donde podrás configurar la definición de compilación que se debe utilizar. Como solo tenemos una, solo podemos ver una definición de compilación. También debes elegir la versión correcta de la compilación, tal como se muestra a continuación. Cuando la revises, haz clic en el botón Crear para poner la versión en cola:
  1. Al hacer clic en el botón Crear del paso anterior, pasarás al paso siguiente. Haz clic en el botón Implementar fase, tal como se muestra a continuación, para iniciar el proceso de implementación de la versión:
  1. Ahora se te solicitará que revises los artefactos asociados. Cuando lo hayas hecho, haz clic en el botón Implementar que se muestra a continuación:
  1. El proceso comenzará inmediatamente y mostrará En curso para indicar el progreso de la versión, tal como se indica a continuación:
  1. Haz clic en los enlaces En curso que se muestran en la captura de pantalla anterior para revisar el progreso. Como se muestra a continuación, el proceso de creación de la versión ha funcionado correctamente:

Cómo funciona…

En la pestaña Canalización, hemos creado artefactos y un entorno denominado ensayo y los hemos vinculado.

También hemos configurado el entorno para que Azure App Service se relacione con las Azure Functions que hemos creado en el capítulo 4, Comprender la experiencia de desarrollador integrada de Visual Studio Tools para Azure Functions.

Y eso no es todo…

Si vas a configurar una implementación continua por primera vez, es posible que veas un botón con el texto Autorizar en el paso Implementación de Azure App Service. Al hacer clic en el botón Autorizar, se abrirá una ventana emergente en la que se te pedirán las credenciales del portal de administración de Azure.

Para cambiar el nombre de la canalización de versión, haz clic en el nombre en la parte superior, tal como se muestra a continuación:

En la actualidad existe una plantilla específica de Azure Functions, que se muestra a continuación. Sin embargo, parece que no funciona. Cuando leas este documento, intenta lo siguiente:

Consulta también

La receta Implementación de una aplicación de función de Azure en el cloud de Azure mediante Visual Studio del capítulo 4, Comprender la experiencia de desarrollador integrada de Visual Studio Tools para Azure Functions.

Desencadenar la versión automáticamente

En esta receta, aprenderás a configurar la implementación continua de un entorno. En el proyecto puedes configurar desarrollo/ensayo o cualquier otro entorno de preproducción y configurar la implementación continua para optimizar el proceso de implementación.

En general, no se recomienda configurar la implementación continua para un entorno de producción. Sin embargo, esto puede depender de distintos factores y requisitos. Ten cuidado y piensa en las distintas situaciones posibles antes de configurar la implementación continua para el entorno de producción.

Preparación

Si aún no has instalado la herramienta Postman, descárgala e instálala.

Cómo hacerlo…

Sigue estos pasos:

  1. De forma predeterminada, las versiones se configuran para insertarse manualmente. Vamos a configurar la implementación continua. Para ello, vamos a volver a la pestaña Canalización y a hacer clic en Desencadenador de implementación continua, tal como se muestra en la siguiente captura de pantalla:
  • Tal como se muestra en la siguiente captura de pantalla, activa el Desencadenador de implementación continua y haz clic en Guardar para guardar los cambios:
  • Ve a Visual Studio y aplica los cambios al código que se indican a continuación:

return name != null ? (ActionResult)new OkObjectResult($»Automated

Build Trigger and Release test by, { name}»)

          : new BadRequestObjectResult(«Please pass a name on the query string or in the request body»);

  • Ahora, inserta el código con un comentario, Implementación continua, para confirmar los cambios de Azure DevOps. En cuanto insertes el código, dirígete a la pestaña Compilaciones para ver cómo se desencadena una nueva compilación, tal como se muestra en la siguiente captura de pantalla:
  • Ve a la pestaña Versiones tras completar la compilación para ver la activación automática de una nueva versión, tal como se muestra en la siguiente captura de pantalla:
  • Cuando el proceso de creación de la versión se haya completado, podrás revisar el cambio mediante una solicitud al desencadenador de HTTP con la herramienta Postman:

En la pestaña Canalización, hemos habilitado el Desencadenador de implementación continua.

Cada vez que se desencadena una compilación asociada con

AzureServerlessCookBook-C# Function-CI, se activa automáticamente la versión del libro de instrucciones sin servidor de Azure para implementar la última compilación en el entorno designado. También hemos visto en acción la creación automática de versiones mediante un cambio del código en Visual Studio.

Y eso no es todo…

También puedes crear distintos entornos y configurar las definiciones para publicar las compilaciones necesarias en estos entornos