Tecnología de DevOps: Automatización de implementaciones

La automatización de implementaciones es lo que te permite implementar el software en entornos de prueba y producción con solo presionar un botón. La automatización es esencial para reducir el riesgo de implementaciones de producción. También es esencial para proporcionar comentarios rápidos sobre la calidad del software, ya que permite que los equipos realicen pruebas integrales lo antes posible después de los cambios.

Un proceso de implementación automatizada tiene las siguientes entradas:

  • Paquetes creados mediante el proceso de integración continua (CI). Estos paquetes deben poder implementarse en cualquier entorno, incluido el de producción.
  • Secuencias de comandos para configurar el entorno, implementar los paquetes y realizar una prueba de implementación (también conocida como prueba de humo).
  • Información de configuración específica del entorno.

Te recomendamos que almacenes la información de configuración y secuencias de comandos en el control de versión. En el proceso de implementación, se deben descargar los paquetes de un repositorio de artefactos (por ejemplo, Container Registry, Nexus, Artifactory o el repositorio integrado de la herramienta de CI).

Mediante las secuencias de comandos, se suelen realizar las siguientes tareas:

  1. Se prepara el entorno de destino, tal vez mediante la instalación y configuración de cualquier software necesario, o mediante el inicio de un host virtual desde una imagen ya preparada en un proveedor de servicios en la nube, como Google Cloud.
  2. Se implementan los paquetes.
  3. Se realiza cualquier tarea relacionada con la implementación, como la ejecución de secuencias de comandos de migración de bases de datos.
  4. Se realiza cualquier configuración necesaria.
  5. Se realiza una prueba de implementación para asegurarse de que todos los servicios externos necesarios sean accesibles y que el sistema funcione.

Cómo implementar la automatización de implementaciones

Cuando diseñas el proceso de implementación automatizado, recomendamos que sigas estas prácticas recomendadas:

  • Usa el mismo proceso de implementación para todos los entornos, incluido el de producción. Esta regla ayuda a garantizar que pruebes el proceso de implementación muchas veces antes de usarlo para implementar en producción.
  • Permite que cualquier persona con las credenciales necesarias implemente cualquier versión del artefacto en cualquier entorno a pedido de forma completamente automatizada. Si tienes que crear un ticket y esperar a que alguien prepare un entorno, no tendrás un proceso de implementación completamente automatizado.
  • Usa los mismos paquetes para cada entorno. Esta regla significa que debes mantener la configuración específica del entorno separada de los paquetes. De esa manera, sabrás que los paquetes que implementas en producción son los mismos que probaste.
  • Permite recrear el estado de cualquier entorno a partir de la información almacenada en el control de versión. Esta regla ayuda a garantizar que las implementaciones sean repetibles y que, en caso de una situación de recuperación ante desastres, puedas restablecer el estado de producción de forma determinista.

Lo ideal es que tengas una herramienta que puedas usar de forma autónoma para realizar implementaciones, que registre qué compilaciones se encuentran en cada entorno en ese momento y, también, el resultado del proceso de implementación con fines de auditoría. Muchas herramientas de CI tienen estas funciones.

Errores comunes en la automatización de implementaciones

Cuando automatizas un proceso de implementación, puedes encontrar las siguientes dificultades:

  • Complejidad del proceso existente
  • Dependencias entre servicios
  • Componentes que no están diseñados para la automatización
  • Falta de colaboración entre los equipos

Complejidad

La primera dificultad es la complejidad. La automatización de un proceso manual complejo y frágil produce un proceso automatizado complejo y frágil. Primero, debes volver a diseñar la arquitectura para la implementación. Esto significa que debes hacer que la secuencia de comandos de implementación sea lo más simple posible y que debes enviar la complejidad al código de la aplicación y a la plataforma de infraestructura. Busca modos de falla de implementación y pregúntate cómo podrías evitarlos si haces que los servicios, los componentes, la plataforma de infraestructura y la supervisión sean más inteligentes. Por lo general, las aplicaciones nativas de la nube que se ejecutan en una plataforma como servicio, como App Engine, Cloud Run o Pivotal Cloud Foundry, se pueden implementar mediante la ejecución de un solo comando, sin secuencias de comandos de implementación; este es el proceso ideal.

Un proceso de implementación confiable tiene dos propiedades importantes. En primer lugar, los pasos individuales del proceso de implementación deben, en la medida de lo posible, ser idempotentes, para que puedas repetirlos tantas veces como sea necesario en caso de una falla. En segundo lugar, deben ser independientes del orden, lo que significa que los componentes y los servicios no deben fallar de forma descontrolada si falta algún otro componente o servicio. En su lugar, los servicios deben seguir funcionando de manera degradada hasta que sus dependencias estén disponibles.

En el caso de productos y servicios nuevos, te recomendamos que consideres estos principios como requisitos del sistema desde el comienzo de la fase de diseño. Si actualizas la automatización de un sistema existente, es posible que necesites realizar algunas tareas para implementar estas características o compilar en telemetría, de modo que el proceso de implementación pueda detectar estados inconsistentes y fallar de forma controlada.

