SonarQube: analizando un proyecto Java

Aquí está la segunda parte del tutorial de SonarQube donde voy a explicar cómo analizar un proyecto Java mediante Sonar Runner, cliente de SonarQube. La primera parte del tutorial la podéis encontrar aquí

Lo primero que hay que hacer antes de poder empezar a analizar nuestro código es crear un fichero con algunas propiedades dentro del proyecto que queramos analizar. Este fichero es necesario para informar a Sonar Runner acerca de algunas propiedades que necesita. Para ello vamos a la raíz del proyecto, en mi caso C:\Users\Enrique\workspace\proyectoFinalISW0.3, creamos un nuevo fichero llamado sonar-project.properties y añadimos la información básica acerca de nuestro proyecto:

 # Required metadata
 sonar.projectKey=proyectoB7
 sonar.projectName=proyectoFinalISW0.3
 sonar.projectVersion=1.0

# Paths to source directories.
# Do not put the "sonar-project.properties" file in the same directory with the source code.
# (i.e. never set the "sonar.sources" property to ".")
sonar.sources=src

# The value of the property must be the key of the language.
 sonar.language=java

# Encoding of the source code
 sonar.sourceEncoding=UTF-8

# Additional parameters
 sonar.my.property=value
 

Una vez creado el fichero con las propiedades básicas de nuestro proyecto vamos hasta la raíz del proyecto a través de la línea de comandos y ejecutamos el comando sonar-runner. Tras unos segundos el proyecto entero habrá sido analizado y podremos consultar toda la información referente al análisis en http://localhost:9000/, donde podremos ver todos los proyectos que hayamos ido analizando a lo largo del tiempo y seleccionar el que queramos consultar.

Proyecto_ejecutado_1

El proyecto analizado es proyectoFinalISW0.3 y la zona amarilla en la gráfica indica que los proyectos que hemos analizado hasta ahora solo cumplen un 50% de las reglas de calidad que propone SonarQube y que más adelante veremos.

Hacemos click sobre el proyecto que queramos consultar en el cuadro Projects (en mi caso proyectoFinalISW0.3) y seremos redireccionados a la ventana con los resultados del análisis:

Proyecto_ejecutado_2

En esta ventana SonarQube nos muestra datos, métricas y estadísticas acerca del proyecto analizado.

Como se puede comprobar a simple vista, el desarrollo de esta aplicación deja mucho que desear. Según los datos obtenidos casi un 10% del código está duplicado, no tiene prácticamente ningún tipo de documentación y se han encontrado 535 problemas, de los cuales 272 son de carácter grave y 87 críticos.

Además de errores y datos estadísticos sobre el código, SonarQube también nos ofrece métricas y estadísticas referentes a la complejidad. Según el campo Technical Debt, para arreglar todos los problemas de la aplicación tendríamos que dedicar 23,5 días de esfuerzo. Evidentemente este dato es subjetivo, ya que va a depender de la habilidad y experiencia del equipo de trabajo.

Otro dato interesante son los datos referentes a las métricas de la complejidad del proyecto. Los datos mostrados se corresponden con la media de la complejidad ciclomática por método, clase y fichero.

Haciendo click en cada uno de los resultados obtenidos podemos ver más detalladamente de donde han salido estos valores y que paquetes/clases son los afectados y a partir de los cuales se obtienen dichos resultados.

Como ver todas las opciones de SonarQube me llevaría unos cuantos posts dedicados al tema, voy a mostrar solo un par de ejemplos de los errores que se han encontrado.

Si hacemos click sobre los problemas críticos nos llevará a la siguiente ventana:

Errores_criticos

Si hacemos click sobre uno de los errores obtendremos información acerca de en qué paquete, clase y línea de código se encuentra el error y un comentario acerca de cómo resolver el problema (en ocasiones también se muestran ejemplos con el tipo de refactoring a realizar). En la siguiente captura se muestra uno de los errores encontrados y catalogado como crítico:

error_sin

En este caso SonarQube nos está avisando de que la instrucción System.exit(0) debe ser eliminada o que nos aseguremos de que realmente la necesitamos. El error ha sido catalogado como crítico porque dicha instrucción aborta la ejecución del programa sin previo aviso. Si poner esta instrucción ha sido un error del programador, esto haría que el programa al llegar a un determinado punto de su ejecución se cierre sin previo aviso, haciendo que el programa no se comporte como debiera.

Otro error sería el siguiente:

error_2

En este caso SonarQube nos está avisando de que la sentencia if no contiene las llaves de apertura y cierre. Este error lo ha catalogado como grave porque si el programador no se da cuenta e introduce más de una línea de código dentro de la sentencia if, sólo la primera línea estaría dentro del if quedando el resto fuera y haciendo que el programa no se comporte como debería de hacerlo.

Además de errores, SonarQube también ofrece información acerca de buenas prácticas, refactoring y consejos para mejorar la estructuración de nuestro código.

