¿Qué es un proceso de CI/CD?

¿Qué es exactamente un proceso de integración continua/entrega continua? ¿Y cómo puede crear uno?

Si ha estado leyendo sobre la integración, entrega e implementación continuas (colectivamente conocidas como CI/CD), es posible que se haya encontrado el término «proceso automatizado» y haya aprendido que desempeña un papel central en la implementación de estas prácticas.

CI/CD es una práctica de DevOps que le ayuda a entregar el software más rápidamente sin sacrificar la calidad. CI/CD implica la confirmación de cambios frecuentemente, pruebas rigurosas de estas actualizaciones y la rápida atención a los comentarios. Tener un proceso automatizado de CI/CD resulta esencial para esta forma de trabajar.

Cómo funcionan los procesos de CI/CD

Cuando hablamos de un proceso de CI/CD, nos referimos al proceso que lleva el código desde su entorno de desarrollo a través de varios pasos como pruebas y preproducción, para finalmente entregarlo a sus usuarios.

El objetivo de CI/CD es ejecutar el proceso regularmente, varias veces al día o incluso cada hora, por lo que es esencial automatizar tanto como sea posible el proceso de CI/CD. Si un paso se completa correctamente, debería activar automáticamente el siguiente. Si un paso falla, esa información debe comunicarse rápidamente para que el problema se puede corregir.

La automatización de sus procesos de CI/CD no solo acelera el proceso general de construcción, prueba e implementación de software, sino que también asegura que cada paso se realice de manera coherente y fiable.

Etapas de un proceso de compilación

Aunque la forma exacta de su proceso de CI/CD dependerá de su producto y su organización, hay un patrón general que todos los procesos tienden a seguir:

  1. El proceso comienza con una confirmación en el principal (o en cualquier rama que haya designado como la rama de la CI), que desencadena un build o un conjunto inicial de pruebas de unidad. Los resultados típicamente son visibles en un panel. El proceso puede diseñarse para detenerse en caso de fallos de compilación o pruebas, permitiéndole abordar cualquier problema antes de continuar. Una vez que un arreglo se confirme, el proceso se reinicia automáticamente desde el principio para asegurarse de que todo funcione como se espera. Alternativamente, puede configurar el proceso para que continúe mientras señala los fallos para su investigación.
  2. La siguiente etapa implica una serie de pruebas automatizadas, con retroalimentación proporcionada después de cada ronda de pruebas. Por lo general, las pruebas están estructuradas para que las más rápidas se ejecuten primero y ofrezcan información lo antes posible. Las pruebas intensivas en recursos se ejecutan al final, pero solo si todos los pasos anteriores han finalizado correctamente. Nuevamente, si alguna prueba falla, puede detener el proceso y empezar de nuevo, o continuar mientras se señala el problema para su investigación.
  3. Una vez que las pruebas automatizadas se han completado, por lo general el software se implementa en una serie de entornos de preproducción. Algunos de estos entornos se pueden utilizar para pruebas manuales adicionales, mientras que otros se pueden utilizar para formación, asistencia y previsualizaciones para clientes.
  4. La etapa final de la arquitectura del proceso de CI/CD implica llevar los cambios a producción. El lanzamiento se puede activar manualmente (en el caso de la entrega continua) o de forma automática (como en la implementación continua).

¡Profundicemos en algunas de las consideraciones clave para cada una de estas etapas!

Indicadores y ramas

El primer paso hacia la adopción de la integración continua es colocar toda su base de código en un sistema de control de versiones o VCS (también conocido como gestión de control de fuentes o SCM), como Git, Mercurial o Perforce, y después hacer que todos los miembros de su equipo adquieran el hábito de confirmar sus cambios con frecuencia. Cada confirmación en el principal inicia el proceso de integración continua, compilando y probando el código para proporcionar información rápida sobre los últimos cambios.

