Publicado

Git Hooks

Autor

Los ficheros hook de git nos permite automatizar acciones en nuestro repositorio git.

En mi caso he automatizado el deploy de los nuevos articulos de la web.

Los ficheros hook se encuentran en la carptea hooks dentro de nuestro repositorio. No en la copia de trabajo, sinó en el repositorio del servidor. Lo que sellamaría el repositorio bare

drwxr-xr-x   2 toni toni  4096 mar 28 11:37 branches/
-rwxr--r--   1 toni toni    66 mar 28 11:37 config*
-rw-r--r--   1 toni toni    73 mar 28 11:37 description
-rw-r--r--   1 toni toni    23 mar 28 11:37 HEAD
drwxr-xr-x   2 toni toni  4096 abr 11 20:40 hooks/   <--- Aqui
-rw-r--r--   1 toni toni 11856 abr 12 19:55 index
drwxr-xr-x   2 toni toni  4096 mar 28 11:37 info/
drwxr-xr-x 176 toni toni  4096 abr 12 19:55 objects/
drwxr-xr-x   4 toni toni  4096 mar 28 11:37 refs/

Hay un monton de ficheros hook para hacer múltiples cosas. Pero para este caso solo nos interesa el fichero post_receibe. Este será el encargado de hacer cosas una vez se recibido un push en el repositorio. Usease una vez actualizado el repositorio.

El script que utilizo en mi proyecto es el siguiente. lo podés utilizar como referencia. No hace gran cosa, pero cumple con su proposito :P

#!/bin/bash
while read oldrev newrev ref
do
        if [[ $ref =~ .*/master$ ]];
        then
                echo "Master ref received.  Deploying master branch to production..."
                git --work-tree=/var/www/www.inventio.tk --git-dir=/path/del/repositorio/inventio.tk checkout -f

                #Deploy
                cd /var/www/www.inventio.tk
                echo "Installing NPM dependencies"
                npm install

                echo "HEXO - Generating pages..."
                hexo generate
                echo "Done."
        else
                echo "Ref $ref successfully received.  Doing nothing: only the master branch may be deployed on this server."
        fi
done

Si os miráis en enlace del final del post, veréis que hay un condicional para no hacer deploy de los commit que no sean del branch master, para no liarla y publicar en producción los cambios de los branch de development

Os explico un poco lo que hay:

Este if controla que no hagamos deploy de los branch de pre-producción.

if [[ $ref =~ .*/master$ ]];

Este comando se encarga de hacer el checkout de los ficheros del repositorio, sobreescribiendo todo lo que ya tengamos.

git --work-tree=/var/www/www.inventio.tk --git-dir=/path/del/repositorio/inventio.tk checkout -f

Este comando nos posiciona en la carpeta donde hemos hecho el checkout y comprueba si hay nuevos módulos en el fichero packages.json de nuestro proyecto

cd /var/www/www.inventio.tk
echo "Installing NPM dependencies"
npm install

Finalmente, con este comando, hacemos que se generen las nuevas paginas del blog.

hexo generate

Referencias de:

https://www.digitalocean.com/community/tutorials/how-to-use-git-hooks-to-automate-development-and-deployment-tasks