ื”ืฆื’ืช ืกื˜ื˜ื•ืก ื‘ืงืจืช ืื™ื›ื•ืช ืงื•ื“ ืžืงื•ืจ ื‘- 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

ืื ืœื•ืงื— ื”ืจื‘ื” ื–ืžืŸ ืœื˜ืขื•ืŸ, ื”ื•ืกืฃ ืžื—ื•ืœืœ ืžืกืคืจื™ื ืืงืจืื™ื™ื /dev/./urandom ืœืกื•ืฃ ื”ืืคืฉืจื•ื™ื•ืช sonar.web.javaOpts

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 ื”ืกืชื™ื™ืžื• ื‘ืกื˜ื˜ื•ืก: "ื”ืฆืœื—ื”". ืขื“ ื›ื” ืœื ื”ื™ื• ืกื˜ื˜ื•ืกื™ื ืื—ืจื™ื. ื‘ืจื’ืข ืฉื™ื”ื™ื• ืกื˜ื˜ื•ืกื™ื ืื—ืจื™ื, ืื ื™ ืืชืงืŸ ืืช .gitlab-ci.yml ื‘ืคื•ืกื˜ ื”ื–ื”.

ื”ืฆื’ืช ืžืฆื‘ ื‘ืงืจืช ืื™ื›ื•ืช ืงื•ื“ ื”ืžืงื•ืจ ื‘ืขืžื•ื“ ื”ืคืจื•ื™ืงื˜ ื”ืจืืฉื™

ื”ืชืงื ืช ื”ืคืœืื’ื™ืŸ ืขื‘ื•ืจ SonarQube

yum install -y sonarqube-qualinsight-badges

ืื ื—ื ื• ื”ื•ืœื›ื™ื ืœ- SonarQube ื‘ืฉืขื” http://172.26.9.115:9000/
ืฆื•ืจ ืžืฉืชืžืฉ ืจื’ื™ืœ, ืœืžืฉืœ "ืชื’ื™ื".
ื”ืชื—ื‘ืจ ืืœ SonarQube ืชื—ืช ืžืฉืชืžืฉ ื–ื”.

ื”ืฆื’ืช ืกื˜ื˜ื•ืก ื‘ืงืจืช ืื™ื›ื•ืช ืงื•ื“ ืžืงื•ืจ ื‘- SonarQube ืœืžืคืชื—ื™ื

ืขื‘ื•ืจ ืืœ "ื”ื—ืฉื‘ื•ืŸ ืฉืœื™", ืฆื•ืจ ืืกื™ืžื•ืŸ ื—ื“ืฉ, ืœืžืฉืœ ื‘ืฉื "read_all_repository" ื•ืœื—ืฅ ืขืœ "ืฆื•ืจ".

ื”ืฆื’ืช ืกื˜ื˜ื•ืก ื‘ืงืจืช ืื™ื›ื•ืช ืงื•ื“ ืžืงื•ืจ ื‘- SonarQube ืœืžืคืชื—ื™ื

ืื ื• ืจื•ืื™ื ืฉื”ื•ืคื™ืข ืืกื™ืžื•ืŸ. ื”ื•ื ื™ื•ืคื™ืข ืจืง ืคืขื ืื—ืช.

ื”ืชื—ื‘ืจ ื›ืžื ื”ืœ.

ืขื‘ื•ืจ ืืœ ืชืฆื•ืจื” -> ืชื’ื™ SVG

ื”ืฆื’ืช ืกื˜ื˜ื•ืก ื‘ืงืจืช ืื™ื›ื•ืช ืงื•ื“ ืžืงื•ืจ ื‘- SonarQube ืœืžืคืชื—ื™ื

ื”ืขืชืง ืืช ื”ืืกื™ืžื•ืŸ ื”ื–ื” ืœืฉื“ื” "ืืกื™ืžื•ืŸ ืชื’ ืคืขื™ืœื•ืช" ื•ืœื—ืฅ ืขืœ ื›ืคืชื•ืจ ื”ืฉืžื™ืจื”.

