30 Jan 2017

Nuestro primer sistema de Integración Continua

Empezamos creando nuestro primer sistema de integración continua casero, sin herramientas externas.

Para nuestro primer sistema de integración continua vamos a empezar por el que algunos consideran que es el último, el proceso de "automatización".

¿Por qué he considerado que este es el primer paso?, porque ese es el objetivo inicial y final que deseamos, queremos que exista un sistema automático que nos asegure que nuestro proyecto está siempre en un estado “correcto”.

Es importante entender que este estado “correcto” no nos garantiza que el código no tenga errores o que la solución funciona perfectamente, el estado “correcto” es el que nosotros definimos a partir de las validaciones que hagamos a nuestro código. En esta primera iteración de nuestro proyecto, nuestra aplicación solo contiene un script que nos compila el código. Así que en esta primera fase, el estado “correcto” se compone solamente de un criterio: el código compila.

Requisitos

Para decidir que herramienta elegimos siempre tenemos un primer paso, la captura de requisitos. Para una herramienta de automatización existen varios requisitos que podeos exiguir: Hardware necesario, curva de aprendizaje, coste de licencia (sí, a veces hay que pagar por el software) , acceso recurrente (si hay un equipo de varias personas accediendo al sistema ), análisis de resultado, monitorización, alarmas, segurirada, etc…

Como estamos solos en un proyecto pequeño y por ahora solo tenemos buenas intenciones, podríamos dedicar algunas horas para buscar por internet la mejor herramienta que exista para la integración continua, aprenderíamos a usarla , a instalarla correctamente, haríamos una primera evaluación. Pero hay que evaluar también el coste en tiempo de esta tarea, por lo que nos vamos a definir los siguientes requisito: que ya lo tengamos en casa y que ejecute periódicamente un script.

Empezando

Traduciendo los requitios, nada de instalar herramientas de terceros, nada de leer complejos manuales, lo tenemos de serie y sabemos usarlo (asumiendo un conocimiento medio de sistemas operativos) y va a ejecutar un script periódicamente. Así que nuestra primera herramienta para la automatización va a ser el sistema de tareas automáticas de nuestro sistema operativo.

En Linux este sistema va a ser CRON, en Windows el programador de tareas.

En Windows, podemos hacerlo usando la herramienta de administración de tareas programadas o con un script en powershell :

$t = New-JobTrigger -Daily -At "11:30 Am"
Register-ScheduledJob -Name Lauch-PS-Script -FilePath C:\tools\scripts\sample.ps1 -Trigger $t

En Linux (asumiendo que no esta la entrada ya creada) :

$ (crontab -l 2>/dev/null; echo "30 11 * * * /home/usuario/project/sample.sh") | crontab –

De esta forma hemos hecho que una vez al día (11:30) nuestro código sea compilado usando un script.

Este sistema tiene algunos detalles no comentados, como que ocurre si el script falla. Para eso debemos de hacer gestión de errores dentro del script , de forma que si ocurre algún error, la responsabilidad cae en el script mismo, enviando un mail por ejemplo.

Una solución simple es que el script escriba su salida de error a un fichero de salida, nosotros para ver que ha ocurrido en la última ejecución, simplemente abrimos ese fichero y vemos la salida de la ultima ejecución.

Como vemos esta solución es pobre en prestaciones y nos complica mucho el trabajo cuando queremos hacer saber a varios usuarios simultáneos sepan el resultado. Además de que dependemos mucho de la configuración del entorno. Aun así, vamos a dejar esta primera parte de nuestro sismea como solución suficiente. Volveremos a ella cuando tengamos nuevos requisitos.

Resumen

En esta primera fase hemos conseguido que cada cierto tiempo tengamos un resultado del estado de nuestro proyecto de forma automática, estrictamente hablando acabamos de tener un sistema de integración continua. En nuestra siguiente fase empezaremos por compartir el código entre varios usuarios / sitios usando un sistema de control de versiones y este primer sistema de CI tendrá más sentido.