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.
- Administration
- Security, Users
- 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:
En el cuadro de diálogo, introducimos un nombre para el token y pulsamos el botón Generate:
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.
- Manage Jenkins
- Manage Plugins
- En la pestaña Available, usamos la caja de búsqueda para encontrar SonarQube Scanner.
- Marcamos y seleccionamos Install without restart.
Configuración del plugin
Una vez instalado, configuramos:
- Manage Jenkins
- 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
- Manage Jenkins
- Global Tool Configuration
- En la sección SonarQube Scanner, especificamos:
- Name :
SonarQube Scanner
_SONAR_RUNNER_HOME_
:/var/jenkins_home/tools/sonar-scanner/
- Name :
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:
También podemos revisar el detalle del análisis en SonarQube: