Automatizar procesos con Git hooks
¿Pero qué son los git hooks?
Los enganches de git, o conocidos en inglés como git hooks, son scripts que se ejecutan automáticamente antes y/o después de que git ejecute un tipo de acción como lo son Git Commit o Git Push.
Al inicializar un repositorio en nuestro local, git automáticamente genera dentro de la
carpeta .git/hooks, una carpeta que incluye ejemplos de hooks como punto de partida,
generándolos con una breve explicación de lo que hace el hook y con la extensión
.sample; ejemplo, pre-commit.sample. Todos los posibles hooks están disponibles en la documentación oficial de git.
Para que los scripts de los hooks tengan efecto en uno de los comandos git (por
ejemplo git commit o git push), es recomendable que dupliquemos/creemos un nuevo
script bash con el mismo nombre del hook pero sin la palabra .sample.
Es importante que los ficheros nuevos de hooks sean ejecutables, de lo contrario no podremos hacer uso de esos hooks.
Si una de las acciones establecidas en nuestros hooks falla, como por ejemplo la validación PSR de nuestros ficheros en el hook pre-commit, nuestro commit no se ejecutará hasta que cumplamos con todos los requisitos establecidos en el hook.
Git Hooks disponibles
Ejemplos de uso de los git hooks
- Con el uso de los git hooks podríamos lograr lo siguiente:
- Comprobar la calidad del código antes de hacer un commit.
- Validación PSR y validaciones personalizadas en base a un lenguaje de programación.
- Buscar y corregir espacios en blanco en commits.
- Si se utiliza GitHub Pages o un servicio similar para generar/mantener documentación online, siempre estará al día con los cambios del código (sobre todo en python que cuenta con librerías para esto).
- Actualizar dependencias instaladas al cambiar de rama si el archivo de dependencias ha cambiado entre la rama anterior y la actual.
- Permitir sólo a usuarios concretos modificar ciertas carpetas del proyecto.
- Acciones a nivel de servidor, por ejemplo, subir en automático los cambios a un repositorio remoto o un entorno de desarrollo, ya sean cambios de código o actualizaciones del esquema de base de datos, instalación y actualización de dependencias.
- Para que los hooks tomen efecto en el servidor, estos tienen que estar creados en el servidor, por ejemplo, el hook Post-Receive para que después de una ejecución exitosa en el repositorio remoto, envíe notificaciones a usuarios.
- Hay hooks que funcionan del lado del cliente, los cuales residen en el repositorio local, y hooks que funcionan del lado del servidor los cuales residen en el servidor y se activan cuando hay operaciones de red.
Git hooks en uso en AvaiBook
Como vimos en nuestra entrada del blog Automatiza la revisión de estándares de tu código PHP, uno de los hooks que tenemos implementado actualmente es el de pre-commit.
Actualmente en este hook, hacemos las validaciones PSR de todos nuestros archivos .php. Esto, sin duda alguna nos ha ayudado y nos seguirá ayudando a tener un código limpio y estructurado, y sobre todo, a que los desarrolladores sigamos alineados y cumpliendo el mismo estándar.
Pero además de comprobar que nuestros ficheros cumplen los estándares de php, otra de las acciones/comprobaciones que hacemos en nuestro pre-commit hook es sobre nuestras migrations de symfony,
Para esto, una de las cosas que hicimos fue crear un script bash para ejecutar un dry run de nuestras migrations pendientes de ejecución. En este script bash declaramos un array en el que vamos almacenando todos los errores que se vayan produciendo durante la ejecución del dry run.
La opción dry-run es una opción que nos permite ver el resultado de una acción sin realmente ejecutarla. En el ejemplo de las migrations, nos devolvería los resultados de las migrations a ejecutar pero sin tener ningún tipo de efecto sobre nuestra(s) base(s) de datos.
En el caso de que se hayan producidos errores, nuestro hook no nos dejará aplicar los cambios en nuestra rama hasta que no los hayamos solventado.
Pero el uso de los git hooks no es solo para ‘revisar’ cosas de nuestro código, sino también para automatizar acciones como es el caso de la instalación de dependencias. Suena bien ¿verdad?
Otro de los git hooks que tenemos activos es el de post-merge. Este hook nos permite de manera automática, tener todas las dependencias de nuestros proyectos actualizadas a la hora de cambiar de ramas, así de esta manera no tenemos que instalar manualmente las dependencias de nuestros gestores de paquetes y dependencias como lo son npm, yarn, composer, etc.
Pero eso no es todo, ¿acaso tú o tu equipo no ha pasado dolores de cabeza por no tener todas las versiones sqls actualizadas en tu proyecto en local? Seguramente no has sido el único. Nosotros en AvaiBook, sobre todo cuando en un sprint teníamos muchos desarrollos que tenían nuevas versiones sqls, a la siguiente semana desde una rama nueva en nuestro local, nos llovían excepciones típicas como ‘No existe la tabla/campo X’. Pero dijimos no más. Gracias principalmente a las migrations de symfony y muy pronto a los hooks, de manera automática, podremos actualizar nuestras bases de datos a través del comando make:migrations. Adiós al sufrimiento de ir ejecutando manualmente las versiones sqls desde el phpmyadmin.
Sin lugar a duda, los hooks nos ofrecen un sin fin de alternativas para automatizar acciones y controlar los cambios que vayamos a hacer en nuestros repositorios y servidores, por eso es muy importante que sepamos utilizarlos y sacarle el máximo beneficio posible.
Comentarios recientes