lunes, 9 de marzo de 2020

Usar SonarQube 8 Community con proyectos .Net Framework

Hola a todos. Esta vez vamos a instalar la espectacular herramienta SonarQube 8 Community edition, para validar proyectos .Net Framework. En mi caso usaré un aplicación MVC 4, escrita en C# usando .Net Framework 4. Esto sirve perfecto para aplicaciones .Net 2.0 o de MVC 5 con Framework 4.5,  tanto escritos en VB.Net o C#. Fue un trabajo de investigación de varios días ya que hay mucha información desactualizada en la Red, dispersa, e incluso en el sitio oficial de SonarQube en GitHub.
SonarQube para los que no saben, permite validar el código, buenas prácticas, temas de seguridad, como top 10 OWASP, bugs, "código que huele mal" o Code Smell y entrega líneas o tips para corregirlo, a veces, hasta con las líneas de código correcta en el lenguaje que estás usando y que se deben usar. Osea, mas en bandeja no se puede. Los resortes quedan online para todos los del team o jefatura, haciendo visible el stastus con colores, tipo semáforo.

Lo primero, recomiendo tener un Servidor Linux, puede ser CentOS o RHEL con Docker instalado, para que tenga el Servidor de SonarQube, de lo contrario en tu mismo Windows 10 Prof/Ent, deberás tener Docker Desktop for Windows  para que entregue el servicio a tu team/usuarios.

Parte 1: Dejar SonarQube corriendo con un usuario no admin


1. Crear Red para que los contenedores de SonarQube y la BBDD Postgres se comuniquen

docker network create redsonarqube

2. Bajar imagen y levantar contenedor de BBDD Postgres SQL

docker run --name sonar-postgres -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar -d -p 5432:5432 --net redsonarqube postgres

Ejecutar docker ps -a
Para ver como quedó corriendo la BBDD.
3. Bajar imagen y levantar contenedor de SonarQube 8 Community. Quedará corriendo en el port 9000 que es el port por defecto de SonarQube.

docker run --name sonarqube -p 9000:9000 -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e SONARQUBE_JDBC_URL=jdbc:postgresql://sonar-postgres:5432/sonar -d --net redsonarqube sonarqube:8-community

Ejecutar docker ps -a
Para ver como quedó corriendo Sonarqube.

3. Probar. Accede yendo a

http://localhost:9000

Y verás ventana de login:
Si lo dejas en un servidor o tu PC lo quieres dejar con ese servicio, debes darle al resto del team o quien quiera acceder la IP Fija del equipo, por ejemplo:

http://192.168.10.1:9000


4. Logeate a SonarQube con las credenciales.
user: admin
pass: admin

5. Crear un usuario no admin
Usuario: test
pass: 1234

Ve a Administration - Security - Users
En los datos, puedes colocar login, nombre, correo opcional, y clave.
Si entras con ese  usuario test también funciona. 
Ese usuario se lo puedes dar al resto del team.

Parte 2: Configurar .Net para que compile, revise el código y publique en SonarQube


1. Bajar SonarScanner for MSBuild para cada equipo del desarrollador con Visual Studio

https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-msbuild/

Bajar el que dice: .NET Framework 4.6+

sonar-scanner-msbuild-4.7.1.2311-net46.zip

Descomprimir en una carpeta dada y cambiarle el nombre por uno más corto, ejemplo:

C:\sonarqube\sonar-msbuild\
2. Configurar en cada equipo desarrollo el uso de SonarQube server

Ir a la carpeta

C:\sonarqube\sonar-msbuild\sonar-scanner-4.1.0.1829\conf

y abrir archivo sonar-scanner.properties

#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here
#----- Default SonarQube server
sonar.host.url=http://localhost:9000
#----- Default source code encoding
#sonar.sourceEncoding=UTF-8

Esta parte cámbiala por el Servidor de SonarQube
http://192.168.10.1:9000

3. Agregar dos Variables de Ambiente

Ir a las Variables de Entorno, ir a Variables de Sistema (sección inferior) y editar la variable Path, agregar:

