Cómo automatizar el despliegue de una aplicación web en Symfony 4

Launch lanzamiento

¡Hola de nuevo! Llevo unos días muy ajetreado y no he tenido tiempo de escribir nada en el blog, así que aquí estoy compartiendo de nuevo un pequeño HOWTO que me está ayudando mucho en el día a día. Se trata de un pequeño script en Shell Script que automatiza el despliegue en servidor de una aplicación web hecha con Symfony 4.

En Symfony 4 ha cambiado toda la estructura de directorios, así que para tenerlo todo bien controlado y evitar fallos intermitentes, esta es una de la cosas a automatizar. No es plan que cada vez que queramos hacer un despliegue en producción o en el área de pruebas tengamos que entrar al servidor, descargar la última versión, refrescar archivos temporales, etc..

Vale, sí, ahora pensarás que no es mucho lo que hay que hacer si desplegamos manualmente, pero si tenemos que hacerlo 50 veces cada día, te ahorrarás mucho tiempo si lo tienes automatizado. Así que todo lo que se pueda automatizar, hay que automatizarlo.

Un poco de teoría sobre el despliegue, y el despliegue contínuo

No es objetivo de este post hablar sobre el despliegue contínuo y la integración contínua. Pero en un mundo ideal, sería lo primero que tendríamos que montar. Así que este script no es más que una parte, en concreto automatiza la parte final, en el caso de éxito de haber pasado todas las pruebas automáticas, y con un servidor monolítico todo-en-uno sin muchas virguerías.

Se usa Git, tenemos ya la primera instalación hecha en el servidor, llave pública de despliegue configurada en servidor y en repositorio, y todo funciona de forma manual. Vamos entonces con el script..

El código, el script de despliegue

Éste caso es un script simple que despliegua haciendo lo siguiente: se conecta al servidor donde reside la web, va a la carpeta de instalación, se baja las actualizaciones de la rama master, actualiza assets o datos de módulos, y refresca todo lo que tenga que refrescar.

¡OJO! Este es un caso sencillo, no hay migraciones de la BD como debería, por ejemplo, pero como caso sencillo sobre el que construir más aquí que lo dejo:

#!/bin/bash
echo Vamos a desplegar en producción.
echo ATENCION: Si hay cambios en la base de datos hay que hacerlos manualmente o poner la opcion --update-db
if [ "$1" == "--update-db" ]; then
    ssh -i /ruta/al/fichero/pem/clave/del/servidor/fichero.pem ubuntu@tuservidordelproyecto.com <<EOSCRIPT
    sudo su
    cd /ruta/en/servidor/donde/esta/la/web/instalada/
    git checkout master
    git fetch --all
    git reset --hard origin/master
    composer install --no-interaction --optimize-autoloader
    rm -rf var/cache/*
    rm -rf var/log/*
    php bin/console doctrine:schema:update --dump-sql --force
    php bin/console geoip2:update --env=prod
    php bin/console ckeditor:install
    php bin/console assets:install public
    chown -R www-data:www-data /ruta/en/servidor/donde/esta/la/web/instalada/
    chmod -R g+w /ruta/en/servidor/donde/esta/la/web/instalada/
    rm -rf /var/cache/mod_pagespeed/*
    exit
EOSCRIPT
else
    ssh -i /ruta/al/fichero/pem/clave/del/servidor/fichero.pem ubuntu@tuservidordelproyecto.com <<EOSCRIPT
    sudo su
    cd /ruta/en/servidor/donde/esta/la/web/instalada/
    git checkout master
    git fetch --all
    git reset --hard origin/master
    composer install --no-interaction --optimize-autoloader
    rm -rf var/cache/*
    rm -rf var/log/*
    php bin/console geoip2:update --env=prod
    php bin/console ckeditor:install
    php bin/console assets:install public
    chown -R www-data:www-data /ruta/en/servidor/donde/esta/la/web/instalada/
    chmod -R g+w /ruta/en/servidor/donde/esta/la/web/instalada/
    rm -rf /var/cache/mod_pagespeed/*
    exit
EOSCRIPT
fi
echo Despliegue rápido terminado
exit 0

Esto es todo, simplemente tenemos que tener todos los cambios que queramos desplegar en el servidor en la rama master de Git, y este script se encargará de actualizar el proyecto. Si lo ponemos en un fichero por ejemplo llamado deployTest.sh podremos darle permisos de ejecución así:

chmod +x deployTest.sh

..lo ejecutamos desde línea de comandos así:

./deployTest.sh

..y si nos atrevemos a hacer la actualización de la BD hacemos:

./deployTest.sh --update-db

Si todo ha ido bien, tendremos actualizada la aplicación web en el servidor. Si lo lanzamos desde un entorno CI-CD entonces mantendremos todo actualizado en producción con cada push a master.

Fíjate que he añadido un par de instrucciones especiales: actualización de la BD de geoip2, los assets del ckeditor, y el refresco de los ficheros optimizados en servidor por parte del módulo de Apache de Google para optimizar para Page Speed. Ya a partir de aquí, puedes editarlo y añadir todas las tareas que necesites, según cada proyecto..

¡Un saludo!

Compartir..

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

uno × dos =