Soporte en Sonar para un proyecto multi-lenguaje: configuración desde Jenkins

3
13949

Soporte en Sonar para un proyecto multi-lenguaje: configuración desde Jenkins.

0. Índice de contenidos.


1. Introducción

El escenario de partida de este tutorial en simple, jenkins + sonar y el resto de piezas dentro de un entorno de CI, con un proyecto JEE mavenizado de modo tal que la
configuración de sonar en jenkins dentro del proyecto es simple y ya hemos hablado de ello en adictos.

La complejidad viene dada cuando necesitamos que, además de ejecutar sonar con el perfil java, queremos hacer uso del perfil web para pasar el CPD sobre nuestras JSPs.
En este momento la complejidad se traduce en, ¿cómo puedo configurar un proyecto en jenkins para que analice dos lenguajes a la vez con sonar?:

  • primero: sonar admite perfiles de calidad y, por defecto, es java. Instalando el plugin Web para Sonar se añade un segundo perfil de calidad y el lenguaje es web. Al analizar el código puedes elegir lenguaje, pero ¿cómo selecciono los dos?, y
  • segundo: cómo configurar jenkins para que lo ejecute con un proyecto mavenizado. Podemos cambiarlo indicando como lenguaje «web» y funciona, pero deja de analizar el lenguaje java.

En este tutorial vamos a ver cómo configurar un proyecto para tener dos perfiles de calidad (java + web) con el soporte de maven en jenkins y
sonnar runner.

Por último, se da por supuesto que tenemos ya instalado un entorno de CI con jenkins y sonar, y controlamos la administración de los mismos.


2. Entorno.

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 15′ (2.4 GHz Intel Core i7, 8GB DDR3 SDRAM).
  • Sistema Operativo: Ubuntu Linux Server Edition 12.04 x86, sobre un Mac OS X Lion 10.7.5
  • Maven 3.0.5
  • Sonar 3.5.1
  • Jenkins 1.513


3. Configuración de Sonar.

En sonar, para dar soporte al análisis de un perfil distinto al de por defecto, que es java, debemos instalar el plugin correspondiente.
Para ello no tenemos que más que acceder a la configuración de plugins (Settings > configuration > Update Center) y añadir el elegido, en nuestro caso el plugin web.

Reiniciamos sonar y listo, deberíamos disponer, en la sección de perfiles de los siguientes:



4. Configuración del proyecto.

Para configurar el proyecto para el perfil java no debemos hacer nada puesto que es el lenguaje por defecto y,
al hacer uso de maven y jenkins, no necesitamos configuración alguna a nivel de proyecto.

Para añadir el segundo perfil de calidad usaremos sonar runner y para ello solo debemos añadir un fichero
sonar-project.properties a la raíz del proyecto con un contenido similar al siguiente:

#Se puede equiparar con el groupId de Maven (Obligatorio)  
sonar.projectKey=com:autentia:tntconcept-web
#Se puede equiparar con el artifactId de Maven. Es el nombre que se va a mostrar el dashboard de Sonar. (Obligatorio)  
sonar.projectName=tntconcept-web
#Se puede equiparar a la versión de Maven. (Obligatorio)  
sonar.projectVersion=0.0.1-SNAPSHOT
       
#Indicamos todos los directorios donde haya código Java. (Obligatorio)  
sonar.sources=tntconcept-web/src/main/webapp
       
# Indicamos el lenguaje que queremos analizar (Por defecto, Java)  
sonar.language=web

Con ello ya tenemos la configuración lista para sonar runner y podemos ejecutar un análisis por línea de comandos, aunque lo interesante viene en el siguiente punto, para poder ejecutarlo dentro del ciclo de CI, con el soporte de jenkins.


5. Configuración de jenkins.

Como el análisis del segundo perfil lo vamos a realizar con el soporte de sonar runner lo primero que debemos hacer es instalarlo en el servidor de jenkins, para ello podemos realizar una instalación standalone y configurar el path en jenkins o, una instalación embebida con el soporte de jenkins.
Si elegimos esta segunda opción basta con acceder a la administración de jenkins y seleccionar:

