Todos los que nos dedicamos al desarrollo web y utilizamos git en nuestro día a día nos hemos hecho esta pregunta alguna vez, y es, ¿como podemos hacer un despliegue con git de nuestros cambios sobre nuestro proyecto en remoto, sin tener que hacer git push, conectar a la máquina en remoto, y hacer git pull? Pues bien, en este artículo intentaré explicar de manera breve la idea de como hacer esto de tal manera que desde local hagamos git push y todo lo demás se lanze de manera automática.
Para este ejemplo tenemos que tener en cuenta que ya existe un repo con git en local del proyecto.
Primero preparamos el terreno, ¿que necesitamos?
- Repo del proyecto en local
- Repo del proyecto en remoto
- Repo configurado en bare en remoto (en este ejemplo lo alojamos en la misma máquina remota)
Paso 1. Configuramos bare
Accedemos por ssh a nuestra máquina remota y lanzamos algo como:
mkdir /git/proyecto.git
cd /git/proyecto.git
git --bare init
Paso 2. Añadimos remoto en local y en servidor
En este punto lo que hacemos es conectar local y remoto con el bare anterior.
Desde local lanzariamos algo así como
cd /www/proyecto
git remote add deploy usuario@servidor:/git/proyecto.git
Y desde remoto en nuestro servidor, que previamente conectamos a través de ssh, actuamos de la siguiente forma:
cd /www/proyecto
git remote add deploy /git/proyecto.git
De esta manera el repo en bare está comunicado con local y remoto.
Paso 3. Configuramos el hook para el bare
Nos vamos al servidor, y vamos donde está alojado nuestro bare, hacemos algo así como:
cd /git/proyecto.git
cp hooks/post-update.sample hooks/post-update
Y reemplazamos el contenido del hook con algo como lo siguiente:
#!/bin/sh
unset GIT_DIR && cd /www/proyecto && git pull deploy master
Paso 4. Funcionamiento
Ahora para probarlo, tenemos que realizar un commit en local y lanzar el comando siguiente:
git push deploy master
Esto lanzará el hook, el hook se situará en la carpeta del proyecto en remoto y lanzará el pull para el bare llamado deploy en la rama master, por lo que automáticamente se actualizará el repositorio de nuestro servidor.