ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ статуса контроля качСства исходного ΠΊΠΎΠ΄Π° Π² 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 ΠΈ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ выглядeΡ‚ΡŒ Ρ‚Π°ΠΊ:

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ статуса контроля качСства исходного ΠΊΠΎΠ΄Π° Π² 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