El paquete se instala en el directorio local de jenkins bajo tools y por defecto en el análisis tomará las propiedades configuradas en el siguiente fichero
/opt/jenkins/tools/hudson.plugins.sonar.SonarRunnerInstallation/Sonar_Runner_Integraci_n/conf/sonar-runner.properties donde Sonar_Runner_Integraci_n es el
nombre de la instalación que hemos asignado en la configuración de jenkins.

Dicho fichero debería tener un contenido similar al siguiente apuntando a la instalación de sonar:

sonar.host.url=http://localshot/sonar/

sonar.login=admin
sonar.password=admin

#----- MySQL
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
sonar.jdbc.driver=com.mysql.jdbc.Driver

#----- Global database settings
sonar.jdbc.login=sonar
sonar.jdbc.password=sonar

Con lo visto, cualquier proyecto podría analizarse con el soporte de sonar runner, añadiendo el siguiente «paso posterior»

Y configurando el path donde se encuentra el fichero de propiedades de sonar runner

También podríamos haber asignado en «Project properties» dichas propiedades y haber prescindido del fichero de propiedades a nivel de proyecto.

Ejecutando una build en jenkins, tendríamos en sonar dos proyectos, analizados con dos perfiles distintos:

  • el perfil java por defecto que se ejecuta con maven; en sonar tendrá el mismo nombre que el proyecto mavenizado, y
  • el perfil web con el soporte de sonar runner, que tendrá como nombre de proyecto en sonar el asignado a nivel de fichero de propiedades.



6. Referencias.


7. Conclusiones.

A nivel de proyecto, un fichero de propiedades adicional y a nivel de jenkins poca más configuración y
ya tenemos listo nuestro proyecto para analizar los olores también en nuestras JSPs… 😉

Quién dice JSPs ahora puede decir JS mañana, la cuestión es poder analizar el código de varios lenguajes a la vez
en un mismo proyecto.

Un saludo.

Jose

jmsanchez@autentia.com

3 COMENTARIOS

  1. Hola Jose!
    El tutorial está estupendo 🙂

    Solo veo una pega que me sucede, y es que el directorio cache que utiliza sonar runner es compartido para todas las tareas jenkins.

    Indagando un poco he visto que cuando inicia (o finaliza el análisis, borra este directorio caché).

    En principio el primer workaround que se me ocurrió es poner en cola las tareas en jenkins, pero me parece poco eficiente, ya que con el análisis de sonar java por defecto en jenkins se pueden ejecutar varias tareas sin problemas.

    En teoría se puede modificar el directorio de caché con una variable de entorno o una propiedad de sistema:
    http://jira.codehaus.org/browse/SONAR-2291

    Pero no he encontrado el nombre de la variable…y parece que esto es mas para sonar que para sonar runner.

    ¿Os ha pasado a vosotros?

    Saludos y gracias!

    Carlos

  2. Adicionalmente a lo comentado, si no creo el enlace simbólico o un directorio (pj: /srv/sonar-3.6) me da el siguiente fallo:

    INFO: Runner configuration file: /srv/jenkins/tools/hudson.plugins.sonar.SonarRunnerInstallation/Sonar_Runner/conf/sonar-runner.properties
    INFO: Project configuration file: NONE
    INFO: Default locale: \\\»es_ES\\\», source code encoding: \\\»UTF-8\\\»
    INFO: Work directory: /srv/sonar-3.6
    INFO: Sonar Server 3.6
    INFO: ————————————————————————
    INFO: EXECUTION FAILURE
    INFO: ————————————————————————
    Total time: 0.095s
    Final Memory: 0M/117M
    INFO: ————————————————————————
    ERROR: Error during Sonar runner execution
    ERROR: Unable to create user cache/usr/share/tomcat6/.sonar/cache
    ERROR: Caused by: Unable to create directory /usr/share/tomcat6/.sonar/cache

    En la configuración de jenkins para sonar tengo una propiedad adicional: -Dsonar.userHome=/srv/sonar-3.6, que se pasa a maven para coger el directorio de sonar sin crear el enlace, pero para sonar runner no funciona…

    A ver si esto tambien os ha pasado 😉

    Saludos y gracias!

  3. Hola Carlos,

    La verdad es que no, no se nos ha dado esa problemática; pero efectivamente en cuanto tengamos dos proyectos analizándose a la par se dará.

    Si das con la solución, coméntala.

    Gracias!!!

    Un abrazo.

    Jose.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad