SonarQube este o platformă deschisă pentru asigurarea controlului continuu al calității codului sursă, care suportă o mulțime de limbaje de programare și permite generarea de rapoarte pe baza unor metrici precum duplicarea codului, conformitatea cu standardele de codare, acoperirea testelor, complexitatea codului, posibile erori etc. SonarQube vizualizează convenabil rezultatele analizei și permite urmărirea dinamicii de dezvoltare a proiectului în timp.
Sarcina: Afișarea dezvoltatorilor a stării controlului calității codului sursă în SonarQube.
Există două moduri de a rezolva:
- Rularea unui script de verificare a stării controlului calității codului sursă în SonarQube. Dacă controlul calității codului sursă în SonarQube nu trece, atunci să eșueze compilarea.
- Afișarea pe pagina principală a proiectului a stării controlului calității codului sursă.
Instalarea SonarQube
Pentru a instala SonarQube din pachete rpm, vom folosi depozitul .
Vom instala pachetul cu depozitul pentru CentOS 7.
yum install -y https://harbottle.gitlab.io/harbottle-main/7/x86_64/harbottle-main-release.rpmInstalăm SonarQube.
yum install -y sonarqubeLa instalare se vor instala majoritatea pluginurilor, dar trebuie să instalăm suplimentar findbugs și pmd.
yum install -y sonarqube-findbugs sonarqube-pmdPornim serviciul și îl adăugăm la autostart.
systemctl start sonarqube
systemctl enable sonarqubeDacă se încarcă mult, adăugați la final opțiunilor sonar.web.javaOpts generatorul de numere aleatorii /dev/./urandom.
sonar.web.javaOpts=alte opțiuni -Djava.security.egd=file:/dev/urandomRularea scriptului de verificare a stării controlului calității codului sursă în SonarQube.
Din păcate, pluginul sonar-break-maven-plugin nu a fost actualizat de mult timp. Prin urmare, vom scrie propriul nostru script.
Pentru testare, vom folosi depozitul .
Importăm în Gitlab. Adăugăm fișierul .gitlab-ci.yml:
variabile:
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" # parola 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 unde se salvează raportul
- echo $URL
- |
while : ;do
curl -k -u "$LOGIN":"$PASSWORD" "$URL" -o analysis.txt
export status=$(cat analysis.txt | jq -r '.task.status') #Status ca SUCCESS, CANCELED, IN_PROGRESS sau FAILED
echo $status
if [ ${status} == "SUCCESS" ];then
echo "ANALIZA SONAR SUCCES";
break
fi
sleep 5
done
- curl -k -u "$LOGIN":"$PASSWORD" "$URL" -o analysis.txt
- export status=$(cat analysis.txt | jq -r '.task.status') #Status ca SUCCESS, CANCELED sau FAILED
- export analysisId=$(cat analysis.txt | jq -r '.task.analysisId') #Obține ID-ul analizei
- |
if [ "$status" == "SUCCESS" ]; then
echo -e "ANALIZA SONAR SUCCES...ANALIZAREA REZULTATELOR";
curl -k -u "$LOGIN":"$PASSWORD" "$SONAR_HOST_URL/api/qualitygates/project_status?analysisId=$analysisId" -o result.txt; #Rezultatul analizei ca probleme critice, majore și minore
export result=$(cat result.txt | jq -r '.projectStatus.status');
if [ "$result" == "ERROR" ];then
echo -e "91mREZULTATELE SONAR AU EȘUAT";
echo "$(cat result.txt | jq -r '.projectStatus.conditions')"; #împinge violările critice, majore și minore
exit 1 #întrerupe construcția pentru violări
else
echo -e "REZULTATELE SONAR AU FOST SUCCESE";
echo "$(cat result.txt | jq -r '.projectStatus.conditions')";
exit 0
fi
else
echo -e "e[91mANALIZA SONAR A EȘUATe[0m";
exit 1 #întrerupe construcția pentru eșec în Pasul 2
fi
tags:
- dockerFișierul .gitlab-ci.yml nu este perfect. A fost testat dacă sarcinile de verificare în sonarqube se finalizează cu statutul: "SUCCESS". Deocamdată nu au fost alte stații. Când vor apărea alte stații, voi corecta .gitlab-ci.yml în acest post.
Afișarea pe pagina principală a proiectului statusului controlului calității codului sursă
Instalăm pluginul pentru SonarQube
yum install -y sonarqube-qualinsight-badgesAccesăm SonarQube la adresa
Creăm un utilizator obișnuit, de exemplu, "badges".
Ne conectăm cu acest utilizator în SonarQube.

Accesăm "My account", creăm un nou token, de exemplu cu denumirea "read_all_repository" și apăsăm "Genereate".

Observăm că tokenul a apărut. Va apărea doar o dată.
Ne conectăm ca administrator.
Mergem la Configuration -> SVG Badges

Copiem acest token în câmpul "Activity badge token" și facem clic pe butonul save.

Accesăm Administration -> Security -> Permission Templates -> Default template (și alte șabloane pe care le aveți).
Utilizatorului badges trebuie să i se bifeze "Browse".
Testare.
Pentru exemplu, să luăm un proiect .
Importăm acest proiect.
Adăugăm fișierul .gitlab-ci.yml în rădăcina proiectului cu următorul conținut.
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 sonarqube
PASSWORD: "admin" # parola 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:
- dockerÎn SonarQube, proiectul va arăta astfel:

Adăugăm bages în README.md și vor arăta astfel:

Codul de afișare a badges arată astfel:

Analiza șirului de afișare a badges:
[](http://172.26.9.115:9000/dashboard?id=com.github.jitpackmaven-simple)
[](http://172.26.9.115:9000/dashboard?id=id-proiect)
[](http://172.26.9.115:9000/dashboard?id=com.github.jitpackmaven-simple)
[](http://172.26.9.115:9000/dashboard?id=id-proiect)Unde găsim/verificăm Project Key și id-proiect.
Project Key se află în colțul din dreapta jos. În URL se află id-proiect.

Opțiunile pentru obținerea metricilor pot fi .
Toate cererile de extragere pentru îmbunătățiri, corecturi de erori .
Chat Telegram despre SonarQube
Chat Telegram despre DevSecOps — DevOps sigur
Sursa: habr.com