Dependencias

La segunda dificultad es que muchos procesos de implementación, en particular en entornos empresariales, requieren organización. En otras palabras, debes implementar varios servicios juntos en un orden particular, mientras realizas otras tareas, como migraciones de bases de datos en estricta sincronización. Aunque existen muchas herramientas de flujo de trabajo de implementación empresarial para resolver esta situación, no resuelven el problema de arquitectura por completo: una relación estrecha entre los diversos componentes y servicios. Con el tiempo, deberás abordar esta relación estrecha. El objetivo es que los servicios se puedan implementar de forma independiente, sin necesidad de una organización.

Por lo general, este enfoque requiere un diseño detallado para garantizar que cada servicio admita la retrocompatibilidad, de modo que los clientes del servicio no requieran la actualización en el bloqueo, pero se puede actualizar de forma independiente en una fecha posterior. Las técnicas como el control de versiones de la API pueden ayudar con esto. También es importante asegurarse de que los servicios puedan seguir en funcionamiento (tal vez con algunas funciones no disponibles), incluso si no pueden conectarse a otros servicios de los que dependen. Este diseño es adecuado para los sistemas distribuidos, ya que puede ayudar a evitar fallas en cascada. En el libro de Michael Nygard “Release It!” (“Actualízalo”), se describe una serie de patrones para ayudar a diseñar sistemas distribuidos, incluidos los interruptores de circuitos. Incluso puedes separar las actualizaciones de la base de datos de los servicios de los que dependen mediante el patrón de cambio paralelo.

No están diseñados para la automatización

La tercera dificultad común es que los componentes no estén diseñados para la automatización. Cualquier proceso de implementación que requiera el acceso a una consola y la interacción manual mediante un clic debe ser un objetivo de mejora. En la actualidad, la mayoría de las plataformas (incluida Google Cloud) ofrecen una API que la secuencia de comandos de implementación puede usar. Si ese no es el caso, debes ser creativo y evitar esa intervención manual. Puedes buscar la base de datos o el archivo de configuración subyacente de la herramienta y hacerle cambios directamente, o puedes reemplazarla por otra herramienta que tenga una API.

Falta de colaboración entre equipos

La última dificultad se presenta cuando los desarrolladores y los equipos de operaciones de TI no están sincronizados. Esto puede suceder de varias maneras. Por ejemplo, los desarrolladores pueden usar un método para la implementación diferente del que usan los equipos de operaciones de TI. Por otro lado, si los entornos están configurados de otro modo, aumentarás de forma considerable el riesgo de que los equipos de operaciones de TI realicen el proceso de implementación de forma manual, lo que genera inconsistencias y errores. Los desarrolladores y los equipos de operaciones de TI deben crear el proceso de automatización de implementaciones en conjunto. Este enfoque garantiza que ambos equipos puedan comprender, mantener y mejorar la automatización de implementaciones.

Formas de mejorar la automatización de implementaciones

El primer paso es documentar el proceso de implementación existente en una herramienta común a la que tengan acceso los desarrolladores y equipos de operaciones, como Documentos de Google o una wiki. Luego, trabaja para simplificar y automatizar el proceso de implementación de forma incremental. En general, este enfoque incluye las siguientes tareas:

  • Empaquetado del código de manera adecuada para la implementación
  • Creación de contenedores o imágenes de máquinas virtuales preconfigurados
  • Automatización de la implementación y la configuración de middleware
  • Copia de paquetes o archivos en el entorno de producción
  • Reinicio de servidores, aplicaciones o servicios
  • Generación de archivos de configuración a partir de plantillas
  • Ejecución de pruebas de implementación automatizadas para garantizar que el sistema funcione y esté configurado de forma correcta
  • Ejecución de procedimientos de prueba
  • Secuencia de comandos y automatización de las migraciones de bases de datos

Trabaja para quitar los pasos manuales y, además, implementar la idempotencia y la independencia de orden siempre que sea posible. También, aprovecha las capacidades de la plataforma de infraestructura siempre que sea posible. Recuerda que la automatización de implementaciones debe ser lo más simple posible.

Formas de medir la automatización de implementaciones

Medir la automatización de implementaciones es sencillo.

  • Cuenta la cantidad de pasos manuales en el proceso de implementación. Trabaja para reducir esos pasos de manera sistemática. La cantidad de pasos manuales aumenta el tiempo de implementación y la oportunidad de que se genere un error.
  • Mide el nivel (o porcentaje) de la automatización en la canalización de implementación. Trabaja para aumentar ese nivel de forma continua.
  • Determina el tiempo dedicado a los retrasos en la canalización de implementación. A medida que trabajas para reducir estos retrasos, comprende dónde y por qué se bloquea el código en la canalización de implementación.

¿Qué sigue?