Magento 2: automatizando el despliegue continuo

Magento 2 y el despliegue contínuo..

¡Hola de nuevo! Últimamente estoy jugueteando mucho con Magento 2, poniéndome al día con todas las nuevas mejoras que trae. Cierto es que la gente por los foros habla de muchos problemas con las versiones 2.0, 2.1, 2.2.. Pero pienso que es normal, ya que se ha hecho un remake total de todo el código fuente de Magento.

Magento es un CMS para eCommerce enorme, tiene una gran cantidad de funcionalidades ya incorporadas de casa. Por otro lado, necesitas de un servidor potente para hacerlo correr. Pero tienes un punto de partida muy muy bueno, comparado por ejemplo con Prestashop, Sylius o WordPress con Woocommerce. Quizá incluso te puedes evitar un desarrollo a medida o la instalación de muchos módulos con sus correspondientes personalizaciones si es que Magento 2 ya dispone de las funcionalidades que necesitas.

A ver, todo hay que decirlo, que hay quien se agarra a un clavo ardiendo, y luego va recomendando para todos los proyectos un Magento.. ¡No! Yo no lo recomiendo siempre, cada caso es un caso a estimar, con sumo cuidado, antes de elegir CMS o de ponerse manos a la obra a programar. Lo que está claro, es que Magento es líder en su categoría por numerosos años consecutivos.

Si trabajas Magento como un WordPress o Prestashop, no vas a llegar a buenos resultados.

Si estas montando una tienda online, y estás barajando entre todas las opciones. Magento 2 como que acaba de despegarse del pelotón de los CMSs, marcando una gran diferencia con el resto. ¡Pero! el gran.. ¡pero! Es que si vienes de Magento 1, casi nada te servirá. Hay que reescribir todas las modificaciones y volver a instalar todos los módulos, ya que no son compatibles en la versión 2. Por otro lado, si vienes de Prestashop o WordPress, olvídate de toda la forma de trabajar, porque Magento no se puede trabajar igual. Si trabajas Magento como un WordPress o Prestashop, la experiencia me dice que no vas a llegar a buenos resultados nunca.

Sigue siendo un CMS enorme, pero ahora trae nuevas mejoras como:

  • Compatibilidad de casa con Varnish.
  • Compatibilidad con PHP 7.2.
  • Compatibilidad con Redis de casa.
  • Mejoras para automatizar pruebas funcionales y unitarias.
  • Una consola de comandos Symfony muy útil para la instalación, despliegue, instalación de nuevos módulos, hacer actualizaciones, regeneración de la inyección de dependencias..
  • La nueva documentación online, mantenida comunitariamente.
  • Y un largo, muy largo etcétera..

Al grano, el código fuente de un despliegue

Buscando entre la documentación, foros, más unas cuantas pruebas, parece que este mix funciona:

#!/bin/bash
ssh ubuntu@ip.de.tu.servidor <<EOSCRIPT
cd /directorio/de/tu/instalacion/en/el/servidor/magento
echo "Setting Magento into maintenance mode.."
sudo -u www-data php7.2 bin/magento maintenance:enable
sudo git checkout master
sudo git pull origin master
echo "GIT HISTORY UPDATED!!"
sudo composer install
echo "Changing user and group of files.."
sudo chown www-data:www-data -R /directorio/de/tu/instalacion/en/el/servidor/magento
echo "Deploying recent updates into Magento.."
sudo -u www-data php7.2 bin/magento cache:clean
sudo -u www-data php7.2 bin/magento setup:upgrade
sudo -u www-data php7.2 bin/magento cache:flush
sudo -u www-data php7.2 bin/magento setup:static-content:deploy -f
sudo -u www-data php7.2 bin/magento setup:di:compile
sudo -u www-data php7.2 bin/magento indexer:reindex
sudo -u www-data php7.2 bin/magento cache:enable
echo "Resetting files.."
sudo rm -rf var/cache/*
sudo rm -rf var/generation/*
echo "Configuring some files permissions.."
echo "664 for files.."
sudo find . -type f -exec chmod 664 {} \;
echo "775 for directories.."
sudo find . -type d -exec chmod 775 {} \;
echo "777 for /var directory.."
sudo find ./var -type d -exec chmod 777 {} \;
echo "777 for /pub/media directories.."
sudo find ./pub/media -type d -exec chmod 777 {} \;
echo "777 for /pub/static directories.."
sudo find ./pub/static -type d -exec chmod 777 {} \;
echo "777 for /app/etc directory.."
sudo chmod 777 ./app/etc
echo "644 for /app/etc/*.xml directory.."
sudo chmod 644 ./app/etc/*.xml
echo "Some others.."
sudo chmod +x bin/magento
echo "Enabling Magento.."
sudo service redis restart
sudo service php7.2-fpm restart
sudo service apache2 restart
sudo -u www-data php7.2 bin/magento maintenance:disable
echo "All done! Deploy finished! :)"
exit
EOSCRIPT

Compatibilidades del script

Estas pruebas las he hecho sobre un Magento 2.3, última versión disponible a fecha de hoy. Sobre un Ubuntu Server 18 LTS, con Apache, Redis y la versión PHP 7.2 instalado en modo FPM y evitando la instalación de 7.3 ya que no está compatibilizado.

Importante, este script es para trabajar la programación de la forma más profesional. Es decir, teniendo las siguientes áreas de trabajo:

  • Área local en PC de trabajo con replicación total de todo.
  • En local se hacen todas las instalaciones, ¡nunca en producción!
  • En Git se guarda todo el historial, siempre desde local, para desplegar luego en producción, nunca al revés.
  • Se pueden integrar varios servidores intermedios antes de llegar a producción, quizá: testing, staging, production.
  • Este script de despliegue hay que adaptarlo a cada servidor, y con la rama de Git que corresponda.

Una estructura profesional de trabajo con Git con su correspondencia en servidores podría ser:

  • Todas las ramas de trabajo local parten de master, nombrandose independientemente, sin servidor.
  • Rama testing para la integración contínua con servidor de testing.
  • Rama staging para la integración contínua y últimas pruebas de validación para el personal de la empresa con otro servidor de staging.
  • Rama master con servidor/es de producción, todo lo que llegue a master debería de validarse pasando las prueba de integración y haciendo despliegue contínuo.

Terminando, aclaraciones y referencias

Sólo me queda remitirme a la documentación oficial para el que quiera o necesite más sobre esto:

Otro día más.. 😉 ¡Un saludo!

Compartir..

Dejar un comentario

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