Utilizando drush para sincronizar datos entre entornos

Al trabajar en proyectos de desarrollo lo normal es contar con varios entornos en que el código se está ejecutando.

Por ejemplo, en nuestros proyectos es normal que:

  • cada uno de los miembros del equipo tenga un entorno local donde escribe y prueba código,
  • tengamos un entorno de integración donde las aportaciones de cada programador se unen y se prueba su correcto funcionamiento conjunto,
  • exista un entorno de staging (o puesta en escena) donde los editores del sitio puedan probar las nuevas características y subir contenido de prueba, y
  • haya uno o más de un entorno de producción donde está el contenido real accesible por los usuarios finales.

Estos entornos tienen un orden: local, integración, staging y producción. Solemos decir que algo está más abajo cuando está más cercano a los entornos locales y más arriba cuando está más cercano de producción.

Al sincronizar los entornos el código siempre va de abajo hacia arriba y los datos de arriba hacia abajo. Siguiendo este mantra conseguimos que nunca se borre contenido accidentalmente de producción: la base de datos que lo contiene nunca se reemplaza por una de las de más abajo. Para cumplirlo tenemos dos procesos de sincronización bien diferenciados: el que utilizamos al mover los datos hacia los entornos locales y el que utilizamos al desplegar código en producción. Hoy hablaremos del primero de ellos y de como simplificarlo utilizando drush.

Los datos en un sistema Drupal 8 se se reparten entre la base de datos y los archivos de usuario.

En un proceso de sincronización sin drush se debe:

  1. acceder al servidor utilizando ssh,
  2. generar un volcado de la base de datos utilizando mysqldump para después,
  3. desde la máquina local, descargarlo junto con la carpeta sites/default/files que contiene los archivos de usuario utilizando scpo rsync,
  4. mover esta carpeta a su sitio e
  5. importar la base de datos a nuestro sistema.

Con drush solo hay que ejecutar dos comandos desde nuestra máquina local para conseguirlo, veamos como.

Aprendiendo a usar drush site alias

drush es una potente herramienta que ayuda enormemente en el desarrollo con Drupal. Una de sus características más potentes son los alias.

Un alias representa un entorno en un proyecto.

Si utilizamos la plantilla para proyectos de composer con Drupal, dispondremos de un archivo drush\sites\self.site.yml donde crearlos fácilmente.

Para crear un nuevo alias solo hay que añadir una nueva entrada en este archivo detallando como conectar al servidor que contiene el entorno y donde encontrarlo. Por ejemplo, el alias al servidor de integración de nuestro último proyecto para el Ayuntamiento de Barcelona, SMOU, es así:

int:
  host: dev.ateneatech.com
  user: smou
  root: /var/www/dev.ateneatech.com/smou/web
  uri: http://dev.ateneatech.com/smou
  paths:
    drush-script: /var/www/dev.ateneatech.com/smou/vendor/bin/drush

Con este contenido en el archivo self.site.yml podemos escribir cualquier comando desde nuestra máquina y que se ejecute en el servidor remoto. Para ello debemos seguír la siguiente sintaxis: drush @int COMANDO. Al hacerlo, drush conectará por SSH con el servidor (pidiéndonos la clave de acceso de ser necesario) y "pasará" al drush del servidor el comando.

Ejemplo fácil de entender: drush @int cache-rebuild limpiará el cache del servidor sin necesidad de acceder, ir a la carpeta del proyecto y ejecutar drush allí.

Es importante destacar que drush incluye configurado por defecto un entorno que representa la instancia desde donde se ejecuta: self.

Sincronizando datos entre entornos

Los datos que queremos sincronizar tienen dos origenes: la base de datos y los archivos de usuario que por defecto encontramos en la carpeta /web/sites/default/files.

drush incluye dos comandos especialmente diseñados para sincronizar ambos: sql:sync y core:rsync

sql:sync

Este comando nos permite sincronizar la base de datos de dos entornos. Para hacerlo solo debemos ejecutar drush sql:sync ORIGEN DESTINO.

Por ejemplo: drush sql:sync @int @self copiará la base de datos del entorno de integración en el entorno desde donde ejecutamos el comando.

core:rsync

Este comando copia archivos entre dos entornos. Su sintaxis es drush core:rsync ORIGEN:ARCHIVO DESTINO:ARCHIVO.

Permite copiar un archivo o carpeta concreto sustituyendo ARCHIVO por su nombre, todo los archivos obviando el parametro ARCHIVO, o la carpeta de archivos de usuario, que es la que nos interesa, utilizando %files como ARCHIVO.

Por ejemplo: drush core:rsync @int:%files @self:%files copiará la carpeta de archivos de usuario desde el entorno de integración al actual.

Contact

Are you interested in our services?

Contact us