SonarQube е платформа за осигуряване на качеството на код с отворен код, която поддържа широк набор от езици за програмиране и осигурява отчитане на показатели като дублиране на код, съответствие със стандартите за кодиране, тестово покритие, сложност на кода, потенциални грешки и др. SonarQube удобно визуализира резултатите от анализа и ви позволява да проследявате динамиката на развитието на проекта във времето.
Цел: Покажете на разработчиците състоянието на контрола на качеството на изходния код в SonarQube.
Има две решения:
- Стартирайте скрипт, за да проверите състоянието на контрола на качеството на изходния код в SonarQube. Ако контролът на качеството на изходния код в SonarQube не премине, тогава асемблирането е неуспешно.
- Показване на състоянието на контрола на качеството на изходния код на главната страница на проекта.
Инсталиране на SonarQube
За да инсталираме sonarqube от rpm пакети, ще използваме хранилището
Нека инсталираме пакета с хранилището за CentOS 7.
yum install -y https://harbottle.gitlab.io/harbottle-main/7/x86_64/harbottle-main-release.rpm
Ние инсталираме самия sonarqube.
yum install -y sonarqube
По време на инсталацията повечето добавки ще бъдат инсталирани, но трябва да инсталирате findbugs и pmd
yum install -y sonarqube-findbugs sonarqube-pmd
Стартирайте услугата и я добавете към стартиране
systemctl start sonarqube
systemctl enable sonarqube
Ако зареждането отнема много време, добавете генератор на произволни числа /dev/./urandom в края на опциите sonar.web.javaOpts
sonar.web.javaOpts=другие параметры -Djava.security.egd=file:/dev/urandom
Изпълнение на скрипт за проверка на състоянието на контрола на качеството на изходния код в SonarQube.
За съжаление плъгинът sonar-break-maven-plugin не е актуализиран от дълго време. Така че нека напишем наш собствен сценарий.
За тестване ще използваме хранилището
Импортиране в Gitlab. Добавете файла .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" # логин sonarqube
PASSWORD: "admin" # пароль 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:
- docker
Файлът .gitlab-ci.yml не е идеален. Тествано дали задачите за сканиране в sonarqube са завършили със състояние: „УСПЕХ“. До момента не е имало други статуси. Веднага щом има други статуси, ще коригирам .gitlab-ci.yml в тази публикация.
Показване на състоянието на контрола на качеството на изходния код на главната страница на проекта
Инсталиране на плъгина за SonarQube
yum install -y sonarqube-qualinsight-badges
Отиваме в SonarQube на
Създайте обикновен потребител, например "баджове".
Влезте в SonarQube под този потребител.
Отидете на „Моят акаунт“, създайте нов токен, например с името „read_all_repository“ и щракнете върху „Genereate“.
Виждаме, че се е появил токен. Той ще се появи само 1 път.
Влезте като администратор.
Отидете на Конфигурация -> SVG значки
Копирайте този токен в полето „Жетон за активност“ и щракнете върху бутона за запазване.
Отидете на Администриране -> Сигурност -> Шаблони за разрешения -> Шаблон по подразбиране (и други шаблони, които ще имате).
Потребителят на значките трябва да има отметка в квадратчето „Преглед“.
Тестване.
Например, нека вземем проекта
Нека импортираме този проект.
Добавете файла .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.115:9000"
LOGIN: "admin" # логин sonarqube
PASSWORD: "admin" # пароль 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
В SonarQube проектът ще изглежда така:
Добавете чанти към README.md и те ще изглеждат така:
Кодът за показване на значките изглежда така:
Разбор на низа за показване на значки:
[![Quality Gate](http://172.26.9.115:9000/api/badges/gate?key=com.github.jitpack:maven-simple)](http://172.26.9.115:9000/dashboard?id=com.github.jitpack%3Amaven-simple)
[![Название](http://172.26.9.115:9000/api/badges/gate?key=Project Key)](http://172.26.9.115:9000/dashboard?id=id-проекта)
[![Coverage](http://172.26.9.115:9000/api/badges/measure?key=com.github.jitpack:maven-simple&metric=coverage)](http://172.26.9.115:9000/dashboard?id=com.github.jitpack%3Amaven-simple)
[![Название Метрики](http://172.26.9.115:9000/api/badges/measure?key=Project Key&metric=МЕТРИКА)](http://172.26.9.115:9000/dashboard?id=id-проекта)
Къде да получите/проверите ключа на проекта и идентификатора на проекта.
Ключът на проекта е долу вдясно. URL адресът съдържа идентификатора на проекта.
Опции за получаване на показатели могат да бъдат
Всички заявки за изтегляне за подобрения, корекции на грешки
Чат в Telegram за SonarQube
Чат в Telegram за DevSecOps - защитен DevOps
Източник: www.habr.com