May 26

Auditoría de software

hudson-chicasEntre las herramientas que usamos habitualmente, está Hudson como herramienta de integración continua. Tiene un montón de plugins para instalar y de vez en cuando me dedico a jugar con ellos, para ver qué hacen, alegrar un poco el día a la gente poniendo algún plugin divertido, o haciéndoles tirarse de los pelos cuando necesitan hudson y no está disponible porque le he instalado una cosa que no va.

Entre los plugins, recientemente instalé dos, el de Chuck Norris, que hace que aparezcan fotos de Chuck Norris contento si la compilación ha ido bien, o cabreado si ha ido mal, aparte de poner frases aleatorias estilo "Chuck Norris’s first program was kill -9". También puse otro similar, pero con fotos de chicas.

Pues bien, justo ayer, cinco minutos antes, me llaman por teléfono que van a venir de una auditoría de software para ver, entre otras cosas precisamente el Hudson. Así que, como un loco, mirando qué fotos salían en los proyectos para enseñar sólo proyectos de Chuck Norris, no vaya a ser que algún auditor/a se me mosqueara o mosquease.

Sep 23

Sonar: viene … y se va.

 

Hace un tiempo instalé y probé Sonar, una estupenda herramienta que genera un informe muy vistoso y cómo de usar sobre las métricas de nuestro código, Pero al final tuve que abandonarlo. El compilado con maven generando el informe era muy lento y el servidor web de sonar acababa dando timeout por la carga a la que se veía sometido. Al final el compilado con maven fallaba por este timeout y eso me hacía totalmente imposible integrarlo con hudson, para obtener los informes actualizados todas las noches.

El otro día me dio por revisar cómo iba el desarrollo de Sonar, qué nuevas versiones habían sacado, qué problemas habían resuelto … y me resulto interesante que habían corregido/añadido una nueva "feature", la SONAR-764, en la que básicamente dicen que cargan el trabajo en el plugin de sonar para maven en vez de en el servidor web de sonar. Esto tiene pinta de que puede solucionar los problemas de timeout con el servidor de sonar. Así que a ello, descargar, instalar y probar.

Las primeras pruebas manuales funcionan a la perfección. Eso sí, los compilados tardan casi el doble ya que deben generar además todos los reportes de métricas, pero ya no tengo el problema de timeout y el informe acaba correctamente y se publica en el servidor web de sonar.

Siguiente paso, hacer que Hudson genere con sonar ese informe todas las noches y lo publique. Y ahí empezaron los problemas. Algunos proyectos tardaban más en compilar, pero lo hacían todo bien y el informe se publicaba. Pero otros proyectos, no necesariamente los más grandes, acababan dando una excepción en el compilado, indicando que "Sonar no se puede ejecutar" y un NullPointerException en los MOJOS de maven. Tras unas investigaciones rápidas, no llegué a ninguna conclusión ni ningún arreglo. El mismo proyecto compilado manualmente en el sitio donde lo hace hudson funciona, pero si lo hace hudson no funciona.

Así que mi gozo en un pozo. Desinstalar sonar y esperar a una nueva ocasión.

Sep 11

Nodos esclavos en Hudson

 

Ayer, jugando con Hudson, descubrí una característica interesante que podía solucionar algunos de los problemas que teníamos y que además me ha dejado alucinado de la facilidad de instalación. Es la posibilidad de poner a otros ordenadores como esclavos de Hudson, de forma que envíe los compilados de los proyectos a ellos. De esta forma, una sola instalación de Hudson puede disponer de varios ordenadores para hacer los compilados y repartirlos entre ellos según una serie de criterios.

Poner un ordenador esclavo de Hudson en muy sencillo. Desde la misma página web de nuestra instalación de Hudson le damos a "añadir nodo esclavo". Hay varias formas de hacer que Hudson hable con el ordenador esclavo y yo elegí "instalar un servicio hudson-esclavo". Para esta opción, solo hay que dar la IP o nombre del ordenador, un usuario y password con permisos de administrador y luego los detalles "técnicos", como el path del ordenador esclavo donde queremos que hudson trabaje, dónde tiene instalado java o maven, etc. No es necesario que esos paths estén compartidos o sena públcos.

