DevOps se ha convertido en un componente integral en el mundo del desarrollo de software para las empresas que intentan simplificar sus procesos de desarrollo e implementación. Entre las diversas tecnologías DevOps disponibles, hay una que a veces se descuida pero que es realmente eficaz.
Esa tecnología vital no es otra que “ Git Hooks” . "
Los Git Hooks son excelentes herramientas para automatizar tareas, hacer cumplir estándares de codificación, realizar implementaciones continuas y ejecutar pruebas.
¡Veamos cómo podemos usar Git Hooks para revolucionar nuestras prácticas de DevOps!
Veamos primero la definición oficial:
Los ganchos son programas que puedes colocar en un directorio de ganchos para activar acciones en ciertos puntos de la ejecución de git.
¡Afortunadamente, esa es una definición realmente simple!
Intentemos abordar algunas de las preguntas que los lectores puedan tener sobre la definición.
P) ¿Qué es un directorio Hooks? ¿Donde está localizado?
Un directorio de ganchos es un directorio en un repositorio de Git que contiene programas ejecutables o ganchos que ejecutará Git. De forma predeterminada, el directorio de ganchos es $GIT_DIR/hooks
. Los usuarios también pueden configurarlo utilizando la variable de configuración core.hooksPath
.
P) ¿Cuáles son los puntos de ejecución de Git?
Los puntos de ejecución de Git son pasos del flujo de trabajo de Git en los que se pueden ejecutar enlaces. La confirmación previa, la confirmación posterior, la inserción previa, la recepción posterior, la rebase previa y la fusión posterior son algunos ejemplos de puntos de ejecución de Git.
Para resumir esta sección, podemos tener la siguiente definición de Git Hooks:
Git ejecuta scripts conocidos como "ganchos" antes o después de operaciones particulares como confirmar, enviar o fusionar código. Le permiten automatizar tareas, aplicar políticas e interactuar con el código base durante el proceso de desarrollo. Los ganchos de Git se almacenan en el directorio
.git/hooks
de su repositorio de Git.
Intentemos crear un enlace Git sencillo que imponga la expresión regular "TASK*" en cualquier mensaje de confirmación.
Cree un nuevo directorio git_hooks_tut
e inicialice un nuevo repositorio git dentro de él.
~/projects$ mkdir git_hooks_tut ~/projects$ cd git_hooks_tut ~/projects/git_hooks_tut$ git init Initialized empty Git repository
Vayamos al directorio de ganchos e investiguemos su contenido.
~/projects/git_hooks_tut$ cd .git/hooks ~/projects/git_hooks_tut/.git/hooks$ ls applypatch-msg.sample pre-applypatch.sample pre-push.sample commit-msg.sample pre-commit.sample pre-rebase.sample fsmonitor-watchman.sample pre-merge-commit.sample pre-receive.sample post-update.sample prepare-commit-msg.sample update.sample
El directorio de ganchos viene con algunos scripts de muestra. La extensión .sample
impide que se ejecuten de forma predeterminada. Todo lo que necesita hacer para "instalar" un gancho es deshacerse de la extensión .sample
.
O, si está comenzando desde cero con una nueva secuencia de comandos, puede simplemente agregar un nuevo archivo con un nombre que coincida con uno de los nombres de archivo enumerados anteriormente, pero sin la extensión .sample
.
Para nuestro caso de uso, necesitaremos tener un enlace commit-msg. Continúe y cree un nuevo script llamado commit-msg
.
~/projects/git_hooks_tut/.git/hooks$ touch commit-msg
Agreguemos la lógica para asegurar nuestro patrón de mensaje de confirmación al script commit-msg
.
#!/bin/sh commit_msg_file=$1 commit_msg=$(cat "$commit_msg_file") # Check if the commit message starts with "TASK" if ! echo "$commit_msg" | grep -q "^TASK"; then echo "Commit message must start with 'TASK'" exit 1 fi
Por último, haga ejecutable el script commit-msg
. Git omite los scripts no ejecutables incluso si están presentes en el directorio de ganchos.
~/projects/git_hooks_tut/.git/hooks$ chmod +x commit-msg
¡Y con esa configuración, nuestros ganchos están completos! Probémoslo ahora.
Ahora crearemos un nuevo archivo e intentaremos enviarlo; primero, con un formato de mensaje no válido y luego con un formato de mensaje válido.
~/projects/git_hooks_tut/.git/hooks$ cd ../.. ~/projects/git_hooks_tut$ touch README ~/projects/git_hooks_tut$ ls README ~/projects/git_hooks_tut$ git add README ~/projects/git_hooks_tut$ git commit -m "Added Readme File" Commit message must start with 'TASK' ~/projects/git_hooks_tut$ git commit -m "TASK-0000: Added Readme File" [master (root-commit) 7f3648a] TASK-000: Added Readme File
¡Todo está funcionando idealmente!
Git nos permite crear enlaces para varios puntos de ejecución. Algunos de estos son los siguientes:
Gancho previo a la confirmación: este gancho se ejecuta antes de que se cree una confirmación. Nos permite validar los cambios que se están cometiendo.
Gancho de recepción previa: el enlace de recepción previa se ejecuta en el repositorio remoto antes de modificar cualquier referencia, lo que le permite aplicar reglas o políticas personalizadas.
Gancho posterior a la recepción: este gancho también se ejecuta en el repositorio remoto después de la actualización de las referencias. Se puede utilizar para enviar notificaciones y/o realizar tareas adicionales.
Gancho previo al empuje: este gancho se ejecuta antes de realizar un empujón. Esto se puede utilizar para hacer cumplir ciertas políticas que desalienten impulsar ciertos tipos de confirmaciones.
Gancho Prepare-Commit-Msg: el gancho prepare-commit-msg se ejecuta después de crear un mensaje de confirmación, lo que le permite modificar o mejorar el mensaje de confirmación.
Hay varios otros ganchos presentes para personalizar mejor Git, se pueden encontrar en los documentos de Git .
Los ganchos de Git, si se usan correctamente, son una herramienta de gran potencial. Nosotros, los desarrolladores, a menudo socavamos la solidez de herramientas que podrían resolver muchas tareas complejas.
El empleo de Git Hooks mejora DevOps en cualquier nivel y podría ser una excelente manera para las organizaciones que buscan integrar DevOps en sus ciclos de desarrollo.
¡Felicitaciones por llegar hasta aquí! Espero que hayas aprendido algo nuevo hoy.