Відображення розробникам статусу контролю якості вихідного коду SonarQube

SonarQube – це відкрита платформа для забезпечення безперервного контролю якості вихідного коду, що підтримує велику кількість мов програмування та дозволяє отримувати звіти за такими метриками, як дублювання коду, відповідність стандартам кодування, покриття тестами, складність коду, потенційні помилки тощо. SonarQube зручно візуалізує результати аналізу та дозволяє відстежувати динаміку розвитку проекту у часі.

Завдання: Показувати розробникам статус контролю якості вихідного коду SonarQube.

Є два способи вирішення:

  • Запускати скрипт перевірки статусу контролю якості вихідного коду SonarQube. Якщо контроль якості вихідного коду SonarQube не проходить, то фейлити складання.
  • Показувати на головній сторінці проекту статус контролю якості вихідного коду.

Установка SonarQube

Для встановлення sonarqube з rpm пакетів скористаємося репозиторієм https://harbottle.gitlab.io/harbottle-main.

Встановимо пакет із репозиторієм для 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

Якщо довго завантажується, то додайте до кінця опцій sonar.web.javaOpts генератор випадкових чисел /dev/./urandom

sonar.web.javaOpts=другие параметры -Djava.security.egd=file:/dev/urandom

Запуск скрипта перевірки статусу контролю якості вихідного коду SonarQube.

На жаль, плагін sonar-break-maven-plugin давно не оновлювався. Тож напишемо свій скрипт.

Для тестування будемо використовувати репозиторій https://github.com/uweplonus/spotbugs-examples.

Імпортуємо до 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 завершувалися статусом: "SUCCESS". Поки що інших статусів не було. Як будуть інші статуси, виправлю .gitlab-ci.yml в цьому пості.

Відображення на головній сторінці проекту статусу контролю якості вихідного коду

Встановлюємо плагін для SonarQube

yum install -y sonarqube-qualinsight-badges

Заходимо до SonarQube за адресою http://172.26.9.115:9000/
Створюємо звичайного користувача, наприклад "badges".
Заходимо під цим користувачем у SonarQube.

Відображення розробникам статусу контролю якості вихідного коду SonarQube

Заходимо в "My account", створюємо новий токер, наприклад з назвою "read_all_repository" та натискаємо "Genereate".

Відображення розробникам статусу контролю якості вихідного коду SonarQube

Бачимо, що з'явився токен. Він з'явиться лише 1 раз.

Заходимо під адміністратором.

Ідемо до Configuration -> SVG Badges

Відображення розробникам статусу контролю якості вихідного коду SonarQube

Копіюємо цей токен у полі "Activity badge token" та натискаємо кнопку save.

Відображення розробникам статусу контролю якості вихідного коду SonarQube

Заходимо в Administration -> Security -> Permission Templates -> Default template (та інші шаблони, які у вас будуть).

У користувача badges необхідно встановити галку "Browse".

Тестування.

Наприклад візьмемо проект https://github.com/jitpack/maven-simple.

Імпортуємо цей проект.

Додаємо файл .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 проект виглядатиме так:

Відображення розробникам статусу контролю якості вихідного коду SonarQube

Додаємо bages у README.md і вони будуть виглядати так:

Відображення розробникам статусу контролю якості вихідного коду SonarQube

Код відображення badges виглядає так:

Відображення розробникам статусу контролю якості вихідного коду SonarQube

Розбір рядка відображення badges:

[![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-проекта)

Де взяти/перевірити Project Key та id-проекту.

Project Key знаходиться праворуч унизу. В URL знаходиться id-проект.

Відображення розробникам статусу контролю якості вихідного коду SonarQube

Опції для отримання метрик можна подивитися тут.

Усі pull request на покращення, виправлення помилок надсилайте до цього репозиторію.

Телеграм чат про SonarQube https://t.me/sonarqube_ru
Телеграм чат про DevSecOps - безпечний DevOps https://t.me/sec_devops

Джерело: habr.com

Додати коментар або відгук