Pues bien, una vez dados estos datos, y esto es lo que me ha alucinado, hudson el sólito copia unos jar en el directorio remoto que le hemos dicho, instala un servicio y lo arranca. A partir de ahí, ya tenemos nuestro ordenador esclavo funcionando para nuestro Hudson.

¿Cómo repartimos nuestros proyectos?. Pues hay varias formas:

  1. Dejar que Hudson reparta como quiera.
  2. Asignar un proyecto (desde su configuración) a un esclavo concreto.
  3. Poner etiquetas a los distintos ordenadores esclavos y luego decir en el proyecto que puede ejecutarse en cualquier ordenador que tenga determinada etiqueta.

Esta última característica está pensada para que las etiquetas sean estilo windowxp, linux, java5, java6, etc en función del sistema operativo o versión de java que tenga instalado. De esta podemos decir que un proyecto debe compilarse en cualquier ordenador esclavo que tenga la etiqueta java5 y que, por supuesto, tendrá instalado java 5.

En nuestra web de hudson, donde habitualmente se ponen las barritas de progreso del compilado, veremos los distintos ordenadores, cada uno con sus barritas correspondiente. Pinchando uno de esos ordenadores, veremos sólo los proyectos asignados a ese ordenador.

La posible pega de todo esto es que los compilados paralelos pueden ser problemáticos, sobre todo si hay proyectos que dependen unos de otros y se compilan a la vez. La versión más moderna de Hudson, la 1.323, permite poner un "check" en la configuración del proyecto, indicándole que se quede en la cola de espera si hay algún proyecto del que depende que esté compilando en ese momento. Ese check tiene un pequeño bug, y es que no se puede salvar, así que hay que marcarlo tocando directamente en el config.xml del proyecto dentro de los directorios de Hudson.

Sep 08

Jueguecitos con Hudson

 

Hace tiempo que usamos Hudson como herramienta de integración continua. Básicamente saca automáticamente todas las noches los fuentes de los proyectos que se han tocado durante el día, los compila y si hay errores de compilado, manda un correo-colleja a los que han tocado el código. Hudson proporciona una interface web, de forma que con nuestro navegador podamos ver en todo momento si los proyectos compilan, qué fallos de compilado tienen, quién ha tocado, qué ha tocado, etc.

Sin embargo, hoy he descubierto que tiene un "jueguecito". A Hudson se le pueden instalar fácilmente plugins, por ejemplo, todos los de métricas (checkstyle, pmd, findbugs, etc), de forma que además de compilar, pasa todas estas métricas y genera unos informes visibles desde el navegador. Pues el jueguecito consiste en un plugin adicional que se puede instalar, el Continuous Integration Game.

Una vez instalado este plugin, debemos activarlo en la configuración de cada proyecto (junto con los informes de métricas). De esta forma, cada vez que compila, Hudson asigna o quita puntos a los desarrolladores que ese día han tocado el código. Les da un punto si compila correctamente, les quita diez si falla, les da puntos si hay test nuevos que pasan, les quita puntos si fallan los test, les da puntos si han corregido métricas, les quita si hay más violaciones de las mismas. Al final, tenemos una tabla de jugadores (desarrolladores) ordenada del de más puntos (el mega-top-developer que lo puede todo) hasta el de menos puntos (el torpe-hasta-decir-basta).

Quizás es injusto para un solo compilado, ya que si falla, se quita diez puntos a todos los que han intervenido, independientemente de que sean o no los causantes. Pero está claro que por estadística, a la larga, el torpe interviene en casi todos los compilados fallidos y el listado de puntos se acabará ordenando de una forma lógica.

Es una chorrada, pero supongo que si hacemos una bromillas con el segundo, el último y animamos al primero a conservar su puesto, puede haber verdaderos piques por hacer el código bien. Pues ahí ha quedado todo instalado, a ver mañana quién es el primero de la lista. Incluso podemos poner que todos los lunes los de la mitad de abajo inviten a café a los de la mitad de arriba o que echen un euro en un bote.