рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рд╣реЗ рдУрдкрди рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреНрд╡рд╛рд▓рд┐рдЯреА рдЕреЕрд╢реНрдпреБрд░рдиреНрд╕ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо рдЖрд╣реЗ рдЬреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдВрдЪреНрдпрд╛ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реЗрдгреАрдЪреЗ рд╕рдорд░реНрдерди рдХрд░рддреЗ рдЖрдгрд┐ рдХреЛрдб рдбреБрдкреНрд▓рд┐рдХреЗрд╢рди, рдХреЛрдбрд┐рдВрдЧ рдорд╛рдирдХрд╛рдВрдЪреЗ рдкрд╛рд▓рди, рдЪрд╛рдЪрдгреА рдХрд╡реНрд╣рд░реЗрдЬ, рдХреЛрдб рдЬрдЯрд┐рд▓рддрд╛, рд╕рдВрднрд╛рд╡реНрдп рдмрдЧ рдЖрдгрд┐ рдмрд░реЗрдЪ рдХрд╛рд╣реА рдпрд╛рд╕рд╛рд░рдЦреНрдпрд╛ рдореЗрдЯреНрд░рд┐рдХреНрд╕рд╡рд░ рдЕрд╣рд╡рд╛рд▓ рдкреНрд░рджрд╛рди рдХрд░рддреЗ. SonarQube рд╕реЛрдпреАрд╕реНрдХрд░рдкрдгреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░рд┐рдгрд╛рдорд╛рдВрдЪреА рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рд▓рд╛рдВрддрд░рд╛рдиреЗ рдкреНрд░рдХрд▓реНрдк рд╡рд┐рдХрд╛рд╕рд╛рдЪреНрдпрд╛ рдЧрддреАрд╢реАрд▓рддреЗрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ.
рдЙрджреНрджрд┐рд╖реНрдЯ: рд╡рд┐рдХрд╕рдХрд╛рдВрдирд╛ рд╕реЛрдирд╛рд░рдХреНрдпреВрдмрдордзреАрд▓ рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдЧреБрдгрд╡рддреНрддрд╛ рдирд┐рдпрдВрддреНрд░рдгрд╛рдЪреА рд╕реНрдерд┐рддреА рджрд░реНрд╢рд╡рд╛.
рджреЛрди рдЙрдкрд╛рдп рдЖрд╣реЗрдд:
- SonarQube рдордзреНрдпреЗ рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдЧреБрдгрд╡рддреНрддрд╛ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд┐рддреА рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд▓рд╡рд╛. SonarQube рдордзреАрд▓ рд╕реНрддреНрд░реЛрдд рдХреЛрдбрдЪреЗ рдЧреБрдгрд╡рддреНрддрд╛ рдирд┐рдпрдВрддреНрд░рдг рдкрд╛рд╕ рд╣реЛрдд рдирд╕рд▓реНрдпрд╛рд╕, рдЕрд╕реЗрдВрдмреНрд▓реА рдЕрдпрд╢рд╕реНрд╡реА рдХрд░рд╛.
- рдореБрдЦреНрдп рдкреНрд░рдХрд▓реНрдк рдкреГрд╖реНрдард╛рд╡рд░ рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдЧреБрдгрд╡рддреНрддрд╛ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд┐рддреА рджрд░реНрд╢рд╡рд╛.
рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдд рдЖрд╣реЗ
рдЖрд░рдкреАрдПрдо рдкреЕрдХреЗрдЬреЗрд╕рдордзреВрди рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рд╡рд╛рдкрд░реВ
CentOS 7 рд╕рд╛рдареА рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрд╕рд╣ рдкреЕрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВрдпрд╛.
yum install -y https://harbottle.gitlab.io/harbottle-main/7/x86_64/harbottle-main-release.rpm
рдЖрдореНрд╣реА рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рд╕реНрд╡рддрдГ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЛ.
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 рдордзреНрдпреЗ рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдЧреБрдгрд╡рддреНрддрд╛ рдирд┐рдпрдВрддреНрд░рдгрд╛рдЪреА рд╕реНрдерд┐рддреА рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд▓рд╡рдгреЗ.
рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рд╕реЛрдирд╛рд░-рдмреНрд░реЗрдХ-рдорд╛рд╡реЗрди-рдкреНрд▓рдЧрдЗрди рдкреНрд▓рдЧрдЗрди рдмрд░реНрдпрд╛рдЪ рдХрд╛рд│рд╛рдкрд╛рд╕реВрди рдЕрджреНрдпрддрдирд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдирд╛рд╣реА. рдЪрд▓рд╛ рддрд░ рдордЧ рд╕реНрд╡рддрдГрдЪреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рд╣реВрдпрд╛.
рдЪрд╛рдЪрдгреАрд╕рд╛рдареА рдЖрдореНрд╣реА рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рд╡рд╛рдкрд░реВ
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 рдлрд╛рдЗрд▓ рдкрд░рд┐рдкреВрд░реНрдг рдирд╛рд╣реА. рд╕реЛрдирд╛рд░рдХреНрдпреВрдмрдордзреАрд▓ рд╕реНрдХреЕрдирд┐рдВрдЧ рдХрд╛рд░реНрдпреЗ рдпрд╛ рд╕реНрдерд┐рддреАрд╕рд╣ рд╕рдорд╛рдкреНрдд рдЭрд╛рд▓реА рдЕрд╕рд▓реНрдпрд╛рд╕ рдЪрд╛рдЪрдгреА рдХреЗрд▓реА: "рдпрд╢рд╕реНрд╡реА". рдЖрддрд╛рдкрд░реНрдпрдВрдд рдЗрддрд░ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реНрдерд┐рддреА рдирд╛рд╣реАрдд. рдЗрддрд░ рд╕реНрдЯреЗрдЯрд╕ рдпреЗрддрд╛рдЪ, рдореА рдпрд╛ рдкреЛрд╕реНрдЯрдордзреНрдпреЗ .gitlab-ci.yml рджреБрд░реБрд╕реНрдд рдХрд░реЗрди.
рдореБрдЦреНрдп рдкреНрд░рдХрд▓реНрдк рдкреГрд╖реНрдард╛рд╡рд░ рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдЧреБрдгрд╡рддреНрддрд╛ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд┐рддреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреЗ
SonarQube рд╕рд╛рдареА рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдд рдЖрд╣реЗ
yum install -y sonarqube-qualinsight-badges
рдЖрдореНрд╣реА рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдпреЗрдереЗ рдЬрд╛рддреЛ
рдирд┐рдпрдорд┐рдд рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рддрдпрд╛рд░ рдХрд░рд╛, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде "рдмреЕрдЬ".
рдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдЕрдВрддрд░реНрдЧрдд рд╕реЛрдирд╛рд░рдХреНрдпреВрдмрдордзреНрдпреЗ рд▓реЙрдЧ рдЗрди рдХрд░рд╛.
тАЬрдорд╛рдЭреЗ рдЦрд╛рддреЗтАЭ рд╡рд░ рдЬрд╛, рдПрдХ рдирд╡реАрди рдЯреЛрдХрди рддрдпрд╛рд░ рдХрд░рд╛, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде тАЬread_all_repositoryтАЭ рдирд╛рд╡рд╛рдиреЗ рдЖрдгрд┐ тАЬgenerateтАЭ рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░рд╛.
рдЖрдореНрд╣реА рдкрд╛рд╣рддреЛ рдХреА рдПрдХ рдЯреЛрдХрди рджрд┐рд╕рд▓реЗ рдЖрд╣реЗ. рддреЛ рдлрдХреНрдд 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
рд╕реЛрдирд╛рд░рдХреНрдпреВрдмрдордзреНрдпреЗ рдкреНрд░рдХрд▓реНрдк рдЕрд╕реЗ рджрд┐рд╕реЗрд▓:
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 рдордзреНрдпреЗ рдкреНрд░рдХрд▓реНрдк рдЖрдпрдбреА рдЖрд╣реЗ.
рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдорд┐рд│рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдкрд░реНрдпрд╛рдп рдЕрд╕реВ рд╢рдХрддрд╛рдд
рд╕реБрдзрд╛рд░рдгрд╛, рджреЛрд╖ рдирд┐рд░рд╛рдХрд░рдгрд╛рд╕рд╛рдареА рд╕рд░реНрд╡ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛
рд╕реЛрдирд╛рд░рдХреНрдпреВрдмрдмрджреНрджрд▓ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдЪреЕрдЯ
DevSecOps рдмрджреНрджрд▓ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреЕрдЯ - рд╕реБрд░рдХреНрд╖рд┐рдд DevOps
рд╕реНрддреНрд░реЛрдд: www.habr.com