Sonar

Sonar es una plataforma para evaluar código fuente. Sonar utiliza diversas herramientas de análisis estático de código fuente como Checkstyle, PMD o FindBugs para obtener métricas que pueden ayudar a mejorar la calidad del código de un programa. =Habilitar profile Sonar en el settings del maven= Agregar este profile al settings.xml (o al archivo settings del proyecto sobre el que se quiere realizar el Quality Assurance) sonar true myuser myuserpass

http://sonar-server-ip

=Ejecutar el análisis con el maven= Ejemplo: Ir al directorio del proyecto mvn -DskipTests=true -f ~/path/to/proyect/pom.xml -s ~/.m2/settings.xml sonar:sonar OBS: Requiere Maven 3 Si por algún motivo no toma el sonar URL la configuración del setttings.xml, probar pasando como propiedad de la siguiente manera: mvn -Dsonar.host.url=http://sonar-server-ip -DskipTests=true -f ~/path/to/proyect/pom.xml -s ~/.m2/settings.xml sonar:sonar

Ejecutar el análisis con maven y el sonarqube en localhost
mvn -s $HOME/.m2/custom-settings.xml -DskipTests -Dsonar.host.url=http://localhost:9000/ sonar:sonar

=Ejecutar el análisis en un proyecto Gradle= Se debe tener instalado el gradle command line. Atención que se debe actualizar la versión de SONAR y de Java a cada proyecto, al ejecutar el gradle.

Se debe customizar además el nombre y key del proyecto, directorio del proyecto, y las credenciales para la app web del sonarqube.

OBS.: Estas propiedades se pueden configurar de forma definitiva en el build.gradle del rootDir, bajo el task sonarqube (ver en Configurar plugins). DEBE ir inmediatamente después del bloque buildscript Ejemplo: // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories {

