Tres hooks Git para la integración continua

Descubre cómo los hooks de Git garantizan el buen estado de las compilaciones en ramas de funciones, entre otras cosas.

Sarah Goff-Dupont Sarah Goff-Dupont

Si has usado Git, probablemente hayas oído hablar de los hooks de Git. Incluso puede que los hayas probado. Los hooks de Git son excelentes en el contexto de la integración continua, por lo que en este artículo vamos a profundizar en tres casos prácticos. También veremos hooks listos para usar que puedes añadir a tu flujo de trabajo. Si no tienes experiencia con los hooks de Git, no te preocupes: empezaremos por lo básico.

Qué son los hooks de Git

Los hooks son el mecanismo nativo de Git para desencadenar scripts personalizados antes o después de operaciones como confirmaciones y fusiones. Vendrían a ser el sistema de complementos de Git. Si miras en el directorio .git de un repositorio Git, verás un directorio llamado "hooks" que contiene un conjunto de scripts de hook de ejemplo.

.git/hooks

Instalar hooks de Git es sencillo y la documentación es detallada, así que no nos detendremos aquí.

Hay dos grandes clases de hooks: los del lado del cliente y los del lado del servidor. Los hooks del lado del cliente se ejecutan en tu estación de trabajo local, mientras que los hooks del lado del servidor se ejecutan en el servidor de Git.

También puedes clasificar los puntos de enganche como anteriores o posteriores. Los hooks anteriores a la recepción se invocan antes de determinadas operaciones de Git, y tienen la opción de cancelar una operación si es necesario. Hacen las veces de "seguratas" que protegen tu repositorio en la "zona VIP", lo que evita que tú y tus compañeros de equipo confirméis un código erróneo. Los hooks posteriores a la recepción se ejecutan después de completarse una operación y, por ello, no tienen la opción de cancelarla. En su lugar, estos hooks automatizan las piezas de tu workflow de desarrollo.

Usar hooks de #Git es como tener pequeños robots que se encargan de cumplir todos tus deseos (¡tatatachán!)

Los hooks Git automatizan cosas como…

  • la comprobación de que has incluido la clave de incidencia Jira asociada en tu mensaje de confirmación
  • el cumplimiento de las condiciones previas para la fusión
  • el envío de notificaciones a la sala de chat de tu equipo
  • la configuración de tu espacio de trabajo tras cambiarte a una rama distinta

Aplicación de compilaciones limpias en ramas de funcionalidades

Los hooks previos a la recepción del lado del servidor son un complemento especialmente útil para la integración continua, ya que pueden impedir que los desarrolladores envíen código a la rama principal, a menos que el código cumpla ciertas condiciones (son una especie de guardianes ninja de élite que te protegen de errores en el código).

Los desarrolladores suelen ser lo bastante prudentes como para no fusionar en la rama principal cuando hay pruebas dañadas en su rama. Sin embargo, a veces nos olvidamos de comprobarlo. Otras veces, cuando compartimos una rama con otras personas, se añaden cambios desde la última vez que comprobamos la compilación de la rama… En fin, cosas que pasan.

Puedes añadir un hook del lado del servidor que busque fusiones entrantes en la rama principal. Cuando encuentre una, el script comprobará la última compilación de tu rama y, si alguna prueba falla, se rechazará la fusión. Tim Petterson, promotor de desarrolladores de Atlassian, escribió un script de hook con esta finalidad, diseñado para funcionar con Bamboo, y lo incorporó a Bitbucket. Puedes personalizarlo y añadirlo a tu propio repositorio.

Protección de la cobertura de código tras un duro esfuerzo

He visto que muchos equipos se esfuerzan por mantener la cobertura de código. Muchas veces tienen que cubrir retroactivamente su código base con pruebas y es realmente frustrante ver que la cobertura que tanto les ha costado conseguir se pierde al añadir nuevas funciones sin pruebas que las apuntalen. Por eso, Tim escribió también un hook del lado del servidor previo a la recepción para proteger a la rama principal de la pérdida de cobertura de código.

Este hook también busca fusiones entrantes en la rama principal. Luego, llama al servidor de integración continua para comprobar la cobertura actual de código en la rama principal y la cobertura en la rama. Si la rama tiene menos cobertura, se rechaza la fusión.

Casi ningún servidor de integración continua expone los datos de cobertura de código a través de sus API remotas, por lo que el script incorpora el informe de cobertura del código. Para ello, la compilación debe configurarse para publicar el informe como un artefacto compartido, tanto en la rama principal como en la compilación de rama. Una vez publicado, puedes llamar al servidor de integración continua para obtener el último informe de cobertura de la rama principal. Para la cobertura de ramas, puedes recuperar el informe de cobertura desde la última compilación o para compilaciones relacionadas con la confirmación que se fusiona.

Quiero aclarar que doy por hecho que ya tienes cobertura de código en ejecución. El hook no lo hace por arte de magia, solo busca los datos de cobertura en los resultados de la compilación. También funciona con Bamboo de forma predeterminada y con Clover (herramienta de cobertura de código de Atlassian para Java y Groovy). Además, se puede personalizar para integrarse con cualquier servidor de compilación o herramienta de cobertura de código.

Comprobar el estado de compilaciones de rama

No hay que dejar a nadie en la estacada, así que recuerda comprobar si hay ramas dañadas.

Es tu oportunidad de hacer pruebas con los hooks de Git del lado del cliente: un script de hook posterior a la extracción que expone el estado de compilación de la rama en la propia ventana de tu terminal, también obra de Tim. El script obtiene el número de revisión principal de la rama de tu copia local y, a continuación, consulta el servidor de integración continua para ver si esa revisión se ha compilado y, de ser así, si la compilación fue correcta.

Digamos que quieres crear una rama desde la principal. Este hook te indicará si la confirmación de encabezado de la rama principal se creó correctamente, es decir, que es una confirmación segura desde la que crear una rama de función. O bien digamos que el hook indica la compilación cuya revisión falló, pero el mural del equipo muestra una compilación verde para esa rama (o viceversa). Esto significa que tu copia local está desactualizada. Tú decides si quieres desplegar las actualizaciones o seguir trabajando en la copia local que tienes.

El uso de este hook le ha ahorrado innumerables quebraderos de cabeza a los desarrolladores de Atlassian. Si no puedes convencer a tu equipo de que adopte los hooks de servidor arriba mencionados, al menos, haz que instale este en tu estación de trabajo local. No te arrepentirás.

Todos los hooks de Git para la integración continua que he mostrado aquí funcionan con Bamboo, Clover y Bitbucket de forma predeterminada. Sin embargo, recuerda que los hooks de Git son neutrales a los proveedores, de modo que puedes personalizarlos para trabajar con cualquier conjunto de herramientas que tengas. Si quieres ganar, recurre a la automatización.