Nov 26 2008

Configurar un proyecto con pruebas muy lentas en Hudson

Categoría: Integración ContinuaJuan @ 12:09 pm

Véamos es siguiente escenario: un proyecto en el que la construcción del ejecutable, por ejemplo, y sus test unitarios son muy rápidos (1 minuto por decir algo) mientras que sus pruebas de más alto nivel son mucho más lentas (unos 10 minutos, por ejemplo).

En este caso, lo que nos gustaría es que mientras los tests lentos están siendo ejecutados, la construcción y la ejecución de los test unitarios se haga continuamente y, una vez acabados los tests lentos, que estos se vuelvan a ejecutar sólo para la última versión estable de la construcción y los test unitarios (y no para todas las que ha habido entre medias) ¿Claro?, espero que sí.

Este caso que parece simple no lo es tanto en Hudson y hay que dar un pequeño rodeo. Usar tres trabajos en lugar de dos, ahora os explico el porqué.

Si configuramos 2 trabajos, uno dependiente del otro, siempre que el primero acabe, el segundo se lanzará. Si el segundo ya está en ejecución, se pondrá en una cola de espera con lo que tendremos un segundo trabajo por cada uno de los primero (cosa que no queremos). Si utilizamos un plug-in llamado “locks and latches” y configuramos un cerrojo, entonces hasta que no acabe el segundo no podremos lanzar de nuevo el primero (cosa que tampoco queremos).

Para configurar nuestro escenario necesitamos 3 trabajos. Un nuevo trabajo intermedio (M) que será ejecutado por el primer trabajo rápido (R) y que lanzará el segundo trabajo lento (L), es decir, R -> M -> L. Además también necesitamos el plug-in del que hablamos anteriormente, “locks and latches“.

El trabajo A se configura un cerrojo (L1), en el trabajo M dos (L1 y L2), y en el trabajo L uno, (L2). El trabajo A comparte el cerrojo con M pero no con B y el trabajo B comparte el suyo con M pero no con A. De esta manera, podremos ejecutar el trabajo A varias veces mientras que B esta en ejecución. Cuando B acabe se volverá a lanzar cuando acabe A con la última versión del código.

Ahora que lo pienso, es posible que también funcione usando un único lock en M y B pero no lo he probado. Hace tiempo que utilicé esto y ya no lo tengo configurado así que dejo la prueba de si la “optimización” funciona o no para vosotros. Por favor, hacédmelo saber.

Etiquetas:

Leave a Reply