SonarQube to otwarta platforma do ciągłego monitorowania jakości kodu źródłowego, wspierająca wiele języków programowania i umożliwiająca generowanie raportów na temat takich metryk jak duplikacja kodu, zgodność ze standardami kodowania, pokrycie testami, złożoność kodu, potencjalne błędy itp. SonarQube wygodnie wizualizuje wyniki analizy i pozwala śledzić dynamikę rozwoju projektu w czasie.
Zadanie: Pokazać programistom status monitorowania jakości kodu źródłowego w SonarQube.
Istnieją dwa sposoby rozwiązania:
- Uruchamiać skrypt sprawdzający status monitorowania jakości kodu źródłowego w SonarQube. Jeśli monitorowanie jakości kodu w SonarQube nie przechodzi, należy zakończyć budowanie.
- Wyświetlać na głównej stronie projektu status monitorowania jakości kodu źródłowego.
Instalacja SonarQube
Aby zainstalować SonarQube z pakietów rpm, skorzystamy z repozytorium .
Zainstalujemy pakiet z repozytorium dla CentOS 7.
yum install -y https://harbottle.gitlab.io/harbottle-main/7/x86_64/harbottle-main-release.rpmInstalujemy sam SonarQube.
yum install -y sonarqubePodczas instalacji zainstalowane zostaną większość wtyczek, ale należy doinstalować findbugs i pmd
yum install -y sonarqube-findbugs sonarqube-pmdUruchamiamy usługę i dodajemy do autostartu
systemctl start sonarqube
systemctl enable sonarqubeJeśli ładowanie trwa długo, dodaj na końcu opcji sonar.web.javaOpts generator liczb losowych /dev/.urandom
sonar.web.javaOpts=innych parametrów -Djava.security.egd=file:/dev/urandomUruchamianie skryptu sprawdzającego status monitorowania jakości kodu źródłowego w SonarQube.
Niestety, wtyczka sonar-break-maven-plugin nie była aktualizowana od dłuższego czasu. Dlatego napiszemy własny skrypt.
Do testowania będziemy używać repozytorium .
Importujemy do Gitlab. Dodajemy plik .gitlab-ci.yml:
zmienne:
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 do sonarqube
PASSWORD: "admin" # hasło do 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, gdzie raport jest przechowywany
- echo $URL
- |
while : ;do
curl -k -u "$LOGIN":"$PASSWORD" "$URL" -o analysis.txt
export status=$(cat analysis.txt | jq -r '.task.status') # Status to SUCCESS, CANCELED, IN_PROGRESS lub 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 to SUCCESS, CANCELED lub FAILED
- export analysisId=$(cat analysis.txt | jq -r '.task.analysisId') # Pobierz ID analizy
- |
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; # Wynik analizy, jak krytyczne, ważne i drobne problemy
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')"; # drukuje krytyczne, ważne i drobne naruszenia
exit 1 # przerywa budowę z powodu naruszeń
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 # przerywa budowę z powodu błędu w Krok 2
fi
tags:
- dockerPlik .gitlab-ci.yml nie jest idealny. Testowano, czy zadania sprawdzające w sonarqube kończą się statusem: "SUCCESS". Na razie nie było innych statusów. Gdy pojawią się inne statusy, poprawię .gitlab-ci.yml w tym poście.
Wyświetlanie statusu kontroli jakości kodu źródłowego na stronie głównej projektu
Instalujemy wtyczkę dla SonarQube
yum install -y sonarqube-qualinsight-badgesPrzechodzimy do SonarQube pod tym adresem
Tworzymy zwykłego użytkownika, na przykład "badges".
Logujemy się tym użytkownikiem do SonarQube.

Przechodzimy do "Moje konto", tworzymy nowy token, na przykład o nazwie "read_all_repository" i klikamy "Wygeneruj".

Widzimy, że pojawił się token. Pojawi się tylko 1 raz.
Logujemy się jako administrator.
Przechodzimy do Configuration -> SVG Badges

Kopiujemy ten token w polu "Activity badge token" i klikamy przycisk zapisz.

Przechodzimy do Administracja -> Bezpieczeństwo -> Szablony uprawnień -> Szablon domyślny (i inne szablony, które posiadasz).
U użytkownika badges należy zaznaczyć opcję "Browse".
Testowanie.
Na przykład weźmy projekt .
Importujemy ten projekt.
Dodajemy plik .gitlab-ci.yml do głównego katalogu projektu z następującą zawartością.
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 do sonarqube
PASSWORD: "admin" # hasło do 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:
- dockerW SonarQube projekt będzie wyglądał następująco:

Dodajemy badges do README.md i będą one wyglądać tak:

Kod wyświetlania badges wygląda tak:

Analiza ciągu wyświetlania badges:
[](http://172.26.9.115:9000/dashboard?id=com.github.jitpackmaven-simple)
[](http://172.26.9.115:9000/dashboard?id=id-projektu)
[](http://172.26.9.115:9000/dashboard?id=com.github.jitpackmaven-simple)
[](http://172.26.9.115:9000/dashboard?id=id-projektu)Gdzie znaleźć/sprawdzić Project Key i id-projektu.
Project Key znajduje się w dolnym prawym rogu. W URL znajduje się id-projektu.

Opcje do uzyskiwania metryk można .
Wszystkie pull requesty na poprawę, naprawy błędów .
Czat Telegram o SonarQube
Czat Telegram o DevSecOps — bezpieczny DevOps
Źródło: habr.com