Aunque las confirmaciones frecuentes son una práctica importante del proceso de CI/CD, si está trabajando en una funcionalidad más grande que tardará varios días o semanas en completarse, realizar confirmaciones periódicas durante ese proceso puede ser algo contraproducente.

Por un lado, insertar sus cambios a través del proceso en incrementos regulares le proporciona una información rápida. También hace que los conflictos de fusión complejos sean menos probables si espera hasta haber completado la funcionalidad.

Por otro lado, insertar las funcionalidades incompletas a través del proceso podría no ser lo ideal. Compartir el trabajo incompleto con usuarios, incluso en entornos de preproducción, podría no ser deseable tampoco.

Los indicadores de funcionalidades y las ramas de funcionalidades ofrecen formas de solucionar este problema. Con los indicadores de funcionalidades, puede especificar los entornos en los que su código será visible para los usuarios. Sus cambios se siguen confirmando en el principal y son visibles para su equipo, pero usted decide cuándo estará disponible la funcionalidad en la etapa de preparación y de producción.

Las ramas de funcionalidades le permiten desarrollar su funcionalidad en una rama separada sin perder las ventajas de la compilación y pruebas automatizadas. Al desencadenar el proceso de CI/CD en cada confirmación con una rama de funcionalidad, al igual que lo haría con una confirmación en el principal, puede obtener feedback rápido sobre lo que ha creado.

Compilación y prueba

Después de haber desencadenado una instancia de su proceso con una confirmación, las siguientes etapas son la compilación y la prueba. Si tiene pruebas de unidades automatizadas, estas se ejecutan normalmente antes del build, junto con el análisis lint y las comprobaciones de análisis estático.

La herramienta de build que utilice (como Ant o Maven) y los detalles de los pasos de compilación dependerán del lenguaje y del marco de trabajo con los que trabaje. Al ejecutar el build automatizado en un servidor de builds dedicado, puede evitar problemas en el futuro causados por dependencias que falten; el clásico problema de «funciona en mi máquina».

El paso de compilación produce los artefactos de aplicación, que pueden incluir instaladores, binarios o contenedores. Estos artefactos luego se implementan en entornos de prueba y se integran con otras partes del sistema para ejecutar pruebas automatizadas de nivel superior: pruebas de integración, pruebas de componentes y pruebas de extremo a extremo, así como pruebas no funcionales, como análisis de rendimiento y seguridad.

Estas pruebas se pueden ejecutar en paralelo para acelerar el proceso y ofrecerle antes el feedback.

Contenedores vs. máquinas virtuales

Para que los resultados de sus pruebas automatizadas sean fiables, tiene que asegurarse de que se ejecuten de forma coherente.

Lo ideal es que sus entornos de pruebas se configuren para parecerse lo más posible a la producción, y deben restablecerse entre las ejecuciones de las pruebas para evitar incoherencias ambientales que interrumpan los resultados de las pruebas.

Durante mucho tiempo, las máquinas virtuales (VM) han sido una opción popular para ejecutar entornos de pruebas, ya que puede programar el proceso de actualización para cada nuevo build que se prueba.

Sin embargo, deshacer y reactivar nuevas máquinas virtuales lleva tiempo, mientras que sus scripts deberán incluir la configuración de cada entorno virtual para proporcionar todas las dependencias que necesita el software para ejecutarse. Cuando se añaden nuevas dependencias, los scripts de entorno tendrán que actualizarse. Si pasa por alto este detalle, el build no se ejecutará.

Puede evitar estos problemas empaquetando su código en un contenedor como parte del paso inicial del build. Un contenedor incluye todas las dependencias que necesita el software para ejecutarse, lo que lo hace altamente portátil y más fácil de implementar en diferentes entornos.

Aunque aloje su proceso de CI/CD en su propia infraestructura, seguirá necesitando máquinas virtuales para implementar los contenedores, aunque la preparación del entorno de pruebas requerirá menos trabajo. Si ejecuta su proceso en la nube, puede utilizar servicios gestionados para adoptar contenedores y descargar la gestión de infraestructura a su proveedor de nube.

