SonarQube con Docker Compose y PostgreSQL

Ya estuvimos viendo en otra entrada cómo hacer un análisis estático de código con SonarQube levatándolo con Docker. Sin embargo, en esa entrada vimos que nuestros análisis se guardaban en una base de datos embebida.

En este post, vamos a ver cómo podemos levantar nuestro SonarQube con docker-compose y utilizar una base de datos PostgreSQL (desde la versión SonarQube v7.9, dejaron de soportar MySQL) para guardar toda la información de los análisis que vayamos haciendo.

Lo primero que vamos a hacer es crearnos una carpeta sonar donde guardaremos un fichero Dockerfile para definir la imagen que SonarQube que queremos crear, junto con un fichero de propiedades el cual le dirá a sonar dónde podemos encontrar los resultados de nuestros tests.

Vamos a empezar por crear nuestro fichero de properties.

sonar.junit.reportPaths=target/surefire-reports
sonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml

En este fichero, le estamos diciendo a sonar dónde puede encontrar los reports de los tests ejecutados (debemos utilizar el plugin de maven surefire-reports para generar los reports de los tests), así como los reports de la cobertura de nuestro código (utilizaremos el plugin de maven jacoco para realizar la cobertura).

A continuación, vamos a crear el fichero Dockerfile. Usaremos la última versión de sonarqube y copiaremos el fichero de properties en la carpeta de configuración del contenedor.

FROM sonarqube:latest

COPY sonar.properties /opt/sonarqube/conf

Una vez tenemos nuestros ficheros Dockerfile y sonar.properties creados en la carpeta sonar, vamos a crear un fichero docker-compose.yml en la carpeta padre donde le diremos los servicios que queremos levantar.

version: '3'

services:
  sonarqube:
    build: ./sonar
    ports:
      - 9000:9000
    networks:
      - sonar_network
    environment:
      - SONARQUBE_JDBC_URL=jdbc:postgresql://sonar-db:5432/sonarqube
      - SONARQUBE_JDBC_USERNAME=sonar
      - SONARQUBE_JDBC_PASSWORD=s0narPassw0rd
    volumes:
      - sonarqube_conf:/opt/sonarqube/conf
      - sonarqube_data:/opt/sonarqube/data

  sonar-db:
    image: postgres:latest
    networks:
      - sonar_network
    environment:
      - POSTGRES_USER=sonarqube
      - POSTGRES_PASSWORD=s0narPassw0rd
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data

networks:
  sonar_network:
    driver: bridge

volumes:
  sonarqube_conf:
  sonarqube_data:
  postgresql:
  postgresql_data:

Ahora solo debemos ejecutar docker-compose up (con la opción -d si lo queremos ejecutar como demonio en segundo plano) para que nuestros servicios se levanten.

Podría ser que cuando levantemos nuestros servicios, sonarqube de un error como el siguiente y no arranque:

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

Este error es debido a que sonarQube usa un ElasticSearch embebido, con lo que necesita que nuestra máquina tenga una serie de requisitos (ver apartado Docker Host Requirements).

Por tanto, si estamos ejecutando docker en una máquina linux (en mi caso Ubuntu 20.04), vamos a necesitar ejecutar los siguientes comandos:

$ sudo sysctl -w vm.max_map_count=262144
$ sudo sysctl -w fs.file-max=65536

Nota: si queremos que esto se mantenga de forma permanente en nuestro sistema, debemos añadir estas líneas al fichero /etc/systemctl.conf de la siguiente manera (ejecutando posteriormente «$ sysctl -p» como usuario root para que se actualice la configuración):

vm.max_map_count=262144
fs.file-max=65536

Una vez ejecutado (se puede comprobar los valores con «$ cat /proc/sys/vm/max_map_count» y «$ cat /proc/sys/fs/file-max» respectivamente), deberíamos poder levantar sin problemas nuestros servicios y acceder a nuestro sonarQube a través de http://localhost:9000 con el usuario y password por defecto admin/admin.

Finalmente, podemos añadir a nuestro proyecto maven el plugin de Jacoco y el surfire-plugin.

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>

		<plugin>
			<artifactId>maven-surefire-plugin</artifactId>
			<version>3.0.0-M4</version>
			<!--<configuration> 
                               <excludes> <exclude>DataTest.java</exclude> </excludes> 
			       <includes> <include>DataCheck.java</include> </includes>  
                        </configuration> -->
		</plugin>
		<plugin>
			<groupId>org.jacoco</groupId>
			<artifactId>jacoco-maven-plugin</artifactId>
			<version>0.8.4</version>
			<executions>
				<execution>
					<id>default-prepare-agent</id>
					<goals>
						<goal>prepare-agent</goal>
					</goals>
				</execution>
				<execution>
					<id>default-report</id>
					<phase>prepare-package</phase>
					<goals>
						<goal>report</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>

Y ya ejecutar nuestro análisis y ver los resultados, como hicimos en la entrada anterior, con la salvedad de que ahora los datos se nos almacenarán en nuestra base de datos PostgreSQL y con persistencia de datos.

Los ficheros están disponibles en https://github.com/secdevoops/sonarQube

Categorías