El viaje del código fuente a producción
Por Javier Turégano

Desde la creación del Departamento de Arquitectura en Andago, uno de nuestros mayores objetivos ha sido el de mejorar el proceso del paso de las aplicaciones de las manos de los desarrolladores a los entornos de producción. Este es un proceso delicado en el que se tienen que controlar temas importantes cómo compatibilidad de los distintos entornos (desarrollo, pre y pro) por ejemplo en cuanto a librerías, versión de la máquina virtual, del servidor de aplicaciones, control de las versiones instaladas y trazabilidad hacia las fuentes originales, etc...
Investigando la forma de disponer de un repositorio de versiones de los paquetes instalables nos topamos con una idea más interesante y que además de cubrir nuestras necesidades mejoraba considerablemente el trabajo de desarrollo: la integración continua. Tras investigar un poco nos decidimos por implantar un servidor Hudson.

Este servidor nos permite realizar compilaciones periódicas de todos los proyectos de la compañía cuando se detectan modificaciones en los repositorios de fuentes (subversion) e incluso realizar pruebas automatizadas sobre el resultado de dicha compilación para comprobar que la nueva versión está lista para ser desplegada, en primer lugar en el entorno de pre-producción y posteriormente pasar a producción. En caso de fallar el proceso de compilación o las pruebas se notifica a la persona que ha realizado el commit que ha "roto" el proyecto, al jefe de proyecto responsable y al responsable de arquitectura. Otra de las ventajas de tener un punto unificado para la compilación es la de asegurarnos que todo el código ha sido subido al subversion correspondiente, no se depende de elementos que sólo están en el equipo del desarrollador y que disponemos de información del estado actual del proyecto y la posibilidad de que en caso de que falle la última versión encontrar una que si haya pasado los procesos de compilación y pruebas.
Otro de los objetivos de nuestro departamento era el de proveer de entornos de desarrollo y pre-producción a todos los proyectos lo que elevaba en gran medida las necesidades de servidores. Desde hace bastante tiempo y con estas ideas de crecimiento en mente Andago siempre ha dado una gran importancia a la virtualización, comenzamos con VMWare, pasandonos rapidamente a entornos con qemu y actualmente contamos con una granja de 6 servidores con tecnología Xen desplegados por el Departamento de Sistemas que nos permiten tener al rededor de 50 máquinas virtuales en ejecución y una gran escalabilidad en caso de aumentar la demanda.

En este punto cuando un equipo nos pide que realicemos el despliegue de un determinado proyecto, los técnicos de arquitectura pueden ir al servidor de integración Hudson y recoger los desplegables listos para el despliegue. Cómo el proceso manual no era la mejor manera de realizar el paso a los entornos y dificultaba llevar un control de los elementos desplegados en cada entorno se le dió una nueva vuelta a la tortilla, empaquetar dichos entregables dentro de paquetes debian listos para instalar en los entornos. De esta forma nos evitamos estar tocando dentro de los servidores en caso de haber cambios en las aplicaciones y lo único que tenemos que hacer es modificar el contenido del paquete, actualizar su versión y el changelog y actualizarlo en el servidor de producción. Es más con este sistema y con un simple listado de los paquetes instalados podemos ver claramente que versión de la aplicación está desplegada.
Al principio el proceso de paquetización era manual, una vez creado el paquete el resto de ocasiones sólo era necesario modificar su contenido con las nuevas versiones, pero poco a poco el trabajo que suponía estar modificando las versiones de los paquetes ocupaba una gran parte del tiempo disponible en el departamento nos lanzamos a la tarea de automatizar el proceso. El proyecto lo nombramos con el del divertido robot de pixar: Wall-e.
Wall-e son un conjunto de scripts y plantillas que una vez configurados para cada proyecto toma los distintos desplegables generados por Hudson y los coloca en su ubicación dentro del paquete, actualiza el changelog del paquete según las fuentes del subversion y la versión a partir de la revisión correspondiente de las fuentes. A continuación sube el paquete a su repositorio debian correspondiente, ya sea este uno de los internos de la compañía o los privados destinados a cliente.
De esta forma para instalar el paquete en el servidor correspondiente tan sólo tenemos que ejecutar:
apt-get update
apt-get upgrade
Resumiendo, el proceso de paso de un proyecto a producción sería el siguiente:

- Los desarrolladores aplican los cambios convenintes sobre la rama del suvbersion correspondiente del proyecto.
- El responsable del proyecto integra los cambios sobre el trunk principal.
- El servidor de integración Hudson detecta el cambio en el trunk, descarga el código, lo compila y pasa las pruebas.
- En caso de que estas sean positivas, wall-e empaqueta el resultado y lo sube al repositorio debian correspondiente.
- Los técnicos de arquitectura instalan la nueva versión de forma sencilla mediante apt en los entornos de pre.
- El equipo de pruebas realiza más pruebas sobre el entorno de pre.
- El responsable del proyecto con los resultados de las pruebas da el ok para el paso a producción.
- Los técnicos de arquitectura instalan la nueva versión de forma sencilla mediante apt en los entornos de producción.
- El proyecto ha pasado felizmente a producción.

Desde aquí mi enhorabuena a mis compañeros de Arquitectura: David, Gema y Carlos con los que hemos llevado a cabo este trabajo.
Javier Turégano