En el post anterior hablamos de un server MCP de Sonarqube, pero si ni siquiera sabemos que es Sonarqube? Vamos a correr antes de aprender a caminar? Claro que no! Si nunca instalaron Sonarqube, o no saben que es, les cuento: Sonarqube es una app que analiza tu codigo, y te puede decir, por ej. si tus funciones son muy complicadas de mantener (por ej, si tenes 20 IF anidados, eso se considera un problema de "Code Smell", porque es muy dificil congnitivamente seguir el codigo), o si tenes un problema de seguridad grave (aunque hace mucho mas que eso!)
Sonarqube mira todo tu codigo, te genera avisos de seguridad, mantenimiento de codigo, % de tu codigo que esta cubierto por tests de unidad, y te lo ordena por Severidad (Blocker, High, Medium, etc).
La herramienta se encuentra disponible en modo "Cloud" (no instalas nada), con un Free Tier generoso (hasta 50k de lineas de codigo es gratuito), o sino lo podes correr OnPrem. Lo ideal es correrlo automaticamente al hacer los Pull Requests, y podes correrlo, por ej, semanalmente en el codigo completo.
Tambien podes elegir entre arreglar o no algo - capaz a mi no me interesa que los placeholders esten todos en PascalCase, entonces puedo elegir aceptarlo (que lo voy a arreglar en algun momento) o ponerlo como Falso positivo, para que no lo reporte mas.

Mi repo esta hosteado en Github, y tiene muchiiiisimo menos que 50k de lineas de codigo, asi que puedo usar el free tier. Es una API para un blog, no un descubrimiento en el campo cuantico 😅
Para eso, segui las instrucciones de esta pagina: Getting Started -- Github y me arme una Github Action que corre en los pull request (y tambien on demand para el codigo completo) que realiza el analisis. Fue muy simple
- Saque la cuenta en https://sonarcloud.io/ usando Github
- Importe el repo que me interesaba
- Configure los secrets en Github
- Configure la accion para que compile y corra el proceso. Mi API esta en .NET, asi que mi action se ve mas o menos asi:
name: SonarQube
on:
push:
branches:
- main
pull_request:
types: [opened, synchronize, reopened]
workflow_dispatch:
jobs:
build:
name: Build and analyze
runs-on: windows-latest
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 17
distribution: 'zulu' # Alternative distribution options are available.
- name: Cache SonarQube Cloud packages
uses: actions/cache@v4
with:
path: ~\sonar\cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Cache SonarQube Cloud scanner
id: cache-sonar-scanner
uses: actions/cache@v4
with:
path: ${{ runner.temp }}\scanner
key: ${{ runner.os }}-sonar-scanner
restore-keys: ${{ runner.os }}-sonar-scanner
- name: Install AWS Lambda Tools
shell: powershell
run: |
dotnet tool install -g Amazon.Lambda.Tools
- name: Install SonarQube Cloud scanner
if: steps.cache-sonar-scanner.outputs.cache-hit != 'true'
shell: powershell
run: |
New-Item -Path ${{ runner.temp }}\scanner -ItemType Directory
dotnet tool update dotnet-sonarscanner --tool-path ${{ runner.temp }}\scanner
- name: Restore dependencies
working-directory: src
run: dotnet restore
- name: Build and analyze
working-directory: src
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
shell: powershell
run: |
${{ runner.temp }}\scanner\dotnet-sonarscanner begin /k:"miproyecto" /o:"miuser" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonarcloud.io"
dotnet build --no-restore --configuration Release
${{ runner.temp }}\scanner\dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}"
Y listo! Cuando corre, manda los resultados directamente a https://sonarcloud.io/, donde tengo un dashboard que puedo ver que me sugiere.

Es algo realmente util para tener visibilidad de problemas antes de que ocurran (en el caso de los pull requests), o una vista general de todo el proyecto.
Obviamente si quieren correr la version hosted, deberan instalarla y configurarla siguiendo las instrucciones del sitio: QuickStart Guide
Espero que les sirva, lo instalen y revisen su codigo: yo me encontre con dos Security: Blocker que se me habian pasado y fueron rapidamente arreglados. Importante: no se pongan mal si la primera vez que lo corren, encuentra mil problemas: es un poco esperable; enfoquense en los de prioridad mas alta y seguridad, y despues el resto lo van revisando.
Siempre cuento esta anecdota: en la empresa anterior, lo teniamos self-hosted y nos encontro un loop infinito antes que el pull request fuera mergeado. Asi que no lo subestimen, ni piensen que no lo necesitan, porque a pesar de haber tenido revision de dos personas, se paso por alto y si hubiera llegado a PROD, hubiera sido un desastre.
Cuentenme si lo usan, o si lo van a implementar!
Links: