Mida el rendimiento de CI/CD con métricas de DevOps

Un servidor de CI o «servidor de compilación» coordina todas las fases de un proceso de CI/CD, desde detectar cambios en el VCS hasta implementar nuevas compilaciones.

Usar un servidor de CI puede ayudarle a agilizar sus procesos de integración y entrega/implementación continuas (CI/CD). Un servidor de CI se encarga de supervisar el sistema de control de versiones (VCS), activar tareas automatizadas de compilación, prueba e implementación, cotejar los resultados e iniciar la siguiente fase del proceso.

Aunque es posible ejecutar procesos de CI/CD sin un servidor de compilación, muchos equipos de desarrollo optan por utilizar una herramienta de CI para coordinar el proceso y presentar los resultados de cada fase. En esta guía, veremos qué hace un servidor de CI y cómo puede ayudarle a sacar el máximo provecho de la CI/CD.

¿Por qué utilizar un servidor de CI?

Un servidor de CI es el punto central de coordinación de todas las actividades de CI/CD. Usar un servidor de CI:

  • Garantiza que cada confirmación pase por un proceso de CI/CD: al integrarse con el VCS, el servidor de CI garantiza que todos los cambios de código pasen por un proceso automatizado de compilación, prueba e implementación, sin que los desarrolladores tengan que realizar esfuerzos adicionales.
  • Le permite coordinar su lógica empresarial: desde el nivel de cobertura de las pruebas hasta lo que supone un «aprobado» para cada fase del proceso de pruebas automatizadas, el servidor de CI es una fuente de referencia única para su organización.
  • Se integra con su cadena de herramientas: además del VCS y las herramientas de compilación, el servidor de CI puede integrarse con sistemas de seguimiento de incidencias y plataformas de comunicación para proporcionar actualizaciones automatizadas del proceso de compilación, prueba e implementación.
  • Conserva un registro de compilaciones anteriores: disponer de un archivo de artefactos de compilación tiene un valor incalculable cuando se necesita identificar el punto en el que un error particularmente complejo llegó a la base de código.
  • Ofrece a las partes interesadas visibilidad del progreso de la versión: como fuente central de información sobre el estado de las compilaciones y las implementaciones, puede utilizar el servidor de CI para informar a toda la organización sobre los avances.
  • Proporciona un registro de auditoría de los cambios: es probable que el flujo de trabajo y la lógica empresarial evolucionen con el tiempo. Usar un servidor de CI puede permitirle contar con un registro de cómo ha ido cambiando el proceso de CI/CD, por si desea volver a una implementación anterior.

Además, usar un servidor de CI le ayudará a aprovechar las muchas ventajas de la CI/CD, como la información rápida sobre los cambios de código, la identificación temprana de errores o un lanzamiento más frecuente de las versiones.

Por qué utilizar un servidor de CI

¿Cómo funciona un servidor de CI?

Aunque el proceso exacto variará en función del equipo y los requisitos de la organización, un servidor de CI funciona de la siguiente manera:

  1. Se integra con el sistema de control de versiones y busca confirmaciones en las ramas pertinentes.
  2. Inicia una serie de tareas de compilación y prueba cada vez que se confirma un cambio. Estas tareas se distribuyen a otras máquinas de la granja de compilación o se ejecutan en el propio servidor de CI.
  3. Recopila los resultados de dichas tareas y utiliza esos datos para determinar si debe pasar a la siguiente fase del proceso.
  4. Almacena los artefactos de compilación en un archivo central.
  5. Despliega la nueva versión a producción.
  6. Proporciona información a lo largo del proceso.
Cómo funciona un servidor de CI

Supervisar el control de versiones

Al principio de cualquier proceso de CI/CD, encontrará una integración con un sistema de control de versiones o de fuentes.

Normalmente, un servidor de CI está configurado para escuchar las confirmaciones en una rama concreta y desencadenar una nueva ejecución del proceso cada vez que se lleva a cabo un cambio. Esto permite garantizar que cada vez que un desarrollador comparte sus cambios, se compilan y se prueban para asegurar que la base de código en su conjunto sigue funcionando correctamente.

Algunos servidores de CI permiten ir un paso más allá y exigir a los desarrolladores que compilen y prueben los cambios de forma local antes de compartirlos en una rama de CI. Aunque esto no garantiza que la siguiente fase se lleve a cabo correctamente, sí que ayuda a reducir el número de compilaciones rotas y los retrasos que esto puede causar. Otra opción es integrar el servidor de CI con la herramienta de revisión de código, de modo que cada confirmación deba pasar una fase de revisión de código antes de poder compartirse.

