Dudo mucho que no sepas para qué sirven estas herramientas, pero si alguien que está empezando no las conoce, aquí va un pequeño comentario sobre ellas: SonarQube y NDepend son herramientas esenciales para el análisis estático del código, ayudando a identificar y corregir problemas de calidad, mejorar la seguridad y gestionar la deuda técnica en proyectos de software.

SonarQube

SonarQube es una plataforma de código abierto para análisis y gestión de la calidad del código. Proporciona informes detallados sobre la calidad del código, detecta bugs, vulnerabilidades de seguridad y malos olores de código (code smells) en una variedad de lenguajes de programación.

Para qué se usa:

  • Realizar análisis estático del código para identificar problemas de calidad.
  • Integrar con herramientas de CI/CD para análisis automáticos.
  • Monitorear la deuda técnica del proyecto a lo largo del tiempo.
  • Proporcionar métricas y reportes para ayudar a los desarrolladores a mejorar la calidad del código.
NDepend

NDepend es una herramienta para análisis estático de código, específicamente diseñada para aplicaciones .NET. Ofrece un conjunto avanzado de métricas y análisis que permiten a los desarrolladores mejorar y mantener la calidad del código.

Para qué se usa:

  • Analizar proyectos .NET para detectar problemas de calidad.
  • Proporcionar métricas avanzadas y visualizaciones del código.
  • Ofrecer reglas de codificación personalizables y consultas LINQ para analizar el código.
  • Facilitar la gestión y reducción de la deuda técnica.
