Acelerando los desarrollos con contenedores : SonarQube

Publicado por Víctor Madrid el

Arquitectura de SolucionesDockerSonarQube

En este artículo se va a mostrar cómo poder disponer de un contenedor de SonarQube de forma rápida para utilizarlo durante el desarrollo con vistas a mejorar la calidad de nuestro código y algunas cosas más...

¿Qué es SonarQube?

SonarQube es un producto Open Source muy popular en el mundo del desarrollo Java que se encarga de realizar un análisis estático sobre el código fuente de manera automática.

Importante
  • Implica NO ejecutar el código
  • Implica NO ejecutar los tests pero si utilizar los informes de sus ejecuciones
  • En ningún caso SonarQube sustituye a los tests unitarios (los complementa)

Vamos.... que es un chivato de las cosas que hacemos mal o que podríamos mejorar en nuestro código.

Para los que no lo sepáis, se trata de una agrupación de diversos plugins conocidos en el mundo de Java como PMD, Findbug o Checkstyle.

Algunos de los aspectos que aparecen en el análisis son :

  • Volumetrías de las pruebas
  • Cobertura del código probado
  • Uso de comentarios
  • Tamaño de clases y métodos
  • Complejidad ciclomática
  • Volumetrías código duplicado
  • Incumplimiento de convenciones de código
  • Incumplimiento de estándares
  • Incumplimiento de olores de código -> "Code Smells"
  • ...

Se suele utilizar en los ciclos de Integración Continua lo que facilita realizar un análisis cada vez que alguien sube código.

Si alguien le presta atención y un poco de cariño a esta herramienta, podrá sacar mucha información sobre como mejorar el código a muchos niveles : diseño, reutilización, desacoplamiento, etc

Para aprender más cositas sobre SonarQube ya sabéis que hay mogollón de artículos en Internet sobre como usarlo y esas cosas. Hoy nos centraremos en su instalación y uso como un contenedor.

Este artículo está dividido en 4 partes:

  • 1. Introducción
  • 2. Stack Tecnológico
  • 3. Ejemplos de Uso
  • 4. Conclusiones

1. Introducción

En este apartado se tratarán los siguiente puntos :

  • 1.1. Introducción al uso de contenedores como aceleradores del desarrollo
  • 1.2. ¿Qué necesidades tenemos para tener un "SonarQube" con contenedores?

1.1. Introducción al uso de contenedores como aceleradores del desarrollo

Para centralizar esta información en un único punto y así poder facilitar su consulta se ha diseñado un artículo específico

1.2. ¿Qué necesidades tenemos para requerir un "SonarQube" con contenedores?

Los motivos principales que me llevaron a tratar de investigar en tener un SonarQube dentro de un contenedor fueron los siguientes:

  • Disponer de una instalación inmutable
  • Replicar la instalación del producto del cliente en local (versionado, entorno, etc.)
  • Minimizar en un entorno previo los posibles cambios de configuración que pudiéramos requerir --> Perdiendo el miedo a los cambios :-)
  • Asegurarse de que a todo el mundo le funcionaba de primeras
  • Ayudar al equipo a coger experiencia en el uso de SonarQube
  • Tener un posible plan B ante caídas del sistema final
  • Analizar en local la aplicación
  • Probar nuevas reglas o nuevos gates sobre el código antes de aplicarlo sobre el sistema final
  • ...

2. Stack Tecnológico

Este es stack tecnológico elegido para implementar la funcionalidad "SonarQube":

  • Java 8
  • Docker - Tecnología de Contenedores/Containers
  • Docker Hub - Repositorio de Docker Público donde se ubican las imágenes oficiales
  • SonarQube - Analizador de código estático

3. Ejemplos de Uso

Para enseñar a utilizarlo y así practicar se ha habilitado un repositorio, este repositorio se reutilizará para otros artículos de "Acelerando los desarrollos con contenedores".

La parte de que tiene que ver con este artículo se encuentra en el apartado de docker/sonarqube/8.2-community

Este proyecto consta del siguiente elemento:

  • Contenedor de SonarQube + Base de datos Postgres
  • Proporciona la instalación del producto en la versión establecida
  • Proporciona la configuración para su uso (usuarios, password, etc)
  • Proporciona la configuración de la aplicación a partir de su fichero de propiedades (sonar.properties)
  • Proporciona la configuración para mantener la persistencia en volúmenes mediante base de datos

Ejemplo de fichero "docker-compose.yaml"

version: "3"

services:

  sonarqube:
    build: ./8.2-community
    ports:
      - "9000:9000"
    environment:
      - SONARQUBE_JDBC_URL=jdbc:postgresql://sonarqubedb:5432/sonar
      - SONARQUBE_JDBC_USERNAME=sonar
      - SONARQUBE_JDBC_PASSWORD=sonar
    networks:
      - sonarqube-net
    volumes:
      - sonarqube_conf:/opt/sonarqube/conf
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
      - sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins

  sonarqubedb:
    image: postgres
    container_name: sonarqubedb
    networks:
      - sonarqube-net
    environment:
      - POSTGRES_USER=sonar
      - POSTGRES_PASSWORD=sonar
    volumes:
      - sonarqube_postgresql:/var/lib/postgresql
      - sonarqube_postgresql_data:/var/lib/postgresql/data

networks:  
  sonarqube-net:

volumes:  
  sonarqube_conf:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  sonarqube_bundled-plugins:
  sonarqube_postgresql:
  sonarqube_postgresql_data:

Para ver como lanzarlo ver fichero README dentro del proyecto.

3.1. Scripts de Soporte

N/A

3.2. Investigar lo que se usa

Cuando uno crea un contenedor basado en una imagen, ya se ha visto que consideraciones se deben tener para llegar a entender que es lo que hace.

Si tienes alguna duda vuelve a revisar el apartado "Soporte de Análisis de Contenedores" del artículo de introducción : Acelerando los desarrollos con contenedores: Introducción

Ejemplo de ejecución para mostrar la información del proceso ejecutado tras realizar un "up"

Ejemplo de inspección sobre el contenedor creado

Ejemplo de investigación general dentro del contenedor

Se podrán validar algunos de los aspectos configurados como puede ser la cadena de conexión a la base de datos, etc.

3.3. Verificar resultados

Se accede a la URL del SonarQube con:

http://localhost:9000/  

4. Conclusiones

Dedicando poco tiempo y sin muchos "quebraderos de cabeza" hemos sido capaces de montarnos un SonarQube para nuestro total uso.

Esto seguro que gustará muchísimo a los QAs y también a los desarrolladores a los que les gusta tener controlado el código, además que nos permite utilizarlo en nuestros desarrollos caseros para darles ese puntito PRO que a veces les falta.

Sin nada mas que decir sobre esta mega herramienta.

Espero que os haya gustado y sobre todo que os sea de utilidad.

Si te ha gustado, ¡síguenos en Twitter para estar al día de próximos posts!

Autor

Víctor Madrid

Líder Técnico de la Comunidad de Arquitectura de Soluciones en atSistemas. Aprendiz de mucho y maestro de nada. Técnico, artista y polifacético a partes iguales ;-)