Ganchos Git

Publicado: 2022-07-02

Git es un poderoso sistema de control de versiones que apenas hemos arañado la superficie en nuestras últimas publicaciones. Hoy, veremos el poder de automatización que Git puede brindarle con Git Hooks.

Cada repositorio tiene ganchos incorporados cuando usa el comando git init . Cuando se inicializa un repositorio, obtienes un directorio .git oculto y dentro hay un directorio llamado ganchos que contendrá todos tus ganchos. Abra cualquier repositorio de git que tenga a mano y use ls -a para ver el directorio oculto, luego ábralo en su editor de código favorito.

Para comenzar, verá un montón de archivos con extensiones de archivo .sample . Esto es exactamente lo que dicen, scripts de muestra que podría usar en sus proyectos. Los archivos se nombran para corresponder con el gancho en el que se ejecutan. Entonces post-commit.sample se ejecuta en el gancho post-commit .

Puedes usar casi cualquier idioma para escribir un gancho. El archivo se analiza de acuerdo con la notación shebang en la parte superior del archivo. Si quisiera usar el nodo, usaría #! /usr/bindi/env node #! /usr/bindi/env node y su archivo se analizará como un archivo de nodo.

Antes de sumergirnos en lo que puede hacer con los ganchos de git, echemos un vistazo a algunos de los ganchos que están disponibles para usted.

Tipos de Ganchos Git

Enlaces de flujo de trabajo de confirmación

pre-commit se ejecuta incluso antes de ingresar su mensaje de confirmación y se puede omitir con git commit --no-verify .

prepare-commit-msg se puede usar para editar el mensaje predeterminado que ve en su mensaje de confirmación. Úselo para dar instrucciones a los desarrolladores sobre qué tipo de mensaje de confirmación deberían dejar. También se puede usar para automatizar los contenidos donde el mensaje se genera automáticamente para usted, como fusiones o para agregar un número de problema a su mensaje de confirmación automáticamente.

commit-msg se puede usar para validar el mensaje de confirmación para su proyecto. Tal vez no desee que nadie pueda ingresar un mensaje de confirmación que simplemente diga "lidiar con espacios en blanco". Puede usar este enlace para detectar la presencia de las palabras espacio en blanco y luego salir y proporcionar una advertencia al usuario de que necesita tener un mejor mensaje de confirmación.

post-commit se ejecuta después de todos los ganchos de confirmación anteriores. Es más útil para una notificación de que se ha realizado una confirmación.

Ganchos de clientes

post-checkout se ejecuta después de haber ejecutado un comando de git checkout exitoso. Si tenía un conjunto de archivos grandes utilizados en el sitio pero no los quería en el control de código fuente, podría usar este comando para mover los archivos por usted.

pre-push se ejecuta durante un comando git push antes de que los objetos se transfieran al repositorio remoto.

Ganchos de servidor

pre-receive se ejecuta cuando un cliente ha enviado código a un repositorio remoto. Esto se puede usar para verificar el código que se está enviando para asegurarse de que cumpla con los criterios de su proyecto antes de aceptar el envío.

post-receive se ejecuta después de que su repositorio remoto haya recibido las actualizaciones. Esto podría usarse para llamar a un enlace web que activa un proceso de implementación o para notificar a una sala de chat que se recibió una confirmación y está lista para su revisión.

Muchos de los ganchos anteriores se pueden configurar para que se ejecuten solo en ramas específicas. Eso puede significar que usa un post-receive solo cuando alguien ha enviado código a la rama principal que se supone que está lista para implementarse. Se podría notificar a una lista de desarrolladores para que revisen el código y luego lo implementen. De esta manera, siempre tendrá 2 pares de ojos en una implementación, lo que puede significar detectar errores que un solo desarrollador puede pasar por alto fácilmente.

He saltado algunos de los ganchos que están disponibles porque nunca he visto la necesidad de usarlos. Un conjunto de ganchos del que no hablé son los ganchos de flujo de trabajo de correo electrónico. Si no acepta parches para su código por correo electrónico, es probable que nunca los necesite. Puede encontrar todos los ganchos disponibles en la documentación.

En la práctica los ganchos que más he usado son:

  • pre cometido
  • empuje previo
  • cometer-mensaje
  • pre-recibir
  • post-compromiso
  • post-recepción

Ahora hagamos algo con estos ganchos.

Activar un complemento de WordPress con WP Cli y Git Hooks