Comparación
Característica SonarQube NDepend
Lenguajes Soportados Soporta múltiples lenguajes (Java, C#, JavaScript, etc.) Enfocado principalmente en .NET
Integración Se integra con CI/CD y múltiples herramientas de desarrollo Integración fuerte con Visual Studio y Azure DevOps
Métricas y Reportes Ofrece una amplia gama de métricas y reportes de calidad Proporciona métricas avanzadas y visualizaciones detalladas
Reglas Personalizables Sí, a través de plugins y configuraciones Sí, con LINQ para consultas personalizadas
Facilidad de Uso Interfaz web amigable y fácil de navegar Interfaz más técnica, orientada a desarrolladores .NET
 Coste Versión comunitaria gratuita y versiones de pago para características avanzadas Licencia comercial, con precios basados en el tamaño del equipo y uso
¿Quién es mejor en qué?
  • SonarQube es mejor si estás trabajando con múltiples lenguajes de programación y necesitas una solución centralizada para análisis de calidad del código con integración a herramientas de CI/CD.
  • NDepend es ideal para proyectos .NET que requieren análisis profundos y métricas avanzadas, especialmente si utilizas Visual Studio como tu entorno de desarrollo principal.

Sin duda recomiendo NDepend si lo que quieres es trabajo en local, así mantienes tu calidad, solo la tuya y de paso puedes ver que cosas neceistan mejorar en el resto del codigo de tu equipo.

Mi forma de trabajar con con SonarQube en Local

Lo más importante es poder usar Docker ya que vamos a usar esto: docker-compose.yml

version: '3.8'  
  
services:  
  sonarqube:  
    image: sonarqube:community  
    container_name: sonarqube  
    ports:  
      - "9000:9000"  
    environment:  
      - SONAR_JDBC_URL=jdbc:postgresql://db:5432/sonarqube  
      - SONAR_JDBC_USERNAME=sonar  
      - SONAR_JDBC_PASSWORD=sonar  
    volumes:  
      - sonarqube_data:/opt/sonarqube/data  
      - sonarqube_extensions:/opt/sonarqube/extensions  
      - sonarqube_logs:/opt/sonarqube/logs  
    depends_on:  
      - db  
  
  db:  
    image: postgres:latest  
    container_name: sonarqube_db  
    environment:  
      - POSTGRES_USER=sonar  
      - POSTGRES_PASSWORD=sonar  
      - POSTGRES_DB=sonarqube  
    volumes:  
      - postgresql_data:/var/lib/postgresql/data  
  
volumes:  
  sonarqube_data:  
    driver: local  
  sonarqube_extensions:  
    driver: local  
  sonarqube_logs:  
    driver: local  
  postgresql_data:  
    driver: local  

Ejecutamos desde el terminal: `docker-compose up -d`.

Una vez que el contenedor esté en ejecución, accede a SonarQube abriendo un navegador y visitando `http://localhost:9000`. El usuario y contraseña por defecto son `admin`/`admin`.

Configuro el Análisis Automático al Hacer Push

Generar un Token en SonarQube:

Instalamos los pre-requisitos:

Generamos el script de PowerShell:

# Define las variables necesarias  
$sonarScannerPath = "$HOME\.dotnet\tools\dotnet-sonarscanner"  
$projectKey = "your_test_app"  
$hostUrl = "http://localhost:9000"  
$token = "sqp_9fda09283505e4dde0712756a6e5f51580882f1d"  
$solutionPath = "ConsoleAppTestGitHub.sln"  
  
# Iniciar análisis de SonarQube  
Write-Host "Iniciando análisis de SonarQube..."  
& $sonarScannerPath begin /k:"$projectKey" /d:sonar.host.url="$hostUrl" /d:sonar.login="$token"  
if ($LASTEXITCODE -ne 0) {  
    Write-Host "Error al iniciar el análisis de SonarQube."  
    exit 1  
}  
  
# Compilar el proyecto  
Write-Host "Compilando el proyecto .NET..."  
dotnet build $solutionPath  
if ($LASTEXITCODE -ne 0) {  
    Write-Host "Error al compilar el proyecto."  
    exit 1  
}  
  
# Finalizar análisis de SonarQube  
Write-Host "Finalizando análisis de SonarQube..."  
& $sonarScannerPath end /d:sonar.login="$token"  
if ($LASTEXITCODE -ne 0) {  
    Write-Host "Error al finalizar el análisis de SonarQube."  
    exit 1  
}  
  
Write-Host "Análisis de SonarQube completado con éxito."  
exit 0  

Generamos el script del Hook:

#!/bin/bash  
  
# Obtener el directorio del script de pre-commit  
HOOK_DIR="$(dirname "$0")"  
  
# Ruta al script de PowerShell relativa al directorio del hook  
PS_SCRIPT="$HOOK_DIR/run-sonarqube.ps1"  
  
# Imprimir el directorio actual y la ruta del script para depuración  
echo "Directorio actual: $(pwd)"  
echo "Ruta al script de PowerShell: $PS_SCRIPT"  
  
# Verificar si el script de PowerShell existe  
if [ ! -f "$PS_SCRIPT" ]; then  
  echo "El archivo $PS_SCRIPT no se encontró. Verifica la ruta y vuelve a intentarlo."  
  exit 1  
fi  
  
# Ejecutar el script de PowerShell  
pwsh -File "$PS_SCRIPT"  
  
# Verificar el código de salida del script de PowerShell  
if [ $? -ne 0 ]; then  
  echo "El análisis de SonarQube falló. Abortando commit."  
  exit 1  
fi  
  
echo "Análisis de SonarQube completado con éxito. Procediendo con el commit."  
exit 0  

Guardar los Script:

Guarda el script en el hook de Git que desees utilizar, por ejemplo, .git/hooks/pre-commit o .git/hooks/pre-push.

Asegúrate de que el script tenga permisos de ejecución.

Aquí os dejo un artículo de como se trabaja con Git Hooks.

Y vemos como sería el log:

Yo uso GitKraken.

El Hook:

El script de pre-commit incluye una condición que impide continuar con el commit si la revisión de SonarQube falla. Esto garantiza que cumples con todos los requisitos necesarios antes de subir cambios a tu repositorio distribuido. Al hacerlo, también evitas consumos innecesarios en las pipelines, siempre y cuando uses la misma configuración. Además, si actualmente no tienes SonarQube u otra herramienta similar, al implementar esta práctica, estarás preparado para evitar sorpresas en el futuro si decides integrar SonarQube en tu flujo de trabajo.

Veamos que pasa si no cumplo con lo necesario:

Esto compila y no da ningun tipo de error.

int y = 0; 
int i = 1/y;

Pero no es algo que nos impida continuar con el scanner de SonarQube ya que el aviso que tenemos en SonarQube es el siguiente:

Por lo tanto, si deseamos detener el proceso de commit debido a advertencias, como en el caso de aquellas con un nivel de severidad bajo (Severity: Low), debemos modificar el script de PowerShell. Esto nos permitirá recibir notificaciones antes de proceder con el commit para cualquier situación que consideremos pertinente.

# Definir las variables necesarias  
$sonarScannerPath = "$HOME\.dotnet\tools\dotnet-sonarscanner"  
$projectKey = "your_test_app"  
$hostUrl = "http://localhost:9000"  
$token = "sqp_9fda09283505e4dde0712756a6e5f51580882f1d" 
$base64Token = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($token + ":"))
$solutionPath = "ConsoleAppTestGitHub.sln"  
  
