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!