La imposición de estas capas adicionales de lógica empresarial al principio del proceso ayuda a mantener el código base limpio y listo para su lanzamiento, al tiempo que minimiza las interrupciones y los retrasos en el proceso.

Gestionar compilaciones y pruebas

Cada vez que se detecta un cambio y se activa la ejecución de un proceso, el servidor de CI coordina las tareas de compilación y prueba. Normalmente, estas se asignan a máquinas de compilación específicas o «agentes». Sus agentes de compilación hacen el trabajo pesado de ejecutar las compilaciones y las pruebas de acuerdo con las instrucciones recibidas desde el servidor de CI.

Otra opción es ejecutar tareas de compilación y prueba en el propio servidor de CI, aunque esto puede provocar que se contengan los recursos y se reduzca el rendimiento en bases de código ocupadas.

Cuando se utiliza el servidor de CI para configurar la lógica de una etapa de su proceso, se puede especificar una serie de detalles y reglas. Por ejemplo, podría querer hacer lo siguiente:

  • Ejecutar todas las pruebas automatizadas en las confirmaciones de la rama principal, pero ejecutar un conjunto reducido de comprobaciones en las ramas de funcionalidades.
  • Controlar cuántas compilaciones pueden llamar a una base de datos de pruebas al mismo tiempo.
  • Limitar las implementaciones a un entorno de almacenamiento provisional a una vez por semana para permitir pruebas manuales más profundas.

Poder ejecutar ciertas tareas al mismo tiempo utilizando diferentes agentes de compilación puede hacer que su proceso sea más eficiente. Esto resulta útil si necesita ejecutar pruebas en diferentes sistemas operativos o si trabaja en una base de código muy grande con cientos de miles de pruebas, donde la única opción práctica es paralelizar. En este último caso, la configuración de una compilación compuesta agregará los resultados para que pueda tratar las tareas como una única fase de compilación.

Un servidor de compilación que se integre con la infraestructura alojada en la nube, como AWS, le permitirá disfrutar de recursos flexibles y escalables en los que ejecutar sus compilaciones y pruebas. Si sus necesidades de infraestructura son considerables, la compatibilidad con los agentes de compilación en contenedores y la integración con Kubernetes le permitirán gestionar sus recursos de compilación de manera eficiente, ya sea en la nube o localmente.

Definir las condiciones de aprobado y fallo

Una parte clave de su lógica empresarial consiste en definir lo que constituye un fallo en cada etapa de su proceso de CI/CD.

El servidor de CI debería permitirle configurar varias condiciones de fallo. A continuación, comprueba si estos criterios se han cumplido con el fin de determinar el estado de una fase concreta y decidir si se debe pasar a la siguiente fase del proceso.

Además de los fallos evidentes, como que una compilación devuelva un código de error o que las pruebas no se ejecuten, puede definir otras condiciones de fallo en función de los datos recogidos por su servidor de compilación.

Algunos ejemplos son la disminución de la cobertura de las pruebas en relación con la compilación anterior (lo que indica que no se han añadido pruebas para los últimos cambios de código) o el aumento del número de pruebas ignoradas en comparación con la última compilación satisfactoria.

Estas métricas también son un aviso útil cuando la calidad del código puede estar deteriorándose. Desencadenando un fallo por estas razones y limitando qué usuarios tienen permiso para anular estos fallos, puede favorecer el comportamiento que desea obtener.

Almacenar artefactos de build

Cuando un cambio tiene éxito, el servidor de CI almacena los artefactos del proceso de compilación. Estos pueden incluir binarios, instaladores, imágenes de contenedores y cualquier otro recurso necesario para implementar el software.

A continuación, puede implementar los mismos artefactos en entornos de preproducción para realizar más pruebas antes de implementarlos finalmente en producción. Esto garantiza que se pruebe el mismo resultado en todas las fases y es mucho más fiable que reconstruir a partir del código fuente antes de cada implementación. En particular, evita el riesgo de omitir dependencias e introducir otras incoherencias.

Tener un repositorio de artefactos de compilaciones realizadas con éxito también es útil cuando se necesita volver a una versión anterior del software o se intenta identificar cuándo se produjo un problema concreto.

Implementar compilaciones

