En entradas anteriores hemos subido el código de la aplicación al repositorio en Gogs y hemos instalado SonarQube y Jenkins. Ahora, vamos a configurar Jenkins para que analice el código de la aplicación y detectar fallos incluso antes de compilar la aplicación.

Update 2022-01-06 He actualizado los enlaces externos hacia la documentación de SonarQube. Por favor, revisa la documentación oficial actualizada ya que este artículo se escribió para una versión anterior de SonarQube.

Update (2022-01-06): El enlace a la web de SonarQube ya no funciona; la página que describe la configuración de SonarScanner para Jenkins se encuentra ahora en SonarScanner for Jenkins Usamos como referencia Analyzing with SonarQube Scanner for Jenkins.

El análisis de código por Sonarqube usando Jenkins se realiza mediante la instalación del plugin SonarQube Scanner for Jenkins.

Creación de un usuario en SonarQube

Para que Jenkins pueda invocar el análisis de código en SonarQube, es necesario proporcionar las credenciales o un token de acceso a Jenkins.

Update (2022-01-06) El enlace a la web de SonarQube ha dejado de funcionar. La documentación sobre el token de usuario se encuentra ahora en Generating and Using Tokens Referencia: User Token en SonarQube

Creamos un usuario específico en SonarQube.

  1. Administration
  2. Security, Users
  3. Pulsamos el botón Create User
  • Login autosonar
  • Name SonarQube User for Jenkins
  • Email autosonar@local.dev
  • Password **************

Pulsamos Create User.

Para el usuario autosonar, en la columna Tokens, pulsamos en Update Tokens para mostrar el cuadro de diálogo de creación de un nuevo token:

SonarQube - Update tokens

SonarQube - Update tokens

En el cuadro de diálogo, introducimos un nombre para el token y pulsamos el botón Generate:

SonarQube - Token generated

SonarQube - Token generated

Debemos copiar el token generado, ya que al cerra el cuadro de diálogo queda almacenado en SonarQube pero no puede consultarse.

Instalación del plugin de SonarQube en Jenkins

Instalamos el plugin en Jenkins.

  1. Manage Jenkins
  2. Manage Plugins
  3. En la pestaña Available, usamos la caja de búsqueda para encontrar SonarQube Scanner.
  4. Marcamos y seleccionamos Install without restart.

Configuración del plugin

Una vez instalado, configuramos:

  1. Manage Jenkins
  2. Configure System

En el apartado SonarQube servers, pulsamos el botón Add SonarQube e indicamos los valores:

  • Name: SonarQube
  • Server URL: http://192.168.1.209:9000/
  • Server authentication token: 02ad2efb4226051bbebdd4888cb0986f4534954c

Descarga del sonar-scanner

Para poder analizar el código, es necesario descargar la versión adecuada del sonar-scanner.

Como en el contenedor de Jenkins tenemos instalado Java, usaremos la versión Any de SonarQube Scanner: (Update 2022-01-06 SonarScanner) Analyzing with SonarQube Scanner.

Para instalar SonarQube Scanner, entramos en el contenedor mediante docker exec, lo descargamos y descomprimimos en la carpeta /var/jenkins_home/tools/sonar-scanner/ que hemos creado en el volumen:

$ sudo docker exec -it jenkins /bin/sh
# cd /var/jenkins_home/
# mkdir tools
# cd tools
# wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.1.0.1141.zip
# unzip sonar-scanner-cli-3.1.0.1141.zip
# mv sonar-scaner--cli-3.1.0.1141 sonar-scanner
# exit
$

Configuración de SonarQube Scanner

  1. Manage Jenkins
  2. Global Tool Configuration
  3. En la sección SonarQube Scanner, especificamos:
    • Name : SonarQube Scanner
    • _SONAR_RUNNER_HOME_ : /var/jenkins_home/tools/sonar-scanner/

Creación del fichero sonar-project.properties

Creamos el fichero sonar-project.properties en la raíz del repositorio:

sonar.host.url=http://192.168.1.209:9000
sonar.projectKey=mvn:tutorial
sonar.projectName=GS Maven
sonar.projectVersion=1.0
sonar.sources=.
sonar.java.binaries=.

Este fichero especica una serie de metadatos de configuración del análisis de código, como la clave y nombre del proyecto, la versión, etc.

La propiedad sonar.java.binaries=. debe incluirse desde SonarQube 4.12; si no se obtiene el error Please provide compiled classes of your project with sonar.java.binaries property.

Análisis con SonarQube Scanner

Cuando lanzamos el job de análisis, falla con el mensaje de error:

Error: “No quality profiles have been found, you probably don’t have any language plugin installed.”

Verificamos que no hay “Quality Profiles” definidos en SonarQube. Esto significa que no tenemos ningún analizador de código configurado en SonarQube.

Revisando el documento de instalación de SonarQube, no creamos el volumen de datos para alojar las extensions (los plugins); por tanto, no tenemos ningún plugin instalado en SonarQube.

Volumen de datos para las extensiones de SonarQube

Creamos el volumen para las extensiones:

$ sudo docker volume create data-sonarqube-plugins
data-sonarqube-plugins

Paramos el contenedor de SonarQube y lo lanzamos de nuevo, montando ahora también el volumen para los plugins:

sudo docker run -d --name sonarqube -p 9000:9000 \
  --mount source=data-sonarqube,target=/opt/sonarqube/data \
  --mount source=data-sonarqube-plugins,target=/opt/sonarqube/extensions \
  -e SONARQUBE_JDBC_USERNAME=sonar \
  -e SONARQUBE_JDBC_PASSWORD=cF68nTVgP8Nq \
  -e SONARQUBE_JDBC_URL='jdbc:mysql://mysql-sonarqube:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false' \
  --network backend-sonarqube \
  sonarqube:7.1-alpine

Como tarda un poco en arrancar, revisamos los logs mediante sudo docker logs sonarqube -f hasta que vemos el mensaje SonarQube is up.

Instalación del plugin de análisis de código de Java

En Administration, Marketplace, buscamos SonarJava y pulsamos el botón Install.

Una vez instalado, es necesario reiniciar SonarQube.

Tras el reinicio, accedemos a Jenkins para relanzar el job.

...
INFO: Task total time: 9.372 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 12.367s
INFO: Final Memory: 12M/137M
INFO: ------------------------------------------------------------------------
...

El pipeline se muestra en verde, indicando que todos los pasos se han ejecutado con éxito:

Jenkins - Pipeline ok.

Jenkins - Pipeline ok.

También podemos revisar el detalle del análisis en SonarQube:

SonarQube - Quelity Gate: Passed.

SonarQube - Quelity Gate: Passed.