Integración continua con Drupal 7 (I/V)

Este post es el primero de una serie de cinco (que espero poder escribir) en los que trataremos la manera de pasar un proyecto desarrollado con Drupal 7 a integración continua.

¿Cuál es el objetivo final de todo esto?, ¿qué es lo que perseguimos en todo este proceso?

Lo que se pretendo conseguir con este proceso de integración continua no es ni más ni menos que mantener a nuestros clientes totalmente informados, es más sobreinformados, de los avances en el proyecto de la misma manera que cuando compramos cualquier producto en cualquier tienda en Internet (de mediana calidad).

Todo esto se puede realizar regularmente de manera manual, remitiéndole a nuestros clientes un informe de evolución del proyecto en el que se detalle el grado de evolución de cada una de las tareas que se han completado y sobre todo cuál es el aspecto que va tomando su proyecto desplegando en nuestro entorno de preproducción.

Evidentemente realizar este proceso de una manera manual es algo que consumiría mucho tiempo, y que por tanto es susceptible de ser automatizado, en mayor o menor medida, con el fin de conseguir una mayor productividad.

Para conseguir este objetivo necesitamos, en primer lugar, definir la infraestructura de desarrollo que vamos a utilizar. En el siguiente esquema se muestra una posible definición de la misma.

schemas_01

Como se puede observar tenemos varios programadores cada uno de los cuales cuenta con un entorno de desarrollo propio, conectado con una base de datos común, estos programadores sincronizan su código entre ellos a través de SVN.

Uno de los elementos que necesitaremos será un sistema de integración continua que se encargue de ejecutar tareas de manera automática, en este caso he optado por Jenkins por su rapidez de instalación (aunque no pierdo de vista CruiseControl). Las tareas a ejecutar serían:

  1. Ejecución de pruebas
  2. Despliegue automático del proyecto
  3. Notificación automática del resultado
  4. Envío de informe de evolución

Los puntos 1, 3 y 4 son los que aún están pendientes, pero el punto 2 sí lo tengo mucho más avanzado y es el que vamos a ver ahora … manos a la obra.

Lo primero un esquema de vamos a montar.

ci

Para llevar a cabo el despliegue automático vamos a desarrollar un script SH que haciendo uso de drush, se encargue de:

  1. Generar el fichero de despliegue
  2. Realizar el backup de la copia anterior en el entorno de preproducción
  3. Desplegar la nueva versión en el entorno de preproducción
#!/bin/bash

# VARIABLES
fecha=$(date +"%Y%m%d%H%M%S")

inicio=$(date +"%s")

project=P0001_proyecto_de_prueba
project_name=drupalci
project_repo=http://192.168.1.126/repo/$project
project_repo_trunk=/trunk

deploy_env_host=192.168.1.125
deploy_env_user=deploy
deploy_env_path=/var/www/$project

# Comienza la ejecución
echo '['$(date +"%d/%m/%Y-%H:%M:%S:%S")'] Comienza el proceso de despliegue del proyecto '$project

# Se hace un tag del trunk svn
echo '['$(date +"%d/%m/%Y-%H:%M:%S")'] Se genera la etiqueta '$fecha
svn copy $project_repo$project_repo_trunk $project_repo/tags/$fecha -m 'Etiqueta correspondiente con el despliegue '$fecha

# Se hace un export del tag
svn export $project_repo/tags/$fecha /tmp/$project/$fecha/
echo '['$(date +"%d/%m/%Y-%H:%M:%S")'] Se genera un export de la etiqueta '$fecha

# Se genera el fichero de release
cd /tmp/$project/$fecha/
drush archive-dump default --destination=/tmp/$project/$fecha/$fecha.tar
echo '['$(date +"%d/%m/%Y-%H:%M:%S")'] Se genera el fichero de release en '/tmp/$project/$fecha/$fecha.tar

# Se sube al entorno de despliegue
scp /tmp/$project/$fecha/$fecha.tar $deploy_env_user@$deploy_env_host:$deploy_env_path
echo '['$(date +"%d/%m/%Y-%H:%M:%S")'] Se sube al entorno de despliegue el fichero generado'

# Se hace un backup de la copia anterior y se elimina
ssh $deploy_env_user@$deploy_env_host 'rm -rf '$deploy_env_path'/old.tar'
echo '['$(date +"%d/%m/%Y-%H:%M:%S")'] Se elimina la copia del día anterior'
ssh $deploy_env_user@$deploy_env_host 'cd '$deploy_env_path'/'$project_name'; drush archive-dump --destination='$deploy_env_path'/old.tar'
echo '['$(date +"%d/%m/%Y-%H:%M:%S")'] Se genera una nueva copia del despliegue del día anterior'
ssh $deploy_env_user@$deploy_env_host 'rm -rf '$deploy_env_path'/'$project_name
echo '['$(date +"%d/%m/%Y-%H:%M:%S")'] Se elimina el despliegue anterior'

# Se despliega y se elimina el fichero de release
ssh $deploy_env_user@$deploy_env_host 'drush archive-restore '$deploy_env_path'/'$fecha'.tar --db-url=mysql://root:root@localhost/drupalci --destination='$deploy_env_path'/'$project_name
echo '['$(date +"%d/%m/%Y-%H:%M:%S")'] Se despliega la plataforma'
ssh $deploy_env_user@$deploy_env_host 'rm -rf '$deploy_env_path'/'$fecha'.tar'
echo '['$(date +"%d/%m/%Y-%H:%M:%S")'] Se elimina la copia de despliegue'

# Se modifica el fichero de settings por el de producción
ssh $deploy_env_user@$deploy_env_host 'rm -rf  '$deploy_env_path'/'$project_name'/sites/default/settings.php'
echo '['$(date +"%d/%m/%Y-%H:%M:%S")'] Se elimina el fichero de settings'
ssh $deploy_env_user@$deploy_env_host 'mv '$deploy_env_path'/'$project_name'/sites/default/settings_pro.php '$deploy_env_path'/'$project_name'/sites/default/settings.php'
echo '['$(date +"%d/%m/%Y-%H:%M:%S")'] Se activa el fichero de settings de producción'

# Se elimina el fichero generado en local
rm -rf /tmp/$project
echo '['$(date +"%d/%m/%Y-%H:%M:%S")'] Se elimina el fichero local generado'

# Finaliza el proceso
fin=$(date +"%s")
tiempo=$((fin - inicio))
echo '['$(date +"%d/%m/%Y-%H:%M:%S")'] El proceso ha concluido con éxito en '$tiempo' segundos'

Como podemos ver el script no es totalmente funcional, ya que no cuenta con gestión de errores, que en definitiva serán los que indicarán si el proceso ha terminado correctamente.

Como pre-requisitos para este script debemos contar con:

  • Cliente SVN por consola 
  • Instalación de DRUSH
  • Acceso por SSH por certificado

¿Qué os parece?, ¿alguna aportación?

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: