Python – Exportando datos de Sonar con sonar-exporter

Muchas empresas utilizan SonarQube para el análisis estático de código y ejecución de pruebas unitarias, lo que permite entre otras cosas, detectar bugs, vulnerabilidades de seguridad, cobertura de código, y code smells, para diferentes lenguajes de programación (ej: Java, Kotlin, C#, JavaScript, Python, etc.). En este Post os comparto una utilidad Python de línea de comandos para la exportación a CSV de datos de SonarQube, de utilidad para obtener tanto datos de usuario, grupos, y proyectos, como métricas de los diferentes proyectos, y poder ver su evolución en el tiempo. Open Source, totalmente free (repo en GitHub), y preparada para correr en Docker y Kubernetes.

Continuando con las series de Posts sobre Python y sobre SonarQube, en esta ocasión os comparto la primera versión de una utilidad Python de línea de comandos para la exportación a CSV de datos de Sonar, atacando a la API de SonarQube. Similar a atlassian-exporter y jenkins-exporter, pero en este caso con foco en Sonar.

Lo podéis encontrar en el siguiente repo de GitHub (el Readme es bastante autoexplicativo): GitHub – ElWillieES – sonar-exporter

Si antes de continuar leyendo, te interesa, puedes consultar el anterior Post en el que hacíamos una introducción a SonarQube, SonarScanner CLI, y SonarLint, donde además de introducirlo explicamos cómo instalarlo. Dicho esto, continuamos.

En la versión actual, se puede exportar la siguiente información:

  • Usuarios, Grupos, y pertenencia de Usuarios a Grupos
  • Proyectos de Sonar
  • Un conjunto de métricas o medidas predefinida (ej: ncloc, comment_lines, coverage, bugs, code_smells, etc) de cada Proyecto
  • Histórico de análisis de cada Proyecto de Sonar
  • Histórico de métricas (ej: ncloc, comment_lines, coverage, bugs, code_smells, etc), para cada análisis de cada proyecto de Sonar

Estos datos se obtienen a través de llamadas a la API de SonarQube, que devuelve resultados paginados, que son procesados para generar los CSVs resultantes, para que los podamos importar donde deseemos.

Se trata de un programa de línea de comandos, que espera recibir dos parámetros:

  • Acción que se desea realizar. Básicamente es indicar qué datos deseamos exportar, que se generarán en la carpeta ./export/
  • Fichero de configuración. Proporciona los datos de conexión en un fichero JSON con una formato determinado ubicado en la carpeta ./config/, básicamente los datos de conexión a Sonar.

Las carpetas ./config/ y ./export/ están añadidas al fichero .gitignore, para evitar que se puedan subir tanto credenciales como datos a los repos remotos de Git, por privacidad como por intentar mantener el repo limpio (evitar subir exportaciones de diferentes pruebas, que no aportan valor en el repo remoto).

A continuación se muestra un ejemplo de uso.

python sonar-exporter.py -c sonar_conn_elwillie.json -a export_all_sonar_users
python sonar-exporter.py -c sonar_conn_elwillie.json -a export_all_sonar_groups_and_members
python sonar-exporter.py -c sonar_conn_elwillie.json -a export_all_sonar_projects_with_metrics
python sonar-exporter.py -c sonar_conn_elwillie.json -a export_all_sonar_projects_analyses
python sonar-exporter.py -c sonar_conn_elwillie.json -a export_all_sonar_projects_analyses_metrics

En el caso de Docker, podemos utilizar un volumen para poder acceder a los datos exportados una vez que ha finalizado la ejecución del contenedor.

rm app/export/*

docker build -t sonar-exporter .
docker images

docker run -v d:/code/elwillie/sonar-exporter/app/export:/usr/src/app/export --rm sonar-exporter python sonar-exporter.py -c sonar_conn_elwillie.json -a export_all_sonar_users
docker run -v d:/code/elwillie/sonar-exporter/app/export:/usr/src/app/export --rm sonar-exporter python sonar-exporter.py -c sonar_conn_elwillie.json -a export_all_sonar_groups_and_members
docker run -v d:/code/elwillie/sonar-exporter/app/export:/usr/src/app/export --rm sonar-exporter python sonar-exporter.py -c sonar_conn_elwillie.json -a export_all_sonar_projects_with_metrics
docker run -v d:/code/elwillie/sonar-exporter/app/export:/usr/src/app/export --rm sonar-exporter python sonar-exporter.py -c sonar_conn_elwillie.json -a export_all_sonar_projects_analyses
docker run -v d:/code/elwillie/sonar-exporter/app/export:/usr/src/app/export --rm sonar-exporter python sonar-exporter.py -c sonar_conn_elwillie.json -a export_all_sonar_projects_analyses_metrics

Poco más por hoy, como siempre confío que la lectura resulte de interés.