# Iniciar análisis de SonarQube  
Write-Host "Iniciando análisis de SonarQube..."  
& $sonarScannerPath begin /k:"$projectKey" /d:sonar.host.url="$hostUrl" /d:sonar.login="$token"
if ($LASTEXITCODE -ne 0) {  
    Write-Host "Error al iniciar el análisis de SonarQube."  
    exit 1  
}  
  
# Compilar el proyecto  
Write-Host "Compilando el proyecto .NET..."  
dotnet build $solutionPath  
if ($LASTEXITCODE -ne 0) {  
    Write-Host "Error al compilar el proyecto."  
    exit 1  
}  
  
# Finalizar análisis de SonarQube  
Write-Host "Finalizando análisis de SonarQube..."  
& $sonarScannerPath end /d:sonar.login="$token"  
if ($LASTEXITCODE -ne 0) {  
    Write-Host "Error al finalizar el análisis de SonarQube."  
    exit 1  
}  
  
# Comprobar el resultado del Quality Gate  
Write-Host "Comprobando el estado del Quality Gate..."  
$response = Invoke-RestMethod 
 -Uri "$hostUrl/api/qualitygates/project_status?projectKey=$projectKey" 
 -Headers @{Authorization = "Basic $base64Token"} 
  
if ($response.projectStatus.status -eq "ERROR") {  
    Write-Host "El análisis no pasó el quality gate.
Por favor, revisa los problemas reportados."  
    exit 1  
} else {  
    Write-Host "El análisis pasó el quality gate con éxito."  
}  
  
exit 0  

Para ampliar este script deberás entrar en la documentación del API de SonarQube y poner lo que necesites.

Veamos que ocurre si cumplimos con las reglas:

Ahora quitamos esas instrucciones de código que había puesto y veamos el resultado al hacer el commit y en SonarQube:

Conclusión

El análisis estático del código es una práctica esencial para mantener la calidad y seguridad en los proyectos de software. Herramientas como SonarQube y NDepend son fundamentales para este propósito, cada una ofreciendo características únicas que se adaptan a diferentes necesidades de desarrollo.

SonarQube es una solución robusta y versátil que soporta múltiples lenguajes de programación, lo que lo convierte en una opción ideal para equipos que trabajan con una variedad de tecnologías. Su capacidad de integración con herramientas de CI/CD y su interfaz amigable hacen que sea accesible para una amplia gama de usuarios, desde desarrolladores individuales hasta grandes equipos.

NDepend, por otro lado, está específicamente diseñado para aplicaciones .NET, ofreciendo un análisis profundo y métricas avanzadas que son altamente valoradas en el ecosistema de desarrollo .NET. Su integración con Visual Studio y Azure DevOps lo hace especialmente atractivo para desarrolladores que ya están inmersos en el entorno .NET.

Para los autónomos y pequeñas empresas que buscan ofrecer productos de alta calidad, es crucial considerar la inversión en herramientas de pago como las licencias Developer de SonarQube o NDepend. Aunque la versión Community de SonarQube es adecuada para muchos casos, las características avanzadas de las versiones de pago pueden ser necesarias para proyectos más serios y exigentes.

La elección entre SonarQube y NDepend debe basarse en las necesidades específicas del equipo y los lenguajes de programación utilizados. Si el desarrollo se centra principalmente en .NET, NDepend puede ofrecer un valor significativo. Sin embargo, para proyectos que abarcan múltiples lenguajes, SonarQube sigue siendo una opción sólida.

Notas Finales:

  • No he incluido detalles específicos sobre NDepend en este documento, ya que mi intención era mostrar las posibilidades con una herramienta de pago y comparar con SonarQube. Es importante evaluar si tu trabajo se centra únicamente en .NET o en otros lenguajes para decidir qué herramienta te compensa más adquirir.
  • Y al incorporar la herramienta pre-commit (o el que te interese o varios) junto con un script de PowerShell, puedes expandir el control sobre tu proyecto para incluir pruebas, cobertura de código, y otros elementos esenciales. Esto te permitirá establecer un flujo de trabajo altamente eficiente y efectivo.