---
title: 'Instalación de SonarQube para Jenkins'
---
Instalación de SonarQube para Jenkins
===
* **Coordinador Tecnológico:** Rafael Palau
* **Arquitecto:** Horacio Nemeth
* **Consultores:**
Julio Mello
Marcos Benítez
Marco Aquino
Ilse Grau
Alan Sanier
Lauro Segovia
# Contenido
[TOC]
# Instalación de SonarQube en Centos 8
## Prerrequisitos
El único requisito previo para ejecutar SonarQube es tener Java (Oracle JRE 11 u OpenJDK 11) instalado en su máquina.
## Requisitos de hardware
* Una instancia a pequeña escala (individual o en equipo pequeño) del servidor SonarQube requiere al menos 2 GB de RAM para funcionar de manera eficiente y 1 GB de RAM libre para el sistema operativo.
* La cantidad de espacio en disco que necesita dependerá de la cantidad de código que analice con SonarQube.
* SonarQube debe instalarse en discos duros que tengan un excelente rendimiento de lectura y escritura. Lo más importante es que la carpeta "data" alberga los índices de Elasticsearch en los que se realizará una gran cantidad de E/S cuando el servidor esté en funcionamiento. Por lo tanto, un excelente rendimiento del disco duro de lectura y escritura tendrá un gran impacto en el rendimiento general del servidor SonarQube.
* SonarQube no es compatible con sistemas de 32 bits en el lado del servidor. SonarQube, sin embargo, admite sistemas de 32 bits en el lado del escáner.
## Plataformas compatibles
### Java
Los escáneres SonarQube y el servidor SonarQube requieren la versión 11 de Java. Las versiones posteriores a Java 11 no son compatibles oficialmente.
SonarQube es capaz de analizar cualquier tipo de archivos fuente de Java independientemente de la versión de Java que cumplan.
### Base de datos
Las versiones compatibles para PostgreSQL son: 13, 12, 11, 10, 9,6
### Notas de la plataforma
#### Linux
Si está ejecutando Linux, debe asegurarse de que:
* Actulizar el sistema operativo.
``` shell=
sudo yum update
sudo yum install vim wget curl -y
```
* vm.max_map_count debe ser mayor o igual que 524288
* fs.file-max debe ser mayor o igual que 131072
* el usuario que ejecuta SonarQube puede abrir al menos 131072 descriptores de archivo
* el usuario que ejecuta SonarQube puede abrir al menos 8192 subprocesos
Para modificar la configuración para que se ajuste a los requisitos de SonarQube, abra el archivo */etc/sysctl.conf* y agregue la configuración como se muestra a continuación:
``` shell=
$ vim /etc/sysctl.conf
sysctl -w vm.max_map_count=524288
sysctl -w fs.file-max=131072
ulimit -n 131072
ulimit -u 8192
```
Luego, vuelva a cargar la configuración de sysctl de la siguiente manera:
``` shell=
$ sysctl --system
```
Si está utilizando *systemd* para iniciar SonarQube, debe especificar esos límites dentro de su archivo de unidad en la sección [Service]:
```
[Service]
...
LimitNOFILE=131072
LimitNPROC=8192
...
```
#### Creacion de usuario para SonarQube
Se recomienda crear un usuario independiente para ejecutar SonarQube. Creemos uno de la siguiente manera:
``` shell=
$ useradd sonar
```
Luego, establezca una contraseña para el usuario.
``` shell=
$ passwd sonar
```
### Instalar Java 11
SonarQube está escrito en Java y necesita Java instalado (11 particularmente en esta configuración). Para instalar java 11 ejecutamos la siguiente línea de comando:
``` shell=
$ yum install java-11-openjdk-devel
```
### Instalación del servidor SonarQube. Componentes de la instancia
Una instancia de SonarQube consta de tres componentes:

