Sonar

De ChuWiki

¿Qué es Sonar?[editar]

Sonar es una herramienta gratuita que calcula y muestra en formato web las métricas de nuestro proyecto maven. Almacena las métricas en una base de datos, de forma que nos puede dar la evolución de nuestro proyecto en el tiempo en lo referente a métricas. Destaca principalmente la interfaz Web, muy visual, en la que por medio de rectángulos de colores muestra el estado de nuestro proyecto: cuanto más grande sea el rectángulo, más líneas de código tiene. Cuanto más verde, mejores métricas, cuanto más rojo, peores. Pinchando con el ratón en el rectángulo, entramos en los subproyectos nuevamente presentados como rectángulos de colores. Pinchando en ellos con el ratón, entramos en los paquetes java y de estos en las clases, hasta ver el código fuente con todas las violaciones de métricas claramente marcadas.

La página http://nemo.sonar.codehaus.org/ esta generada con Sonar y puedes ver, a modo de ejemplo, cómo presenta las métricas de distintos proyectos de Apache.


Instalación del servidor Sonar[editar]

La instalación es bastante sencilla. Viene con una base de datos Apache derby embebida y si la usamos, prácticamente no hay que configurar nada.

Basta bajarse el zip de Sonar y desempaquetarlo en un directorio de nuestra elección. Una vez desempaquetado, vamos al directorio bin/windows-x86-32/ y arrancamos el script StartSonar.bat. Si nuestro sistema no es Windows, elegiremos el subdirectorio de bin adecuado a nuestro sistema operativo. Existen en esos subdirectorios también scripts para arrancar Sonar como un servicio de Windows.

Es posible, según cómo tengas instalado java, que te de un error indicando que no encuentra bin/server/jvm.dll en la instalación de java. En mi caso tenía bin/client/jvm.dll y lo he arreglado haciendo una copia del subdirectorio client y poniéndole el nombre server.

Una vez instalado y corriendo, abrimos el navegador y vamos a la página http://localhost:9000 . Nos saldrá una página indicándonos el tipo de base de datos que estamos usando (Apache derby por defecto) y un botón para empezar a crear las tablas. Lo pulsamos y esperamos que Sonar cree todas las tablas de base de datos. Cuando estén creadas, en la misma dirección, aparecerá la página de incio de Sonar, sin proyectos presentes.


Ejecutar el plugin de maven[editar]

Para empezar con el primer proyecto, si no queremos hacer ninguna configuración rara, debemos tener nuestro proyecto maven en el mismo ordenador donde corre Sonar. En ese ordenador ejecutamos

set MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=256m"
mvn clean install org.codehaus.sonar:sonar-maven-plugin:1.5.1:sonar

La primera línea es para asegurar que maven y el plugin de sonar tienen memoria suficiente para ejecutarse. En la segunda línea deberemos cambiar la versión 1.5.1 por la que nos hayamos descargado.

Si todo va como debe, obtendremos el BUILD SUCCESFULL y luego, refrescando en el navegador la página http://localhost:9000 veremos las estadísticas de nuestro proyecto. Justo después de terminar el compilado de maven, Sonar tarda un rato en analizar los resultados, por lo que es posible que al dar refrescar al navegador no veamos nuestro proyecto y sí una línea en la parte superior indicando que se están analizando los datos.


Configurar Sonar para otra base de datos[editar]

En la documentación de Sonar indica que no dejemos puesta la base de datos Apache derby si vamos a hacer un uso serio de la herramienta. En su lugar, aconseja alguna base de datos más seria, como MySQL, Oracle, etc. Aunque en la documentación de Sonar viene como hacerlo, me he encontrado con varios problemas, por lo que considero que lo que pongo a continuación es más completo, al menos para MySQL.

En mi caso, elegí como base de datos MySQL. El driver de MySQL para java viene con la misma distribución de Sonar, por lo que no es necesario instalarlo en ningún sitio. Para otras bases de datos, como Oracle, debemos situar el driver en el directorio de instalación de Sonar, en extensions/jdbc-driver/<tu_base_de_datos> donde <tu_base_de_datos> es un subdirectorio ya creado por Sonar con el nombre derby, mysql, oracle, ...

