Herramientas y Métodos en Ingeniería del Software. Version 1.0, Mayo-2021. Joaquín Cañadas <jjcanada@ual.es>

Integración de SonarQube con Jenkins.
Objetivos
  • Configurar la integración de las herramientas SonarQube y Jenkins

  • Ejecutar el análisis de SonarQube desde Jenkins

  • Visualizar los resultados del análisis de SonarQube

Realización y entrega

La realización de esta actividad se realizará de forma individual. Consiste en añadir el análisis con SonarQube a los proyectos ya existentes en Jenkins de actividades anteriores. Su resolución debe estar en el Jenkins del equipo. La entrega será mediante el envío de un informe y el acceso al profesor a los servicios configurados, para la revisión y evaluación de los mismos. Recuerda dar acceso al profesor al Sonar del equipo.

1. Introducción a SonarQube

Static

SonarQube (conocido anteriormente como Sonar) es una herramienta para evaluar la calidad del código fuente. Es software libre y usa diversas herramientas de análisis estático de código fuente como Checkstyle, PMD o FindBugs para obtener métricas que pueden ayudar a mejorar la calidad del código de un programa:

  • Informa sobre código duplicado, estándares de codificación, pruebas unitarias, cobertura de código, complejidad ciclomática, errores potenciales, comentarios y diseño del software.

  • Aunque inicialmente fue pensado para Java, acepta otros lenguajes mediante extensiones.

  • Se integra con Maven, Ant y herramientas de integración continua como Atlassian Bamboo, Jenkins y Hudson.

SonarQube como plataforma web ofrece dos versiones principales de uso:

  • SonarQube on premise: permite instalar SonarQube en cualquier ordenador o servidor en la nube. La versión Community es gratuita y open source.

  • SonarCloud: SonarQube ofrecido como software como servicio disponible en la URL https://sonarcloud.io/ y gratuita para proyectos de código abierto.

Además, SonarLint es una extensión para los principales IDEs que ayuda a detectar y corregir los problemas de calidad a la vez que escribes código fuente.

En esta actividad nos vamos a centrar en integrar SonarQube on premise que hemos instalado en una máquina virtual en Azure, con Jenkins.

2. Configuración de la integración entre Jenkins y SonarQube

Sonarqube Jenkins
  1. El primer paso es crear un token en SonarQube para el usuario. Para ello, en SonarQube, creamos un nuevo usuario: userjenkins. Para administrar usuarios y grupos, una vez logueado como admin elige Administration > Security. Añade el usuario userjenkins, que de forma predeterminada se añade al grupo sonar-users.

sonar administration sercurity create user
Fig. 1. Crear usuario

Accede con usuario userjenkins en SonarQube y en su perfil, crea un token y guardalo para usarlo después.

sonarqube generate token
Fig. 2. Creación del token
  1. En Jenkins, instalamos el plugin SonarQube Scanner.

jenkins install sonar plugin
Fig. 3. Plugin SonarQube Scanner for Jenkins
  1. Una vez instalado el plugin de SonarQube, lo configuramos: Administrar Jenkins > Configurar el Sistema, y bajamos hasta la sección SonarQube Servers. Marca la opción Environment variables Enable injection of SonarQube server configuration as build environment variables. Añadimos un nuevo SonarQube, damos un nombre al servidor, la URL de SonarQube, y añadimos la credencial de acceso al servidor mediante una nueva credencial de tipo Secret Text usando el token de autenticación. Dale el ID a la credencial: sonar_server

jenkins sonar servers
Fig. 4. Configuración del Servidor SonarQube
jenkins add sonar credentials
Fig. 5. Añadir la credencial del token de SonarQube
  1. A continuación debemos añadir la instalación de SonarQube Scanner en Administrar Jenkins > Global Tool configuration. Seleccionamos la última version que se instale automáticamente.

jenkins add sonarqube scanner
Fig. 6. Añadir SonarQube Scanner

3. Añadir SonarQube a un proyecto Jenkins

3.1. Proyecto tipo Maven

  1. En el archivo pom.xml tenemos que incorporar el plugin de SonarQube en el bloque <build>.

<build>
...
    <plugin>
      <groupId>org.sonarsource.scanner.maven</groupId>
      <artifactId>sonar-maven-plugin</artifactId>
      <version>3.9.0.2155</version>
    </plugin>
...
</build>
  1. En la configuración del proyecto Jenkins, en la sección Entorno de Ejecución, marcamos la opción: Prepare SonarQube Scanner environment, y seleccionamos el token en el desplegable.

jenkins add sonarqube environment
Fig. 7. Añadir SonarQube al entorno de ejecución
  1. En los Goals de Maven, añadimos sonar:sonar al final de lista de goals.

  2. Tras la ejecución, aparecerán los resultados de SonarQube. En el proyecto se mostrará una etiqueta con el valor del Quality Gate encontrado en el análisis. Haciendo clic en el enlace nos lleva al resultado detallado del análisis.

jenkins sonar results
Fig. 8. Resultados de SonarQube en el proyecto Jenkins.
Ejemplos de Maven y SonarQube

En el repositorio de GitHub sonar-scanning-examples hay disponibles varios ejemplos para probar el funcionamiento de SonarQube. Podemos usar los proyectos Java con Maven para probar el funcionamiento de SonarQube. Sin embargo, en estos proyectos está configurado Java 11 en el pom.xml, por lo que la construcción en nuestro Jenkins fallará ya que solamente tenemos instalado JDK 1.8. Si quieres probar estos ejemplos, aquí tienes las instrucciones para instalar Java 11 en Jenkins.

3.2. Proyecto tipo Pipeline

Añade una nueva fase al pipeline:

  stage('SonarQube analysis') {
    steps {
      withSonarQubeEnv(credentialsId: 'sonar_server', installationName: 'servidor_sonarqube') { (1)
        sh 'mvn sonar:sonar' (2)
      }
    }
  }
1 Usando el ID de la credencial creada en Jenkins con el token de acceso a SonarQube, en la figura 5 se le dió el id sonar_server, y el nombre del servidor de SonarQube configurado en Jenkins.
2 Utiliza mvn -f carpeta/pom.xml sonar:sonar si es necesario.
jenkins sonar results pipeline
Fig. 9. Resultados de SonarQube en el pipeline.

Alternativamente, se puede añadir a continuación una nueva fase que establezca el pipeline a UNSTABLE si falla el Quality Gate.

  stage("Quality Gate") {
    steps {
      timeout(time: 1, unit: 'HOURS') {
      // Parameter indicates whether to set pipeline to UNSTABLE if Quality Gate fails
      // true = set pipeline to UNSTABLE, false = don't
        waitForQualityGate abortPipeline: true
      }
    }
  }

4. Análisis SonarQube desde Eclipse

Si deseas ejecutar el análisis de SonarQube desde Eclipse, debes llamar a la construcción maven el goal sonar:sonar y los parámetros siguientes:

sonar:sonar -Dsonar.host.url=http://sonarqube_server_url:9000  -Dsonar.login=user-token

Más info de como usar SonarQube en Eclipse, y SonarQube en baeldung.com.

5. FAQ y resolución de problemas (thoubleshouting)

En esta sección se añadirán soluciones a los problemas más habituales.