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.
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.