- la ruta donde está SonarScanner.MSBuild.exe
  C:\sonarqube\sonar-msbuild

- la ruta de sonar-scanner.bar
  C:\sonarqube\sonar-msbuild\sonar-scanner-4.1.0.1829\bin
(Las rutas de la imagen pueden variar de acuerdo a la guía)

Prueba que quedó ok. Ve a CMD y ve a C:

SonarScanner.MSBuild.exe

(en la documentación de https://github.com/SonarSource/sonar-scanning-examples/tree/master/sonarqube-scanner-msbuild/CSharpProject Dice que se debe usar SonarQube.Scanner.MSBuild.exe pero al correrlo dice que está deprecado en cambio usar SonarScanner.MSBuild.exe)

Presiona Enter y debe decir lo de abajo:
Para probar el Scanner que es el más importante, solo escribe en CMD:

sonar-scanner.bat

Te dirá la versión de SonarQube del servidor. También, tratará de buscar un proyecto para escanear y dará error.
4. Instalar MsBuild 14 o superior en cada equipo de desarrollo

Esto se pide en la documentación oficial: https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-msbuild/

Lo primero, es hacer un test rápido. Ve a CMD y escribe

msbuild.exe

Y debe indicar versión 14 o superior. Si te dice una menor como 10 u 12, sigue leyendo.
- Instalar Microsoft .NET Framework 4.6.2
https://www.microsoft.com/es-cl/download/details.aspx?id=48159

Instalar Visual Studio 2015 Edición Community con Update 3
https://my.visualstudio.com/Downloads?q=Visual%20Studio%202015%20with%20Update%203

Este software instala el MsBuild 14 que es la necesaria por SonarQube.

Valida que tengas el archivo (se crea al instalar el IDE recién indicado):

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\WebApplications\ Microsoft.WebApplication.targets

Agregar a las variables de ambiente de sistema, variable Path, la ruta de MsBuild.exe

C:\Program Files (x86)\MSBuild\14.0\Bin

Probar de nuevo yendo a DOS y escribiendo

msbuild.exe

Y ahora si debe indicar versión 14.

5. Configurar reglas de validación a excluir/ignore
Ir a Administración – Configuration – Analysis Scope

Ir a Sección Ignore Issues on MultipleCriteria y setear dos ítems:

- Rule Key Pattern

Es la regla que queremos ignorar. Por ejemplo, si miramos un bug y vemos el detalle, puede tener esto:

A: Error dice: CSS properties should be valid, y tiene el código css:S4654.

Otro caso que vamos a quitar es
B: Images tags and buttons should have an "alt" attribute
Tiene el código: Web:ImgWithoutAltCheck

Si queremos omitir ambos casos, debemos poner ambos códigos.

- File Path Pattern

Es el patrón regexp de carpetas o archivos que aplicará ese ignore. Ejemplo si queremos aplicarlo sobre todos los CSHTML:

**/Ejemplo.Web/**/*.cshtml

Luego clic en Save.
Nota: si ya tienes un proyecto y quieres volver a procesarlo con este ignore, debes volver a ejecutar el Build al menos (y no Rebuild completo).

6. Ejecutando Bat con Etapas SonarQube

Coloca la solución .Net en un sitio fácil acceso, ejemplo:

C:\SLN\
Donde dentro de SLN\ está el sln de su solución .Net.

Ejemplo
C:\SLN\Ejemplo.Web\   ---> CSHTML, JS, CSS, etc
C:\SLN\mi.sln

Crea un archivo .bat EjecutaSonarQube.bat con esto:

CD "C:\SLN\"

SonarScanner.MSBuild.exe begin /v:"1.0" /n:"MiProyecto" /k:"RELEASE_1" /d:sonar.host.url="http://192.168.10.1:9000" /d:sonar.verbose=false /d:sonar.login="test" /d:sonar.password="1234" /d:sonar.exclusions="**/Ejemplo.Web/**/jquery.unobtrusive-ajax.js, **/Ejemplo.Web/**/MicrosoftMvcAjax.debug.js, **/Ejemplo.Web/Properties/PublishProfiles/**/*, **/Ejemplo.Web/Scripts/MicrosoftAjax.debug.js"

MSBuild.exe "C:\SLN\mi.sln" /t:Build


SonarScanner.MSBuild.exe end /d:sonar.login="test" /d:sonar.password="1234"

Expliquemos un poco. SonarQube tiene 3 etapas:

- Begin

Es el seteo de parámetros de SonarQube. Va el usuario, clave y Host del Servidor de SonarQube, carpetas o archivos excluidos:

/n: Nombre del proyecto

/k: key única, permite navegar directo, ejemplo, si mi key es test_123 permite navegar directo

http://192.168.10.1:9000/dashboard?id=test_123

/v: versión, debería subir en cada Build o Rebuild

Ejemplo: /v:1.0

/d:sonar.verbose: true o false. Agrega más información tanto en análisis del cliente o del servidor.

/d:sonar.exclusions: archivos o carpetas a excluir. En mi caso sacaré archivos js de Microsoft que no quiero analizar ya que producen falsos positivos. Si agregas más de uno, sepáralos por coma.

Más parámetros acá: https://docs.sonarqube.org/7.4/analysis/analysis-parameters/

En el .Bat se ve acá esta etapa:
SonarScanner.MSBuild.exe begin /v:"1.0" /n:"MiProyecto" /k:"RELEASE_1" /d:sonar.host.url="http://192.168.10.1:9000" /d:sonar.verbose=false /d:sonar.login="test" /d:sonar.password="1234" /d:sonar.exclusions="**/Ejemplo.Web/**/jquery.unobtrusive-ajax.js, **/Ejemplo.Web/**/MicrosoftMvcAjax.debug.js, **/Ejemplo.Web/Properties/PublishProfiles/**/*, **/Ejemplo.Web/Scripts/MicrosoftAjax.debug.js"

- Etapa de Build o Rebuild

En el bat se ve en esta sección:
MSBuild.exe “C:\SLN\mi.sln” /t:Rebuild

Si ha has hecho Rebuild varias veces y no quieres hacer todo el proceso de nuevo usas “Build”:
MSBuild.exe “C:\SLN\mi.sln” /t:Build

- Etapa End

Se coloca el usuario y clave del servidor (usuario no admin) ya que aquí se envía la información al server . En el bat se ve en esta sección.

SonarScanner.MSBuild.exe end /d:sonar.login="test" /d:sonar.password="1234"
Ejecutando el Bat
Un truco simple, es abrir CMD y arrastar y solar el bat
Luego presionar Enter.

Yo recomiendo tener dos .bat

   EjecutaSonarQubeBuild.bat   -- ejecuta Build
   EjecutaSonarQubeRebuild.bat  -- ejecuta Rebuild

Así lo ejecutas según el caso.

Al presionar Enter se puede demorar unos 10 minutos si es Rebuild, o 5 minutos si es Build, aunque los tiempos varían según el equipo que corre el build y la calidad de la red (debe subir los informes a SonarQube server local)

Se verá en pantalla todos los pasos y detalle de compilación. Cuando termine mostrará resumen.
Nota: A veces se queda pegado pegado en "More about the report…", presiona Control + C para que termine de procesar y muestre resumen.

7. Validando reportes en SonarQube server

Si entras a SonarQube - Projects, se verán todos los proyectos que se están escaneando
Si haces clic en el proyecto que acabas de subir, se ve el detalle.

Si entras a Vulnerabilities se ve el detalle de los errores de seguridad.
Si haces clic en Bugs se ven los errores (no de seguridad)

Si pinchas en un error dado, se ve el detalle y la línea donde está el error.
Ahora si haces clic en See rule se ve una explicación del error y como corregirlo en ese lenguaje:


Si mandas a compilar de nuevo con el .bat. se genera otro proyecto, ya que la fecha-hora cambió.

8. Dejar los reportes más nuevos
Puedes seleccionar el proyecto de SonarQube Server, con las credenciales de Admin, entrar, Administration , Deletion. Así borras los reportes más viejos.

Bueno, con esto, te dejo a ti el resto, investiga y juegueee.