Entornos de preproducción

La cantidad de entornos de prueba y preparación en su arquitectura de proceso dependerá de lo que esté creando y de las necesidades de los distintos grupos de partes interesadas en su organización. Por ejemplo, puede tratarse de pruebas exploratorias, revisiones de seguridad, investigaciones sobre los usuarios, demostraciones de ventas, entornos de formación y entornos de pruebas para que el personal de asistencia pueda replicar los problemas de los clientes.

Automatizar la creación y la implementación en estos entornos es más eficiente que actualizarlos manualmente. También puede configurar diferentes disparadores de proceso para diferentes entornos.

Por ejemplo, aunque sus entornos de pruebas pueden actualizarse con cada build, tal vez quiera actualizar los entornos de pruebas con menos frecuencia; tal vez una vez al día o una vez a la semana con el último build exitoso.

Implementar

Una vez que los cambios del código hayan superado todas las etapas anteriores del proceso, estarán listos para lanzarse a producción. Este paso final puede ser manual o automático.

El lanzamiento manual (entrega continua) es útil si:

  • Desea controlar cuándo se vuelven disponibles las nuevas funcionalidades.
  • Su proceso de implementación implica un tiempo de inactividad para sus usuarios.
  • Los usuarios necesitan instalar su producto, y usted desea agrupar los cambios para la entrega de acuerdo con un calendario periódico de lanzamientos.

Con la implementación continua, el lanzamiento es automático. Los cambios se implementan si han pasado todas las etapas anteriores. Para equipos grandes que realizan confirmaciones con frecuencia, esto puede significar implementar actualizaciones a los usuarios decenas de veces al día, un logro que es prácticamente imposible sin un proceso automatizado.

Comprensión de procesos de CI/CD en pocas palabras

CI/CD es una práctica de DevOps que utiliza la automatización para proporcionar información rápida en cada etapa del ciclo de vida de desarrollo de software. Descubrir los problemas introducidos por los últimos cambios de código hace que el desarrollo de software sea más eficiente. Al desplazar a la izquierda (moviendo las interacciones a etapas más tempranas y obteniendo la información antes), le permite fallar rápidamente y compilar un proceso automatizado ayuda a poner estas técnicas en práctica.

Cuando se trata de diseñar su propio proceso de CI/CD, es una buena idea construirlo en etapas, comenzando con la integración continua. Las etapas exactas del proceso y la lógica que determina cuándo se desencadena cada etapa dependen de su producto y su organización.

Elegir una plataforma de CI/CD que le brinde la flexibilidad necesaria para configurar su proceso según sus requisitos concretos, sin dejar de ser fácil de gestionar, le ayudará a forjar un proceso de publicación fiable y mejorar la calidad de su software.

Cómo puede ayudarle TeamCity

Nuestra solución TeamCity Pipelines le ayuda a automatizar sus procesos existentes de CI/CD.

Con la compatibilidad con todos los principales sistemas de control de versiones e integración con herramientas populares de compilación, pruebas y gestión de paquetes, TeamCity Pipelines puede transformar sus flujos de trabajo de desarrollo en procesos eficientes y automatizados.

Las opciones de disparadores flexibles y un editor visual de procesos facilitan la configuración de procesos para cualquier flujo de trabajo. Las configuraciones se almacenan de forma automática como código, y le ofrecen la libertad de compilar y gestionar sus procesos en la GUI mientras aprovecha los beneficios de la configuración como código.

Las opciones de implementación locales y nativas en la nube de TeamCity le dan la flexibilidad necesaria para ejecutar los procesos donde quiera y escalar a petición. Las funcionalidades como las pruebas paralelas y la retroalimentación en tiempo real le ayudan a detectar los fallos rápidamente para que la experiencia de desarrollo sea más productiva.

¿Aún tiene alguna duda? Más información en nuestra sección Preguntas frecuentes.