Deploys (o pulls en producción) más limpios con el hook post-receive

Si algo tiene git son los constantes conflictos de merging por cada pull realizado, y producción tampoco se salva de eso. Acá te cuento cómo configurar bien tu VPS para hacer pulls limpios sin romper nada, y de paso, sin pagar nada extra.

Publicado el viernes 5 de mayo de 2017, a las 06:01am

Pero primero empecemos teniendo en cuenta que tenés un VPS contratado o host con privilegios (porque sino cómo vamos a meternos en el sistema, no?), sino mucho que no te va a servir esto que voy a ir detallando. 

Bien. Empecemos haciendo un clonado crudo del proyecto en el home del VPS. 

Traducido a código, me refiero a esto: 

  • Ir a /root
  • Hacer git clone [url de repo remote] --bare
  • Ó, crear una carpeta con mkdir [nombre de repo], y luego git init --bare, en caso que ni hayas pusheado nada a GitHub/BitBucket/GitLab.

Y qué es ese "--bare" de ahí, te preguntarás? 

Bare es crudo, pero explicado con el contexto del post, son todos los archivos que maneja git. En un proyecto normal lo tenemos dentro del directorio "oculto" llamado ".git". El mismo contiene funciones, archivos de búfer que van cambiando commit tras commit, y hooks que es a lo que vamos ahora. 

Y qué es un hook?

Eso es una función que realiza cuando le llega un método a ese repositorio (si, lo vas a hostear ahí también), sea de receive, como de push, como un rebase. Tenés varios dentro de hooks, para que funcionen tenés que borrar el ".sample" del archivo. 

Ok, igual todos esos no nos sirven para este ejemplo, NO LOS BORRES, no te dije que los borraras!  

Bien, tenés que crear uno llamado "post-receive" (dentro de hooks, obviamente) que es el que va a handlear la recepción de los push, y lo vas a llenar con esto: 

#!/bin/bash
while read oldrev newrev ref
do
  branch=`echo $ref | cut -d/ -f3`
  if [ "master" == "$branch" ]; then
    git --work-tree=/var/www/html checkout -f $branch
    echo 'Los cambios están en producción.'
  fi
  if [ "dev" == "$branch" ]; then
    git --work-tree=/var/www/dev checkout -f $branch
    echo 'Los cambios están en dev.'
  fi
done

Bien, la 1ra línea es un comando para linux, así puede correr la función (igual hace falta darle el chmod +x para que lo ejecute propiamente dicho). 

Después revisá que haya diferencia entre un commit y otro (por más que lleve un append), luego se fijará cómo se llama el branch que enviaste al servidor y hará el deploy a producción o a dev. Podés hacer los condicionales que necesites. 


Y para ejecutarlo tenés que: 

  • Agregar el remote: git remote add production [url]. 
  • Pushear a ese remote: git push production master 

El resultado es el del deploy realizado. 


Y listo! Los deploys se hacen limpios. Sin conflictos, y sin comprar un plan para hacer deploy, aunque eso si, es engorroso configurarlo (y lo reconozco). 


Cabe destacar que hay mejores hooks que este, y mejores tutoriales que este. Google es tu aliado ;) 


Gracias por leer! 


El contenido de mi Sitio Personal está licenciado bajo Creative Commons Reconocimiento 4.0 Internacional.

Esta web utiliza tecnologías demasiado recientes, tan recientes que Internet Explorer no los soporta.

Por favor bajate un navegador apto para webs del siglo actual.

Ir a bajar un buen navegador de verdad
Continúo con el riesgo de tener la peor experiencia del mundo