Aunque el término «servidor de CI» sugiere que su uso se limita a la integración continua, la mayoría de los servidores de CI también ofrecen asistencia para la entrega y la implementación continuas.

Una vez creados los artefactos de compilación y ejecutado un conjunto inicial de pruebas durante la fase de integración continua, el siguiente paso es implantar esos artefactos en entornos de control de calidad para llevar a cabo más pruebas. A esto le sigue el almacenamiento provisional, que ofrece a las partes interesadas la oportunidad de probar la nueva compilación. A continuación, si todo funciona correctamente, se procede a la publicación.

Puede utilizar un servidor de CI para almacenar y gestionar parámetros para cada entorno del proceso. Esto le permite especificar si los scripts de implementación se desencadenan automáticamente en función del resultado de la fase anterior.

Proporcionar comentarios

Una función importante de un servidor de CI es ofrecer comentarios rápidos sobre cada fase de la compilación y las pruebas. Los servidores de CI que se integran con el IDE o la plataforma de comunicaciones pueden enviarle una notificación cada vez que uno de sus cambios haya provocado un fallo en el proceso, sin necesidad de que supervise constantemente su progreso.

Los servidores de compilación también pueden:

  • Ofrecer informes en tiempo real sobre las compilaciones y las pruebas que están en curso y enviarle notificaciones sobre el estado de las fases de compilación completadas.
  • Integrarse con herramientas de seguimiento de incidencias para ver los detalles de las correcciones incluidas en una confirmación e investigar rápidamente la causa de un fallo.
  • Recopilar estadísticas sobre la frecuencia de implementación, el tiempo transcurrido hasta el siguiente fallo y el tiempo medio hasta la resolución, para ayudarle a medir y mejorar el proceso de desarrollo.
  • Proporcionar información sobre el uso y el rendimiento del servidor de CI y las máquinas de compilación, que puede utilizar para optimizar sus procesos.
Qué pueden hacer los servidores de compilación

¿Debería crear su propio servidor de CI?

Construir su propio servidor de CI puede parecer, a priori, una buena opción, ya que, al diseñar su propia solución, puede adaptarla a sus necesidades y evitar los costes de licencia.

Sin embargo, crear una herramienta personalizada es solo el principio del proceso. Una vez instalada, tendrá que invertir tiempo en mantenerla actualizada, lo que implica solucionar los errores que surjan y desarrollar nuevas funcionalidades a medida que cambien los requisitos.

También hay que tener en cuenta el esfuerzo que supone integrar un servidor de CI con la cadena de herramientas. Aunque su diseño inicial funcionará con el sistema de control de versiones, el sistema de seguimiento de incidencias, las herramientas de compilación y los marcos de trabajo de pruebas que utiliza actualmente, ¿qué ocurrirá cuando cambie a un nuevo producto o tecnología?

Si bien construir su propio servidor de CI le ofrece la flexibilidad de crear una herramienta adaptada a su caso de uso, el esfuerzo inicial y el mantenimiento continuo requieren un compromiso importante y a largo plazo.

Conclusión

Un servidor de integración continua desempeña un papel fundamental en la implementación de su proceso de CI/CD, coordinando y desencadenando los distintos pasos de su proceso, y cotejando y entregando datos de cada etapa. Eche un vistazo a nuestra Guía de herramientas de CI/CD para obtener consejos sobre cómo elegir el servidor de CI adecuado para su organización.

Cómo puede ayudarle TeamCity

TeamCity es un servidor de CI que ofrece integraciones con los principales sistemas de control de versiones, como Git, Perforce, Mercurial o Subversion, así como con varios servicios de alojamiento. También encontrará compatibilidad con una amplia gama de herramientas de compilación y marcos de trabajo de pruebas, así como integraciones con IDE, sistemas de seguimiento de incidencias, plataformas de mensajería y gestores de contenedores.

Puede alojar su servidor de CI en las instalaciones o en el entorno en la nube que prefiera con TeamCity Professional o Enterprise, u optar por TeamCity Cloud para obtener una solución totalmente gestionada. Un conjunto flexible de activadores de proceso le permite configurar los procesos de CI/CD para que se adapten a sus necesidades, incluidas las confirmaciones comprobadas previamente, la compatibilidad con la rama de características y las compilaciones programadas. Una vez que haya configurado su lógica de proceso desde la interfaz de usuario, puede almacenar la configuración como código para obtener un proceso de CI/CD totalmente controlado por versiones.