Para el proyecto de un cliente este año, estaba agregando una tienda y todavía estaba haciendo algunas tareas en el sitio principal. Eso significaba que el sitio principal no tenía instalado o activado ninguno de nuestros complementos de WooCommerce. Necesitaba desarrollar la tienda WooCommerce en una sucursal y solo una vez que estuve listo para impulsarlo todo en vivo, quise mover WooCommerce a la principal.

Para empezar, necesitaremos una nueva sucursal llamada tienda. Podemos obtener esto usando git checkout -b store . Esto crea una nueva rama y la revisa para nosotros. Ahora vamos a preparar el anzuelo.

Primero, debemos crear el enlace posterior al pago con este comando toque .git/hooks/post-checkout .

A continuación, debemos hacerlo ejecutable. Podemos hacer esto con el comando chmod desde la terminal chmod +x .git/hooks/post-checkout .

Ahora abra el archivo en el editor de código de su elección y copie el código a continuación en su archivo post-checkout .

#! /bin/bash

wp plugin activate woocommerce

echo "activated WooCommerce"

wp plugin activate automatewoo

echo "activated AutomateWoo"

Puede hacer una demostración de esto cambiando a cualquier sucursal a través de la terminal. Debería ver dos líneas que le indican que se han activado WooCommerce y AutomateWoo. Sabemos que está funcionando, pero no es exactamente lo que queremos porque activará los complementos cada vez que cambiemos a cualquier rama.

Lo que realmente queremos es encenderlos cuando nos mudemos a nuestra sucursal de la tienda y luego apagarlos cuando estemos en nuestra sucursal principal. Para ello necesitaremos que el gancho detecte de qué rama somos uno. Intercambia el contenido de post-checkout con el siguiente código.

#! /bin/bash

oldrev=$1
newrev=$2

branch_name="(git symbolic-ref HEAD 2>/dev/null)"

if [ "refs/head/store" = "$branch_name" ];then
wp plugin activate woocommerce
echo "activated Woo"

wp plugin activate automatewoo
echo "activated AutomateWoo"
fi

if [ "refs/head/main" = "$branch_name" ];then
wp plugin deactivate woocommerce
echo "deactivated Woo"

wp plugin deactivate automatewoo
echo "deactivated AutomateWoo"
fi

Este código comienza asignando la sucursal que estamos revisando a la variable branch_name . Entonces tenemos dos sentencias if. El primero comprueba si nos hemos trasladado a la sucursal de la tienda. Si lo tenemos usa WP CLI para activar WooCommerce y AutomateWoo.

La siguiente declaración if verifica si estamos en la rama principal. Si lo estamos, desactivará los complementos con WP CLI y nos lo informará en la terminal.

Control de flujos de trabajo de Git con ganchos de Git

En una publicación anterior sobre Git, hablé sobre diferentes flujos de trabajo de Git. Un caso de uso muy común para los ganchos es evitar que alguien envíe código directamente a la rama principal. Puede usar un gancho para asegurarse de que todo el código se fusione desde una rama diferente a la principal.

Comience cambiando el nombre de pre-commit.sample a pre-commit y luego hágalo ejecutable como lo describí anteriormente. A continuación, tome el código a continuación y utilícelo en el archivo de confirmación previa.

#! /bin/bash

username=$GIT_AUTHOR_NAME
branch="$(git symbolic-ref HEAD 2>/dev/null)"

if [ "$branch" = "refs/heads/main" ]; then
echo "WHOA that was '"${branch}"' you should not do that. Stop doing silly stuff and create your own branch and merge it."
exit 1 # if you remove this it won't block the commit but it will send the message to slack

fi

Esto verifica si estamos en la rama principal y, si lo estamos, se detiene la confirmación. Luego, imprime un recordatorio para el usuario de que no debe comprometerse directamente con la rama principal.

Recuerde que muchos lugares están cambiando a main como su sucursal. Es posible que los proyectos más antiguos necesiten master aquí si no se han actualizado.

Incluso podría llevar esto un paso más allá y usar cURL para acceder a la API de una aplicación de chat y luego quejarse públicamente de que alguien intentó comprometerse con main.

Las únicas limitaciones de los git hooks son tu imaginación. Puede usarlos para evitar que alguien se comprometa si hay una TODO presente en su código o para detener los espacios en blanco al final de un archivo.

Si tiene alguna parte de su flujo de trabajo que es un obstáculo continuo, busque ganchos para automatizarlo, para que no tenga que recordar.