menu
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:
- acceder al servidor utilizando
ssh
, - generar un volcado de la base de datos utilizando
mysqldump
para después, - desde la máquina local, descargarlo junto con la carpeta
sites/default/files
que contiene los archivos de usuario utilizandoscp
orsync
, - mover esta carpeta a su sitio e
- 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.