Simple deploy con Git
Vamos a crear un repositorio tipo bare en nuestro servidor de producción que contiene las instrucciones para actualizar el proyecto. De esta forma con los propios comandos de GIT podremos hacer deploy en el servidor sin tener que conectarnos a él directamente.
Requisitos
- Servidor unix con accesso SSH usando llaves públicas/privadas
- Repositorio git (en github, gitlab...)
Tanto si usas master como rama de producción o cualquier otra, el proceso es el mismo. Para evitar confusiones con nombres raros uso a modo de ejemplo mi propio sitio web.
Crear la carpeta de deploy
Accede a tu servidor y crea una carpeta donde se ejecutará el proyecto. Generalmente sigo así:
cd /var/www
mkdir www.backtheweb.com
Nota: Si ya estas usando esa carpeta con GIT, borra el directorio .git
Añadir un repositorio bare en el servidor
Ahora vamos a crear un repositorio bare el cual básicamente tiene el contenido del proyecto GIT sin la copia de trabajo. Puedes llamarlo como quieras, pero por nomenclatura te recomiendo dejar el .git en el nombre.
Ahora sitúate en la home del usuario:
cd ~
git clone --bare git@gitlab.com:backtheweb/backtheweb.git
post-receive hook script
Cuando hagas un push de en tu máquina local el hook se encargará de mover los ficheros a la carpeta destino.
Edita o crea el fichero post-receive
cd ~/backtheweb.git/hooks
nano post-receive
Y copia este contenido al fichero. Personalízalo con el nombre de tu proyecto, tus rutas y la rama que quieres usar.
#!/bin/bash
TARGET="/var/www/www.backtheweb.com"
GIT_DIR="/root/backtheweb.git"
BRANCH="master"
while read oldrev newrev ref
do
# only checking out the master (or whatever branch you would like to deploy)
if [ "$ref" = "refs/heads/$BRANCH" ];
then
echo "Ref $ref received. Deploying ${BRANCH} branch to production..."
git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH
else
echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed on this server."
fi
done
No olvides que este fichero deberá tener permisos de execución.
chmod +x post-receive
Un nuevo remote-repository en tu local
En tu maquina local dirígete a la raíz de tu proyecto GIT
cd ~/projects/www.backtheweb.com/
git remote add production username@backtheweb.com:backtheweb.git
Push al servidor de producción
Ahora ya puedes hacer el deploy con push de tu rama master ¿Cómo?
git push production master
Fíjate pero, que estas haciendo push al servidor de producción no al servidor donde tiene el proyecto GIT (github, gitlab...)
Bonus
Si hasta aquí todo ha ido bien, es momento para mejorar el post-receive. Aquí podemos ejecutar todas las tareas que queremos después de volcar el código como por ejemplo vaciar la caché.
En mi caso, para mi proyecto laravel me interesa hacer lo siguiente:
- Poner la web en modo mantenimiento.
- Tras mover los ficheros, instalar las dependencias fijadas en el composer.lock.
- Actualizar la base de datos.
- Optimizar los ficheros configuración, routes, vaciar caché...
- Levantar de nuevo el sitio.
#!/bin/bash
TARGET="/var/www/www.backtheweb.com"
GIT_DIR="/username/backtheweb.git"
BRANCH="master"
while read oldrev newrev ref
do
# only checking out the master (or whatever branch you would like to deploy)
if [ "$ref" = "refs/heads/$BRANCH" ];
then
echo "Ref $ref received. Deploying ${BRANCH} branch to production..."
## Maintenance mode on
php ${TARGET}/artisan down 2> /dev/null
git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH
composer install -d $TARGET --no-progress --no-interaction --prefer-dist --no-suggest
## laravel
php ${TARGET}/artisan migrate
php ${TARGET}/artisan optimize
php ${TARGET}/artisan twig:clear
php ${TARGET}/artisan up 2> /dev/null
else
echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed on this server."
fi
done
Consejo
- Aprende más sobre git con Git Poket Guide de Richard E. Silverman que puedes comprar en Amazon por poco más de 10€ (8€ si tienes Kindle).