Como curiosidad, SonarQube también nos muestra en forma de nube de etiquetas las clases de nuestro proyecto y el cumplimiento de reglas de calidad por las mismas. Cuanto más grande es una etiqueta, mayor número de líneas de código tiene. Los colores indican el porcentaje de reglas de calidad que cumple cada clase, siendo el azul un buen indicador y el rojo un indicador de poco cumplimiento.

cloud_1

También podemos ver el riesgo de cada clase de nuestro proyecto. El riesgo de cada clase depende de la complejidad de la misma y del porcentaje de cumplimiento de las reglas de calidad propuestas por SonarQube. Cuanto más grande es una etiqueta, mayor es la complejidad que tiene. El color azul indica que cumple un alto porcentaje de las reglas de calidad y el rojo todo lo contrario.

cloud_2

Y hasta aquí todo lo referente al análisis de un proyecto mediante sonar-runner y su visualización en el servidor.

Más información en la web de SonarQube y en la documentación

11 comentarios en “SonarQube: analizando un proyecto Java”

  1. Gracias Enrikus, me ha sido de gran ayuda tu documentación.

    La pongo en mi blog y te referencio como ‘gurú’.

    Me gustaría que pudieras comentar algún plugin interesante de SonarQube con el que hayas trabajado.

    UN SALUDO

    1. Hola Javier,
      Me alegro de que te resulte útil el post 😉 .

      Tengo pensado escribir algún post más adelante sobre SonarQube, pero antes tengo pendientes de terminar varios que tengo empezados.

      Te agradezco que me referencies en tu blog si vas a utilizar material de aquí o si simplemente quieres proporcionar algo más de información a tus lectores, pero no es necesario que me referencies como ‘gurú’ ya que no soy ningún experto. Solo comparto lo que sé por si a alguien le sirve de ayuda.

      Saludos.

  2. hola realice todos los pasos pero me sale el siguiente error: Caused by: You must define the following mandatory properties for ‘Unknown’: sonar.projectKey, sonar.projectName, sonar.projectVersion, sonar.sources

    1. Hola FrankCc,
      ¿Has creado el fichero “sonar-project.properties” en la raíz del proyecto a analizar como se indica al inicio del post? El mensaje del error parece indicar que te falta definir dichas propiedades en dicho fichero o que no lo has creado donde debes y Sonar Runner no lo encuentra.
      En las propiedades “projectKey” y “projectVersion” puedes poner lo que quieras, pero en “projectName” debes poner el nombre de tu proyecto y en “sources” indicar la ruta al código fuente, que en java se encuentra dentro del directorio src.

      Si estás analizando un proyecto que no sea Java busca por internet un ejemplo del fichero “sonar-project.properties” porque puede que cambie algo y el mío no te sirva.

  3. Hola! me resultó muy útil tu post, instalé SonarQube con PostgreSQL y hasta la parte de analizar el proyecto me funcionó bien… Pero no sé por qué no analiza mi proyecto 🙁 estoy trabajando con Java Empresarial (Java EE) en Netbeans 8, ¿tal vez es porque usa Maven?, ¿tendré que instalar algo adicional?. Te agradecería mucho si pudieses responderme. Saludos!

      1. Al final, al instalar Maven arrojaba muchos errores y no me sirvió tampoco, así que volví a Sonar-Runner… Al final, mi error fue que tenía mal configurado el archivo de propiedades de sonar que se pega en la carpeta del proyecto, ahora me funciona todo ok. Saludos y gracias por responder!

  4. Buenas,

    Excelente post, me resulto sumamente útil, ya tengo sonar funcionando.

    Además lo agregue como plugin en eclipse y estoy probando la integración.

    Saludos y muchas gracias!

  5. Hola. Q. Tal. Quisiera. Saber. Los. Pasos detallados para. Publicar. Un proyecto. Baje los. De. Ejemplo. Ya. Tengo. Funcionando sonsaque en. Linux. Y. Quiero. Correr. Desde. Mi. Pc.los. Proyectos. Ahí. Instale . Sonarruner pero. Tengo. Windows. Ya. Llego. Vía. Ip.

    Como. Corro. Los. Proyectos. Saludos

  6. Hola!

    El material me fue realmente util yo instale la version 5.5 de Sonaqube que tiene algunos cambios con respecto a la que mencionas en el tutorial pero aun asi no tuve problema en la instalacion, solo queria hacer una pregunta ya que no he encontrado mucha informacion al respecto. Dentro de la pantalla de sonaqube al analizar un proyecto me muestra los resultados y toda la informacion de forma correcta, pero al analizar un proyecto nuevo estos no se van “guardando” o no queda la informacion en la pantalla del sonarque, solo se muestran los datos del ultimo proyecto analizado. Sabes a que se deba esto?

    Gracias por la informacion!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *