SonarQube es una herramienta de análisis continuo de código.

La versión open source ofrece soporte para 20 lenguajes de programación, mientras que la versión comercial amplía el número de analizadores. También hay analizadores creados por la comunidad.

SonarQube requiere una base de datos, por lo que vamos a usar una instancia de MySQL conectada al contenedor de SonarQube mediante la red backend-sonarqube.

Red bridge para conectar SonarQube y MySQL

Creamos la red bridge:

$ sudo docker network create backend-sonarqube
abd566a43dd75befb6d2233b3377f8aa4c80ba0371efa56b4e681b37734e8650

Volumen de datos para MySQL

Creamos un volumen para almacenar la base de datos:

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

Contenedor con MySQL

A continuación, creamos un contenedor para MySQL y lo conectamos a la red backend-sonarqube montando el volumen data-mysql-sonarqube.

$ sudo docker run -d --name mysql-sonarqube --network backend-sonarqube \
--mount source=data-mysql-sonarqube,target=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=J8wqnvJicbpv \
-e MYSQL_DATABASE=sonar \
-e MYSQL_USER=sonar -e MYSQL_PASSWORD=cF68nTVgP8Nq mysql:5.7
6966a54978df35eaafe6bf10dea7f3f4fcfdb3c5340e0e3ea5cddffd9bd02d06

Instalación de SonarQube

Volumen de datos para SonarQube

Creamos un volumen para almacenar datos de SonarQube:

$ sudo docker volume create data-sonarqube
data-sonarqube

Contenedor con SonarQube

Empezamos descargando la imagen desde Docker Hub:

$ sudo docker pull sonarqube:7.1-alpine
7.1-alpine: Pulling from library/sonarqube
ff3a5c916c92: Pull complete
5de5f69f42d7: Pull complete
fd869c8b9b59: Pull complete
70c099ba8bd1: Pull complete
a17c64d63dca: Pull complete
7773f7c061ed: Pull complete
Digest: sha256:f7f581a4de517d23f96aa3d6612a892a9741138c60e99933d24d5d2ee26a5332
Status: Downloaded newer image for sonarqube:7.1-alpine
$

Una vez descargada la imagen, lanzamos el contenedor:

$ sudo docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 \
  --mount source=data-sonarqube,target=/opt/sonarqube/data \
  -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
443cb80ef5bdc7168c654b0bea0883cfc8e665e465f3d12fa8bb06bdb1856f14
$

El comando para lanzar la imagen de SonarQube publica dos puertos, el 9000, acceso al interfaz web y el 9092, de conexión a la base de datos incrustada H2.

Montamos el volumen creado para SonarQube en el contenedor.

Mediante variables de entorno, especificamos el usuario y password de conexión a la base de datos. En la cadena de conexión, especificamos las variables necesarias para evitar Warnings en los logs.

Finalmente, especificamos que el contenedor de SonarQube debe estar conectado a la red backend-sonarqube.

Después de unos segundos, al revisar los logs, vemos que se está creando el schema de la base de datos para SonarQube:

$ sudo docker logs sonarqube
...
2018.04.26 20:19:04 INFO  web[][o.s.s.p.d.m.AutoDbMigration] Automatically perform DB migration on fresh install
2018.04.26 20:19:04 INFO  web[][DbMigrations] Executing DB migrations...
2018.04.26 20:19:04 INFO  web[][DbMigrations] #1 'Create initial schema'...
2018.04.26 20:19:14 INFO  web[][DbMigrations] #1 'Create initial schema': success | time=10068ms
2018.04.26 20:19:14 INFO  web[][DbMigrations] #2 'Populate initial schema'...
2018.04.26 20:19:14 INFO  web[][DbMigrations] #2 'Populate initial schema': success | time=430ms
...

Cuando finaliza el proceso:

$ sudo docker logs sonarqube
...
2018.04.26 20:20:37 INFO  ce[][o.s.ce.app.CeServer] Compute Engine is operational
2018.04.26 20:20:37 INFO  app[][o.s.a.SchedulerImpl] Process[ce] is up
2018.04.26 20:20:37 INFO  app[][o.s.a.SchedulerImpl] SonarQube is up
$

Y accediendo desde el navegador a http://$IPHOST:9000/:

SonarQube home

SonarQube home

Puerto 9092

Revisando la documentación de SonarQube, en el fichero de configuración sonar.properties el puerto 9092 se usa para conectar con la base de datos incrustada (embedded) H2:

...
#----- Embedded Database (default)
# H2 embedded database server listening port, defaults to 9092
#sonar.embeddedDatabase.port=9092
...

Dado que nosotros usamos MySQL, podemos relanzar el contenedor sin publicar el puerto 9092:

$ sudo docker stop sonarqube
sonarqube
$ sudo docker rm sonarqube
sonarqube
$ sudo docker run -d --name sonarqube -p 9000:9000 \
  --mount source=data-sonarqube,target=/opt/sonarqube/data \
  -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
443cb80ef5bdc7168c654b0bea0883cfc8e665e465f3d12fa8bb06bdb1856f14

Volumen para plugins de SonarQube

Examinando el fichero Dockerfile en GitHub podemos ver que SonarQube expone otro volumen para las extensiones (o plugins):

...
VOLUME ["$SONARQUBE_HOME/data", "$SONARQUBE_HOME/extensions"]
...

Si es necesario, podemos crear un nuevo volumen data-sonarqube-extensions y montarlo en un nuevo contenedor para SonarQube.

Acceso a SonarQube y cambio del password por defecto

Pulsando sobre Log in accedemos a la página de acceso a Sonarqube.

Las credenciales de acceso por defecto, tal y como se detalla en Default Admin Credentials son admin y admin.

Después de acceder a Sonarqube con las credenciales por defecto, pulsamos Skip this tutorial en la parte superior derecha de la pantalla “Welcome to SonarQube”.

Para cambiar el password:

  1. Pulsamos sobre la letra “A” que actúa como avatar para el usuario admin.
  2. En el menú desplegable, seleccionamos My Account
  3. Pulsamos sobre Security
  4. En la parte inferior de la pantalla, podemos realizar el cambio de password, introduciendo el password actual y repitiendo el nuevo password dos veces.

Configuración del servidor de correo

  1. Accedemos a SonarQube como administrador
  2. En la barra superior, pulsamos Administration
  3. En la página de Administration, pulsamos en Configuration. En el desplegable, seleccionamos General Settings
  4. Hacemos scroll hasta el apartado Email

En esta sección podemos indicar:

  • Prefijo de los correos enviados: [SONARQUBE] (por defecto)
  • Dirección del remitente (From address): sonarqube-notify@local.dev
  • Nombre del remitente (From Name): SonarQube Notification
  • Secure connection: Lo dejamos en blanco para deshabilitar conexiones seguras
  • Servidor de correo (SMTP host): $(IPHOST)
  • Contraseña (SMTP password): Lo dejamos en blanco (MailDev no requiere autenticación)
  • Puerto SMTP (SMTP port): 10025 (el configurado para MailDev)
  • Usuario con permisos para enviar correo (SMTP username): Lo dejamos en blanco (MailDev no requiere autenticación)

Finalmente, podemos comprobar si el envío de correos funciona usando la opción Test configuration.