SonarQube es una plataforma abierta para garantizar el control continuo de la calidad del código fuente, que admite una amplia variedad de lenguajes de programación y permite obtener informes sobre métricas como la duplicación de código, cumplimiento de normas de codificación, cobertura de pruebas, complejidad del código, posibles errores, etc. SonarQube visualiza convenientemente los resultados del análisis y permite rastrear la dinámica del desarrollo del proyecto a lo largo del tiempo.
Objetivo: Mostrar a los desarrolladores el estado del control de calidad del código fuente en SonarQube.
Hay dos formas de resolverlo:
- Ejecutar un script que verifique el estado del control de calidad del código fuente en SonarQube. Si el control de calidad del código fuente en SonarQube falla, se deberá fallar la compilación.
- Mostrar en la página principal del proyecto el estado del control de calidad del código fuente.
Instalación de SonarQube
Para instalar SonarQube desde paquetes RPM, utilizaremos el repositorio. .
Instalaremos el paquete del repositorio para CentOS 7.
yum install -y https://harbottle.gitlab.io/harbottle-main/7/x86_64/harbottle-main-release.rpmInstalamos SonarQube.
yum install -y sonarqubeDurante la instalación se instalarán la mayoría de los plugins, pero es necesario instalar FindBugs y PMD.
yum install -y sonarqube-findbugs sonarqube-pmdIniciamos el servicio y lo añadimos al inicio automático.
systemctl start sonarqube
systemctl enable sonarqubeSi tarda mucho en cargar, añada al final de las opciones sonar.web.javaOpts el generador de números aleatorios /dev/./urandom.
sonar.web.javaOpts=otros parámetros -Djava.security.egd=file:/dev/urandomEjecutar el script que verifica el estado del control de calidad del código fuente en SonarQube.
Desafortunadamente, el plugin sonar-break-maven-plugin no ha sido actualizado desde hace tiempo. Por lo tanto, escribiremos nuestro propio script.
Para la prueba utilizaremos el repositorio. .
Importamos en GitLab. Añadimos el archivo .gitlab-ci.yml:
variables:
MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=~/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
SONAR_HOST_URL: "http://172.26.9.226:9000"
LOGIN: "admin" # login sonarqube
PASSWORD: "admin" # password sonarqube
cache:
paths:
- .m2/repository
build:
image: maven:3.3.9-jdk-8
stage: build
script:
- apt install -y jq || true
- mvn $MAVEN_CLI_OPTS -Dmaven.test.failure.ignore=true org.jacoco:jacoco-maven-plugin:0.8.5:prepare-agent clean verify org.jacoco:jacoco-maven-plugin:0.8.5:report
- mvn $MAVEN_CLI_OPTS -Dmaven.test.skip=true verify sonar:sonar -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$LOGIN -Dsonar.password=$PASSWORD -Dsonar.gitlab.project_id=$CI_PROJECT_PATH -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME
- export URL=$(cat target/sonar/report-task.txt | grep ceTaskUrl | cut -c11- ) #URL where report gets stored
- echo $URL
- |
while : ;do
curl -k -u "$LOGIN":"$PASSWORD" "$URL" -o analysis.txt
export status=$(cat analysis.txt | jq -r '.task.status') #Status as SUCCESS, CANCELED, IN_PROGRESS or FAILED
echo $status
if [ ${status} == "SUCCESS" ];then
echo "SONAR ANALYSIS SUCCESS";
break
fi
sleep 5
done
- curl -k -u "$LOGIN":"$PASSWORD" "$URL" -o analysis.txt
- export status=$(cat analysis.txt | jq -r '.task.status') #Status as SUCCESS, CANCELED or FAILED
- export analysisId=$(cat analysis.txt | jq -r '.task.analysisId') #Get the analysis Id
- |
if [ "$status" == "SUCCESS" ]; then
echo -e "SONAR ANALYSIS SUCCESSFUL...ANALYSING RESULTS";
curl -k -u "$LOGIN":"$PASSWORD" "$SONAR_HOST_URL/api/qualitygates/project_status?analysisId=$analysisId" -o result.txt; #Analysis result like critical, major and minor issues
export result=$(cat result.txt | jq -r '.projectStatus.status');
if [ "$result" == "ERROR" ];then
echo -e "91mSONAR RESULTS FAILED";
echo "$(cat result.txt | jq -r '.projectStatus.conditions')"; #prints the critical, major and minor violations
exit 1 #breaks the build for violations
else
echo -e "SONAR RESULTS SUCCESSFUL";
echo "$(cat result.txt | jq -r '.projectStatus.conditions')";
exit 0
fi
else
echo -e "e[91mSONAR ANALYSIS FAILEDe[0m";
exit 1 #breaks the build for failure in Step2
fi
tags:
- dockerEl archivo .gitlab-ci.yml no es perfecto. Se probó si las tareas de verificación en sonarqube completaron con el estado: "SUCCESS". Hasta ahora no ha habido otros estados. Cuando haya otros estados, actualizaré el .gitlab-ci.yml en esta publicación.
Mostrar en la página principal del proyecto el estado del control de calidad del código fuente
Instalamos el complemento para SonarQube
yum install -y sonarqube-qualinsight-badgesAccedemos a SonarQube en la dirección
Creamos un usuario normal, por ejemplo "badges".
Iniciamos sesión con este usuario en SonarQube.