ื”ืฆื’ืช ืกื˜ื˜ื•ืก ื‘ืงืจืช ืื™ื›ื•ืช ืงื•ื“ ืžืงื•ืจ ื‘- SonarQube ืœืžืคืชื—ื™ื

ืขื‘ื•ืจ ืืœ ื ื™ื”ื•ืœ -> ืื‘ื˜ื—ื” -> ืชื‘ื ื™ื•ืช ื”ืจืฉืื•ืช -> ืชื‘ื ื™ืช ื‘ืจื™ืจืช ืžื—ื“ืœ (ื•ืชื‘ื ื™ื•ืช ืื—ืจื•ืช ืฉื™ื”ื™ื• ืœืš).

ืขืœ ืžืฉืชืžืฉ ื”ืชื’ื™ื ืœืกืžืŸ ืืช ืชื™ื‘ืช ื”ืกื™ืžื•ืŸ "ืขื™ื•ืŸ".

ื‘ื“ื™ืงื”

ืœื“ื•ื’ืžื”, ื ื™ืงื— ืืช ื”ืคืจื•ื™ืงื˜ 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 ืœืžืคืชื—ื™ื

ื”ื•ืกืฃ ืชื™ืงื™ื ืœ-README.md ื•ื”ื ื™ื™ืจืื• ื›ืš:

ื”ืฆื’ืช ืกื˜ื˜ื•ืก ื‘ืงืจืช ืื™ื›ื•ืช ืงื•ื“ ืžืงื•ืจ ื‘- SonarQube ืœืžืคืชื—ื™ื

ืงื•ื“ ื”ืชืฆื•ื’ื” ืฉืœ ื”ืชื’ื™ื ื ืจืื” ื›ืš:

ื”ืฆื’ืช ืกื˜ื˜ื•ืก ื‘ืงืจืช ืื™ื›ื•ืช ืงื•ื“ ืžืงื•ืจ ื‘- SonarQube ืœืžืคืชื—ื™ื

ื ื™ืชื•ื— ืžื—ืจื•ื–ืช ืชืฆื•ื’ืช ื”ืชื’ื™ื:

[![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-ะฟั€ะพะตะบั‚ะฐ)

ื”ื™ื›ืŸ ื ื™ืชืŸ ืœื”ืฉื™ื’/ืœื‘ื“ื•ืง ืืช ืžืคืชื— ื”ืคืจื•ื™ืงื˜ ื•ืžื–ื”ื” ื”ืคืจื•ื™ืงื˜.

ืžืคืชื— ื”ืคืจื•ื™ืงื˜ ื ืžืฆื ื‘ืคื™ื ื” ื”ืฉืžืืœื™ืช ื”ืชื—ืชื•ื ื”. ื›ืชื•ื‘ืช ื”ืืชืจ ืžื›ื™ืœื” ืืช ืžื–ื”ื” ื”ืคืจื•ื™ืงื˜.

ื”ืฆื’ืช ืกื˜ื˜ื•ืก ื‘ืงืจืช ืื™ื›ื•ืช ืงื•ื“ ืžืงื•ืจ ื‘- SonarQube ืœืžืคืชื—ื™ื

ืืคืฉืจื•ื™ื•ืช ืœืงื‘ืœืช ืžื“ื“ื™ื ื™ื›ื•ืœื•ืช ืœื”ื™ื•ืช ืชืกืชื›ืœ ื›ืืŸ.

ื›ืœ ื‘ืงืฉื•ืช ื”ืžืฉื™ื›ื” ืœืฉื™ืคื•ืจื™ื, ืชื™ืงื•ื ื™ ื‘ืื’ื™ื ืœื”ื’ื™ืฉ ืœืžืื’ืจ ื–ื”.

ืฆ'ืื˜ ื‘ื˜ืœื’ืจื ืขืœ SonarQube https://t.me/sonarqube_ru
ืฆ'ืื˜ ื‘ื˜ืœื’ืจื ืขืœ DevSecOps - DevOps ืžืื•ื‘ื˜ื— https://t.me/sec_devops

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”