mavenLocal maven { url 'https://maven.google.com' } mavenCentral jcenter }   dependencies { classpath 'com.android.tools.build:gradle:3.0.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files classpath 'com.google.gms:google-services:4.0.2' } }

plugins { id "org.sonarqube" version "2.6.2" }

sonarqube { properties { property "sonar.host.url", "http://tu-host-sonar-de-CI.sodep.com.py:9000" } }

allprojects { repositories {

mavenLocal maven { url 'https://maven.google.com' } maven { url "https://jitpack.io" } mavenCentral jcenter google } }

task clean(type: Delete) { delete rootProject.buildDir }

Para definir localmente un URL del sonar, se debe agregar a la configuración global del usuario:

$ cat ~/.gradle/gradle.properties systemProp.sonar.host.url=http://localhost:9000

cd /opt/desarrollo/sources/git/dir/del/proyecto

gradle sonarqube

Estas propiedades deben coincidir siempre, para que se pueda mostrar los deltas en la app web del sonarqube sonar.projectKey sonar.projectName

FindBugs + Dependency-Check sobre proyectos Gradle
Para realizar esta guía, se utilizaron los siguientes recursos:


 * Ubuntu 16.04
 * SonarQube 5.5 + Java7, con los plugins Dependency-Check 1.0.3 y FindBugs 3.3 instalados
 * Gradle 3.3
 * El proyecto Gradle se ejecuta sobre Java 8

Configurar plugins
buildScript { repositories { jcenter maven { url "https://plugins.gradle.org/m2/" }            mavenCentral }   dependencies { classpath 'com.android.tools.build:gradle:2.2.2' classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.0.1' classpath 'org.owasp:dependency-check-gradle:1.4.5'
 * Agregar al build.gradle del rootDir, las siguientes líneas (en los bloques correspondientes) y los bloques del SonarQube:

} } plugins { id "org.sonarqube" version "2.5" }

sonarqube { properties { property "sonar.host.url", "http://localhost:9000" property "sonar.dependencyCheck.reportPath", "path/al/eporte/del/dependency-check-report.xml" } }

allprojects { repositories { jcenter mavenCentral } }

Obs.: se deberá reemplazar en la línea sonar.host.url la URL del SonarQube en el que se publicarán los resultados del análisis y en la línea sonar.dependencyCheck.reportPath la dirección al reporte generado por el Dependency-Check, con formato XML.


 * Agregar las siguientes lineas al final del build.gradle de cada sub-proyecto:

apply plugin: 'org.owasp.dependencycheck'

dependencyCheck { autoUpdate=false cveValidForHours=4 format='ALL' }

Se pueden personalizar más propiedades del plugin Dependency-Check. Estas propiedades se pueden encontrar en este link.

Ejecutar análisis de Dependencias

 * Antes de ejecutar el analisis de dependencias, se debe actualizar la Base de Datos NVD. La validez (en horas) de esta actualización se puede ajustar en las configuraciones del plugin. Si no han pasado las horas que se especificaron desde la última actualización de la Base de Datos, se puede saltar este paso.

gradle dependencyCheckUpdate


 * Construir el proyecto y buscar errores en las configuraciones:

gradle assembleDebug


 * Ejecutar el analisis de dependencias con Gradle:

gradle dependencyCheckAnalyze

Si el análisis fue exitoso, se tendrá el reporte en el directorio y los formatos especificados en las configuraciones anteriores.

Ejecutar análisis del SonarQube con FindBugs
Este análisis mostrará los resultados en el SonarQube al cual se apunta en las configuraciones. La primera vez que se ejecuta, toma por defecto el Quality Profile: Sonar Way. Este análisis tambien debe publicar los resultados del Dependency-Check al SonarQube.

gradle sonarqube

Luego, se debe cambiar el Quality Profile a utilizar por el FindBugs Sec Audit y volver a ejecutar el análisis.

=Como excluir código del análisis=

Sonar permite marcar bloques para eliminarlos del análisis por issues. Eso se configura en las preferencias, ingresando como administrador.

En la versión 5.6.x (LTS) de octubre del 2016 para realizar la configuración se debe seguir el siguiente menú: Administration > Analysis Scope > Issues



Un ejemplo de lo que se debe poner en el código:

//BEGIN-IGNORE-SONARQUBE ArrayList events = new ArrayList(mEvents); outState.putSerializable(EVENTS, events); //END-IGNORE-SONARQUBE En este ejemplo se configura el Sonar para que todo lo que esté entre esos bloques (el string que se elija), y no lo considera al momento de analizar el código.

=Como excluir código del análisis en Maven= Agregando este properties al pom.xml se puede definir esta configuracion para un proyecto especifico, sin necesidad de configurar el sonar.

Obs:' Esto solo es valido para los proyectos MAVEN no asi para Gradle.

Todo lo que esté entre esos bloques (el string que se elija), el sonar no lo considera al momento de analizar el código.

Esto se debe agregar al pom.xml del proyecto con el string que usted elija e1 //BEGIN-IGNORE-SONARQUBE <sonar.issue.ignore.block.e1.endBlockRegexp>//END-IGNORE-SONARQUBE</sonar.issue.ignore.block.e1.endBlockRegexp>

=Como excluir código del análisis en Gradle=

Para esto tenemos 2 metodos.

1-Línea de comando: Donde agregamos los rules el ejecutar el test sonar

gradle sonarqube -Dsonar.issue.ignore.block=e1 -Dsonar.issue.ignore.block.e1.beginBlockRegexp=//BEGIN-IGNORE-SONARQUBE -Dsonar.issue.ignore.block.e1.endBlockRegexp=//END-IGNORE-SONARQUBE -Dsonar.issue.ignore.block.e1.endBlockRegexp=//END-IGNORE-SONARQUBE donde //BEGIN-IGNORE-SONARQUBE y //END-IGNORE-SONARQUBE son los strings que marcan el inicio y final del bloque a ignorar.

2-Archivo de configuracion Gradle: Tambien se puede agregar a la configuracion del Gradle a nivel sistema-usuario. Donde a este archivo: ~/.gradle/gradle.properties

Agregamos:

systemProp.sonar.issue.ignore.block=e1 systemProp.sonar.issue.ignore.block.e1.beginBlockRegexp=//BEGIN-IGNORE-SONARQUBE systemProp.sonar.issue.ignore.block.e1.endBlockRegexp=//END-IGNORE-SONARQUBE

=Habilitar un proyecto Javascript= Aquí hay un ejemplo de un proyecto que utiliza el QA para javascript https://github.com/SonarSource/sonar-examples/blob/master/projects/languages/multi-language/multi-language-java-javascript-maven/javascript-module/pom.xml

=Instalar/Actualizar Docker Sonar= Instalar Docker Sonar con Aegurar que tu usuario perteneca al grupo docker

sudo usermod -aG docker $USER

Actualizar ISO

docker pull sonarqube:lts

Si cuentas con una version anterior ejecuta el comando siguiente: docker rm -f sonarqube && docker volume rm sonar

Crear volumen: docker volume create sonar

Crear Docker Sonar con el siguiente comando: docker run -d --name sonarqube -v sonar:/opt/sonarqube/ -p 9000:9000 sonarqube:lts

Ingresar a a http://localhost:9000