1. El servidor SonarQube ejecuta los siguientes procesos:
* un servidor web que sirve a la interfaz de usuario de SonarQube.
* un servidor de búsqueda basado en Elasticsearch.
* el motor de cálculo encargado de procesar los informes de análisis de código y guardarlos en la base de datos de SonarQube.
2. La base de datos para almacenar lo siguiente:
* Métricas y problemas de calidad y seguridad del código generados durante los escaneos de código.
* La configuración de la instancia de SonarQube.
3. Uno o más escáneres que se ejecutan en sus servidores de integración continua o de compilación para analizar proyectos.
### Instalando la base de datos
Se admiten varios motores de base de datos . Asegúrese de seguir los requisitos enumerados para su base de datos. Son requisitos reales, no recomendaciones.
Cree un esquema vacío y un usuario sonarqube. Habilitar los permisos para el usuario sonarqube para realizar las operaciones de create, update y delete de objetos de este esquema.
#### Instalar y configurar PostgreSQL
Instalar la versión de [PostgreSQL 13](https://computingforgeeks.com/install-postgresql-13-on-centos-rhel/).
#### Crear usuario y base de datos de SonarQube
Crear un usuario para SonarQube. Proceda como se muestra a continuación antes de salir de su base de datos.
``` shell=
postgres=# create user sonar;
postgres=# create database sonar_db owner sonar;
postgres=# grant all privileges on database sonar_db to sonar;
```
Establecer una contraseña para el usuario de sonar creado
``` shell=
postgres=# ALTER USER sonar WITH ENCRYPTED password 'StrongPassword';
```
##### Observación
Si se quiere utilizar un esquema personalizado y no el "public" por defecto, se debe establecer la propiedad search_path de PostgreSQL:
```
ALTER USER mySonarUser SET search_path to mySonarQubeSchema
```
### Instalar y configurar SonarQube
Visitar la [página de descarga](https://www.sonarqube.org/downloads/) de distribuciones de SonarQube.
Descargaremos la edición para desarrolladores:
``` shell=
cd /opt/
$ wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.2.3.50713.zip
```
Luego descomprime el archivo
``` shell=
$ yum -y install unzip
$ unzip sonarqube-*.zip
```
Después de eso, cambie el nombre de la carpeta a sonarqube
``` shell=
$ mv sonarqube-*/ sonarqube
$ rm sonarqube-*.zip
```
### Configurar SonarQube en Centos 8
Una vez que los archivos se han extraído al directorio *opt*, se procede a configurar la aplicación.
Abra el archivo */opt/sonarqube/conf/sonar.properties* y agregue los detalles de la base de datos como se muestra a continuación. Además de eso, busque las líneas compartidas y descomente.
``` shell=
$ vim /opt/sonarqube/conf/sonar.properties
##Database details
sonar.jdbc.username=sonar
sonar.jdbc.password=StrongPassword
sonar.jdbc.url=jdbc:postgresql://localhost/sonar_db
##How you will access SonarQube Web UI
sonar.web.host=127.0.0.1#Cambiar
sonar.web.port=9000
##Java options
sonar.web.javaOpts=-Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError
sonar.search.javaOpts=-Xmx512m -Xms512m -XX:MaxDirectMemorySize=256m -XX:+HeapDumpOnOutOfMemoryError
##Also uncomment the following Elasticsearch storage paths
sonar.path.data=data
sonar.path.temp=temp
```
Otorgue la propiedad de los archivos de SonarQube al usuario sonar que creamos en el Paso 1.
``` shell=
$ chown -R sonar:sonar /opt/sonarqube
```
En caso de que no se pueda encontrar Java en la ubicación predeterminada, deberá especificar los archivos binarios para que SonarQube los encuentre. Puede especificar dónde está ubicado java en el archivo */opt/sonarqube/conf/wrapper.conf*. Busque la línea *wrapper.java.command* y coloque su ubicación Java junto a ella.
``` shell=
$ vim /opt/sonarqube/conf/wrapper.conf
wrapper.java.command=/usr/local/jdk-11.0.2/bin/java
```
#### Agregar archivo de servicio para SonarQube
Administrar la aplicación SonarQube a través de Systemd para que podamos iniciarla y detenerla como otros servicios en el servidor.
``` shell=
$ vim /etc/systemd/system/sonarqube.service
[Unit]
Description=SonarQube service
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/opt/sonarqube/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/bin/linux-x86-64/sonar.sh stop
LimitNOFILE=65536
LimitNPROC=4096
User=sonar
Group=sonar
Restart=on-failure
[Install]
WantedBy=multi-user.target
```
Después de editar los archivos systemd, tenemos que volver a cargarlos para que puedan leerse y cargarse.
``` shell=
$ systemctl daemon-reload
```
Luego inicie y habilite el servicio
``` shell=
$ systemctl start sonarqube.service
$ systemctl enable sonarqube.service
```
Verifique su estado si se inició correctamente y se está ejecutando.
``` shell=
$ systemctl status sonarqube.service
```
### Modificar las reglas del firewall para permitir el acceso a SonarQube
Una vez que el servicio de SonarQube esté funcionando. En caso de que no pueda acceder a la interfaz web, visite los archivos de registro ubicados en */opt/sonarqube/logs* donde encontrará:
* elasticsearch logs (es.log)
* Sonar logs (sonar.log)
* web logs (web.log)
* Access logs (access.log)
* And others
Como puede recordar, habilitamos la web de SonarQube para escuchar en el puerto 9000. Para que todo funcione, debemos permitir este puerto en el firewall (De ser necesario). Proceda a hacer esto ejecutando el comando compartido a continuación.
``` shell=
$ firewall-cmd --permanent --add-port=9000/tcp && firewall-cmd --reload
```
### Acceder a la interfaz de usuario web
El tiempo que estábamos esperando finalmente ha aparecido. Ahora estamos listos para acceder a la interfaz de SonarQube y comenzar a evaluar la seguridad de nuestro código. Para acceder a la interfaz, abra su navegador favorito y apúntelo a *http://server-ip-or-fqdn:9000*.
### Iniciar sesión
Para iniciar sesión, simplemente haga clic en el botón *Iniciar sesión* y debería ingresar a la página. Utilice el nombre de usuario como *admin* y la contraseña como *admin*.
# Instalación de Plugins de SonarQube para Jenkins
Instale el SonarScanner para Jenkins a través del Centro de Actualización de Jenkins. Luego configurar SonarQube:
* Instalar los plugins de SonarQube
* SonarQube Scanner
* Sonar Quality Gates
* Inicie sesión en Jenkins como administrador y vaya a **Manage Jenkins > Configure System**.
* Desplácese hasta la sección de configuración de SonarQube, haga clic en Añadir SonarQube y añada los valores que se le soliciten.
* El token de autenticación del servidor debe ser creado como una credencial de 'Texto Secreto'.
## Utilizando Jenkins pipeline
Primeramente se debe proporcionar un bloque withSonarQubeEnv que permita seleccionar el servidor SonarQube con el que se quiera interactuar. Los detalles de conexión que se haya configurado en la configuración global de Jenkins pasarán automáticamente al escáner.
``` shell=
withSonarQubeEnv('My SonarQube Server', envOnly: true) {
// This expands the evironment variables SONAR_CONFIG_NAME, SONAR_HOST_URL, SONAR_AUTH_TOKEN that can be used by any script.
println ${env.SONAR_HOST_URL}
}
```
#### Observaciones
- Anular el credentialId para no utilizar el que se encuentra definido en la configuración global (por ejemplo, si defines las credenciales a nivel de carpeta).
- Para expandir las variables de entorno de SonarQube en el contexto de la construcción se debe anular la bandera envOnly.
### Utilización de SonarQube a través de pipeline de Jenkins
A continuación se expone un ejemplo de la utilización de SonarQube a través de pipeline de Jenkins. Suponemos que se ejecuta en esclavos Unix y se ha configurado un servidor llamado "My SonarQube Server", así como las herramientas necesarias.
SonarScanner:
``` shell=
node {
stage('SCM') {
git 'https://github.com/foo/bar.git'
}
stage('SonarQube analysis') {
def scannerHome = tool 'SonarScanner 4.0';
withSonarQubeEnv('My SonarQube Server') { // If you have configured more than one global server connection, you can specify its name
sh "${scannerHome}/bin/sonar-scanner"
}
}
}
```
Ejemplo utilizado en la construcción del artefacto de una módulo.
``` groovy=
stage('Sonar Analysis',) {
withEnv(["JAVA_HOME=${ tool 'java11' }", "PATH+MAVEN=${tool 'maven'}/bin:${env.JAVA_HOME}/bin"]){
withSonarQubeEnv('sonar') {
withCredentials([string(credentialsId: 'truststorekey', variable: 'SECRET')]) {
sh "mvn org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -f pom.xml -Djavax.net.ssl.trustStore=/etc/ssl/keystore.jks -Djavax.net.ssl.trustStorePassword=${SECRET}"
}
}
}
}
```
# Referencias
[1] Computing for Geeks. Install SonarQube on CentOS 8 / Rocky Linux 8. Recuperado el 16 de diciembre del 2021, de https://computingforgeeks.com/install-sonarqube-on-rocky-linux-centos/
[2] sonarqube. Install the Server. Recuperado el 16 de diciembre del 2021, de https://docs.sonarqube.org/latest/setup/install-server/
[3] sonarqube. SonarScanner for Jenkins. Recuperado el 15 de diciembre del 2021, de https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-jenkins/