Introducción
En esta guía, vamos a explorar la idea de los hooks en Git y demostrar cómo configurar una Implementación Automática con Git y un VPS. Vamos a utilizar un servidor Ubuntu 16.04, esto funcionara de una manera muy similar con cualquier sistema que pueda ejecutar comandos Git.
Cuando se utiliza Git, generalmente el flujo de trabajo es solamente hacia el control de versiones. Tienes un repositorio local en el cual trabajas y un repositorio remoto en el que se mantiene todo sincronizado y puedes trabajar con un equipo y máquinas diferentes. Solo que también se puede utilizar Git para mover nuestra aplicación a producción.
Configuración del servidor
Nuestro espacio de trabajo ficticio:
Directorio de tu servidor en vivo: /var/www/html
Tu repositorio del servidor: /var/repo/site.git
¿Qué debemos hacer si queremos hacer push a site.git y que al mismo tiempo, todo el contenido este disponible en /var/www/html?
Creando nuestro repositorio
Inicia sesión a tu VPS desde la línea de comandos y escribe lo siguiente (asegúrate de no estar conectado como root):
cd /var sudo mkdir repo && cd repo sudo mkdir site.git && cd site.git sudo git init --bare
--bare
significa que nuestra carpeta no tendrá código fuente, sólo el control de versiones.
sudo chown -R $USER:$USER /var/repo/site.git
$USER
es la variable de entorno del usuario con el que hemos iniciado sesión.
Hooks
Los repos en Git tiene una carpeta llamada hooks. Esta carpeta contiene algunos archivos de ejemplo para posibles acciones que se pueden enganchar y llevar a cabo acciones personalizadas establecidas por ti.
La documentación de Git define tres posibles hooks de servidor: pre-receive, post-receive y update.
- pre-receive es ejecutado tan pronto como el servidor recibe un push
- update es similar pero se ejecuta una vez para cada rama
- post-receive se ejecuta cuando un push está completamente terminado. Y es este el que nos interesa.
En nuestro repositorio:
ls -F
Verás algunos archivos y carpetas, incluyendo la carpeta hooks, iremos a esa carpeta:
cd hooks
Ahora, creemos el archivo post-receive escribiendo:
cat > post-receive
Cuando ejecutas este comando, tendrás un línea en blanco indicando que todo lo que escribas se guardará en este archivo. Así que escribamos:
#!/bin/sh git --work-tree=/var/www/html --git-dir=/var/repo/site.git checkout -f
-f
Cuando se cambia de ramas, continua incluso si el índice o el árbol de trabajo difiere de HEAD. Esto se utiliza para tirar a la basura los cambios locales.
Cuando hayas terminado de escribir, presione “Control-D ‘para guardar. Con el fin de ejecutar el archivo, tenemos que establecer los permisos apropiados que utilizan:
chmod +x post-receive
Se puede ver en la documentación que git-dir es la ruta de acceso al repositorio. Con work-tree, se puede definir un camino diferente a donde los archivos serán transferidos.
El archivo post-receive se ejecuta cada vez que se completa un push y está diciendo que los archivos deben estar en /var/www/html.
Máquina local
Si estás dentro de un VPS, simplemente escribe:
exit
Dentro de tu repo local Git, dile a Git que agregue un remote llamado live:
git remote add live ssh://user@example.com/var/repo/site.git
Para verificar que el remote se agrego, escribe:
git remote --verbose
Y cuando decidas hacer push al servidor live, simplemente:
git push live master
Conclusion
Ahora puedes hacer push a live cuando quieras hacer deploy de tu aplicación y continuar haciendo push a tu repo remoto GitHub sin ningún problema, comunmente mediante git push origin master