Vamos a "Mi cuenta", creamos un nuevo token, por ejemplo con el nombre "read_all_repository" y hacemos clic en "Generar".

Vemos que ha aparecido el token. Solo aparecerá una vez.
Iniciamos sesión como administrador.
Vamos a Configuración -> SVG Badges

Copiamos este token en el campo "Activity badge token" y hacemos clic en el botón guardar.

Entramos en Administración -> Seguridad -> Plantillas de permisos -> Plantilla predeterminada (y otras plantillas que pueda tener).
Al usuario badges se le debe marcar la opción "Browse".
Pruebas.
Tomemos como ejemplo el proyecto .
Importamos este proyecto.
Agregamos el archivo .gitlab-ci.yml en la raíz del proyecto con el siguiente contenido.
variables:
MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=~/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
SONAR_HOST_URL: "http://172.26.9.115:9000"
LOGIN: "admin" # login de sonarqube
PASSWORD: "admin" # contraseña de sonarqube
cache:
paths:
- .m2/repository
build:
image: maven:3.3.9-jdk-8
stage: build
script:
- mvn $MAVEN_CLI_OPTS -Dmaven.test.failure.ignore=true org.jacoco:jacoco-maven-plugin:0.8.5:prepare-agent clean verify org.jacoco:jacoco-maven-plugin:0.8.5:report
- mvn $MAVEN_CLI_OPTS -Dmaven.test.skip=true verify sonar:sonar -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$LOGIN -Dsonar.password=$PASSWORD -Dsonar.gitlab.project_id=$CI_PROJECT_PATH -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME
tags:
- dockerEn SonarQube, el proyecto se verá así:

Agregamos badges en README.md y se verán así:

El código de visualización de badges se ve así:

Desglose de la cadena de visualización de badges:
[](http://172.26.9.115:9000/dashboard?id=com.github.jitpackmaven-simple)
[](http://172.26.9.115:9000/dashboard?id=id-proyecto)
[](http://172.26.9.115:9000/dashboard?id=com.github.jitpackmaven-simple)
[](http://172.26.9.115:9000/dashboard?id=id-proyecto)Dónde encontrar/verificar el Project Key y el id-proyecto.
El Project Key se encuentra en la parte inferior derecha. En la URL está el id-proyecto.

Las opciones para obtener métricas se pueden .
Todos los pull requests para mejoras y corrección de errores .
Chat de Telegram sobre SonarQube
Chat de Telegram sobre DevSecOps — DevOps seguro
Fuente: habr.com
