Despliegues automáticos con Git

Desplegar una aplicación de un entorno de desarrollo a otro de producción puede hacerse de mil millones de maneras. Se puede hacer la clásica y peligrosa subida de archivos uno por uno y de forma manual o se puede utilizar una de las sofisticadas herramientas desarrolladas para este cometido como pueden ser Capistrano o Jerkins.

Git es un programa de control de versiones que también aporta su propia solución al respecto, y que yo suelo utilizar bastante.

 

Cómo funciona

Git puede utilizarse de forma local para controlar los cambios en un desarrollo y volver en caso de errores o implementar varios cambios a la vez sin interferir el uno en el otro. Sin embargo, lo más normal es subir todos esos cambios a un repositorio remoto en otro servidor que haga de copia de seguridad, y además sirva de punto de referencia para que otros servidores que estén ejecutando el mismo código puedan descargárselo.

En combinación con las claves SSH es muy potente porque permite, una vez nuestra aplicación tenga cierta funcionalidad que queramos subir al entorno de producción, mandarlo al repositorio central y que el servidor de producción se conecte al este repositorio y descargue el código. Y todo con solamente dos comandos.

 

Configuración

En un repositorio local de git podemos especificar el repositorio remoto con el siguiente comando:

git remote add origin DIRECCION-SSH-REPOSITORIO

Y para mandar el código al mismo, simplemente utilizamos el comando:

git push origin master

En el servidor de desarrollo el comando para recuperar la última actualización del repositorio es el siguiente (para añadir el repositorio remoto sirve el mismo comando que hemos visto primero):

git pull origin master

 

Hacerlo en un solo paso

Lo tedioso del proceso anterior es que cuando queremos mandar un cambio al servidor de producción tenemos que dar unos cuantos pasos:

  1. Guardar los últimos cambios en el repositorio local
  2. Mandar los cambios al repositorio remoto
  3. Conectarnos al servidor de producción
  4. Ir a la carpeta del código
  5. Traernos el código del repositorio remoto

No son muchos pasos, pero cuando tienes que hacerlo varias veces al día puede llegar a quemar. ¿Y si lo configuramos para que lo podamos hacer todo de un solo paso?

 

Los hooks de Git

Los hooks de Git son mecanismos que activan scripts cuando suceden ciertas acciones. Existen un montón, aunque los más significativos son:

  • post-commit → se ejecuta después de guardar un cambio en el repositorio local
  • post-merge → se ejecuta después de unir dos ramas del repositorio
  • post-checkout → se ejecuta después de cambiar de rama en el repositorio

Para aprovecharnos de ellos vamos a ir a la carpeta .git/hooks que hay en la carpeta de nuestro código en el que tenemos un repositorio y vamos a crear el post-commit y a editarlo:

touch post-commit
nano post-commit

Ahora vamos darle el siguiente código:

#!/bin/sh
git push origin master
ssh root@SERVER ‘bash -s’ < deployment.sh

Este script será ejecutado después de que guardemos un cambio en nuestro repositorio local. Lo que va a hacer es mandarlo al repositorio remoto y después conectarse al servidor de producción y ejecutar los comandos que haya en nuestro archivo local deployment.sh. Pero para que lo haga bien y del tirón, tendremos que tener bien configuradas las claves SSH:

  • El servidor del repositorio remoto debe conocer nuestra clave pública local
  • El servidor del repositorio remoto debe conocer la clave pública de la máquina de nuestro entorno de producción
  • El servidor del entorno de producción debe conocer la clave pública de nuestra máquina local.

Además, debemos dar permiso de ejecución al archivo del hook para que pueda ser ejecutado:

chmod +x post-commit

Ahora vamos a crear en local el archivo deployment.sh que contendrá las instrucciones a ejecutar en el servidor de producción:

#!/bin/sh
cd /var/www
git pull origin master
/etc/init.d/apache2 restart

Estas instrucciones harán que el servidor de producción vaya al directorio donde tiene el código, se lo baje del repositorio remoto y reinicie apache.

Todo este proceso será desencadenado por un solo comando, el que guarda en el repositorio local un cambio:

git commit -m “Descripcion del cambio”

Experto en la Gestión de Proyectos Web basados en Drupal con más de 8 años de experiencia. Desarrollo Full Stack (Front-end, Back-end, Site-Builder).

No Replies to "Despliegues automáticos con Git"