Debemos después editar el fichero conf/sonar.properties. Ahí debemos comentar las líneas correspondientes a derby, descomentar las de mysql, introducir los datos de conexión tal que usuario, password y poner el dialecto para Hibernate. Viéndolo con detalle:

Comentar, con una # delante, las cuatro líneas de la base de datos derby

#sonar.jdbc.url:                            jdbc:derby://localhost:1527/sonar;create=true 
#sonar.jdbc.driverClassName:                org.apache.derby.jdbc.ClientDriver
#sonar.jdbc.defaultTransactionIsolation:    1
#sonar.jdbc.validationQuery:                values(1)

Descomentar las de MySQL, que ya vienen puestas, pero comentadas. Hay que quitar las # de delante.

sonar.jdbc.url:                            jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
sonar.jdbc.driverClassName:                com.mysql.jdbc.Driver
sonar.jdbc.validationQuery:                select 1

Poner los datos de conexión, un poco más abajo. Vienen ya puestos, sólo hay que cambiar los valores

sonar.jdbc.username:                       ElUsuarioDeLaBD
sonar.jdbc.password:                       LaPassword
sonar.jdbc.maxActive:                      10
sonar.jdbc.maxIdle:                        5
sonar.jdbc.minIdle:                        2
sonar.jdbc.maxWait:                        5000
sonar.jdbc.minEvictableIdleTimeMillis:     600000
sonar.jdbc.timeBetweenEvictionRunsMillis:  30000

y finalmente, más abajo, cambiar el dialecto para que sea MySQL e indicar la clase que se sabe ese dialecto.

sonar.jdbc.dialect:                      mysql
sonar.jdbc.dialectClass:                 org.sonar.commons.database.dialect.MySqlWithDecimalDialect

Hay que destacar que la clase del dialecto (dialectClass), aunque es para Hibernate, no es una clase de Hibernate, sino propia de Sonar. Puedes ver las posibles clases que admite en la API de Sonar

Con la base de datos MySQL arrancada y habiendo creado en ella una base de datos de nombre "sonar" (es lo que hemos puesto en la cadena de conexión en la propiedad sonar.jdbc.url), rearrancamos Sonar, vamos a la página http://localhost:9000 y pulsamos el botón de Setup database. Esto creará en la base de datos MySQL todas las tablas necesarias.

Configurar maven para otra base de datos[editar]

Ahora le toca el turno a la configuración de maven. Debemos indicarle dos cosas: por un lado, la forma de acceder a la base de datos para la inserción de las métricas. Por otro, la url de nuestro servidor Sonar, si no es en localhost. Para ello, en el fichero conf/settings.xml de maven, ponemos algo como esto:

<settings>
   <profiles>
        <profile>
            <id>sonar</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <!-- EXAMPLE FOR MYSQL -->
                <sonar.jdbc.url>
                  jdbc:mysql://servidor:3306/sonar?useUnicode=true&characterEncoding=utf8
                </sonar.jdbc.url>
                <sonar.jdbc.driver>com.mysql.jdbc.Driver</sonar.jdbc.driver>
                <sonar.jdbc.username>ElUsuarioDeLaBD</sonar.jdbc.username>
                <sonar.jdbc.password>LaPassword</sonar.jdbc.password>

                <!-- Estas dos lineas no vienen en la documentacion de sonar -->
		<sonar.jdbc.dialect>mysql</sonar.jdbc.dialect>
		<sonar.jdbc.dialectClass>org.sonar.commons.database.dialect.MySqlWithDecimalDialect</sonar.jdbc.dialectClass>

                <!-- SERVER ON A REMOTE HOST -->
                <sonar.host.url>http://servidor:1234</sonar.host.url>
            </properties>
        </profile>
        ...
   </profiles>
</settings>

donde "servidor" es el nombre o IP de donde tenemos el servidor de sonar y la base de datos. 'ElUsuarioDeLaBD' es el usuario de acceso a la base de datos y 'LaPassword' es la password de acceso para ese usuario.

Es importante destacar las dos líneas correspondientes al dialecto de la base de datos. Estas dos líneas no vienen en la documentación de Sonar.

Una vez configurado todo esto, podremos ejecutar el plugin de maven en cualquier ordenador que no sea necesariamente donde está instalado Sonar.