知识点
- 掌握代码左移的基本技术
- 掌握代码分析的基本技术
- 了解代码度量的基本指标
环境搭建
临时部署
docker run -d \
--name sonarqube_hogwarts_dev \
-p 9000:9000 -p 9092:9092 \
sonarqube
正式部署
db_instance=postgres_hogwarts_prod
sonarqube_instance=sonarqube_hogwarts_prod
data_dir=/root/sonarqube
mkdir -p $data_dir
#创建网络
docker network create sonarqube
#启动pg数据库
docker run -d \
--name $db_instance \
--network sonarqube \
-p 5432:5432 \
-e POSTGRES_USER=sonarqube \
-e POSTGRES_PASSWORD=sonarqube \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-v $data_dir/postgresql:/var/lib/postgresql/data \
postgres
#创建数据目录
mkdir $data_dir/sonarqube_data
mkdir $data_dir/sonarqube_extensions
mkdir $data_dir/sonarqube_logs
chown -R 999:999 $data_dir
sysctl -w vm.max_map_count=524288
sysctl -w fs.file-max=131072
ulimit -n 131072
ulimit -u 8192
#启动soarqube的产品部署
docker run -d \
--name $sonarqube_instance \
--network sonarqube \
-p 9000:9000 -p 9092:9092 \
-e SONARQUBE_JDBC_USERNAME=sonarqube \
-e SONARQUBE_JDBC_PASSWORD=sonarqube \
-e SONARQUBE_JDBC_URL="jdbc:postgresql://$db_instance/sonarqube" \
-v $data_dir/sonarqube_data:/opt/sonarqube/data \
-v $data_dir/sonarqube_extensions:/opt/sonarqube/extensions \
-v $data_dir/sonarqube_logs:/opt/sonarqube/logs \
sonarqube
scanner
https://docs.sonarqube.org/latest/analysis/languages/java/
scanner支持三种配置风格
- scanner命令行参数风格
- sonar-project.properties
- 构建工具插件 maven gradle
sonar-scanner \
-Dsonar.host.url=http://sonarqube.ceshiren.com:9000 \
-Dsonar.login=$SONARQUBE_TOKEN
sonar-scanner \
-Dsonar.host.url=http://sonarqube.ceshiren.com:9000 \
-Dsonar.login=$SONARQUBE_TOKEN \
-Dsonar.projectKey=litemall-core-seveniruby \
-Dsonar.sources=litemall-core/src/ \
-Dsonar.java.binaries=litemall-core/target/
docker版本的scanner
SONARQUBE_URL=http://h2.stuq.ceshiren.com:9000/
TOKEN="8a146b0c391b38381c74e65e07b6b8b2b7829d34"
YOUR_REPO="/root/sonarqube/sonar-scanning-examples/sonarqube-scanner"
docker run \
--rm \
-e SONAR_HOST_URL="${SONARQUBE_URL}" \
-e SONAR_LOGIN="${TOKEN}" \
-v "${YOUR_REPO}:/usr/src" \
sonarsource/sonar-scanner-cli
演练项目
官方示例
git clone https://github.com/SonarSource/sonar-scanning-examples.git
cd sonar-scanning-examples
临时token
hogwarts: cfc1c1d8bb8007fb2cff6b3cd797adc091698046
SONARQUBE_TOKEN=8a66a9a9bc94af9b877e31110e84c818e1de138e
分析命令
sonar-scanner \
-Dsonar.host.url=http://sonarqube.ceshiren.com:9000 \
-Dsonar.login=$SONARQUBE_TOKEN
代码分析实战
开源测试平台
git clone https://github.com/linlinjava/litemall.git
cd litemall
mvn clean package
SONARQUBE_TOKEN=e3ef00cf6fef4e735230b999f7c29dbc229a2eea
mvn sonar:sonar \
-Dsonar.host.url=http://sonarqube.ceshiren.com:9000 \
-Dsonar.login=$SONARQUBE_TOKEN
-Dsonar.projectName=litemall_$USER
-Dsonar.projectKey=litemall_$USER
单元测试与代码覆盖率实战
mvn clean \
org.jacoco:jacoco-maven-plugin:0.8.6:prepare-agent \
test \
org.jacoco:jacoco-maven-plugin:0.8.6:report\
-Dmaven.test.failure.ignore=true \
-Dmaven.test.skip=false
利用scanner上传覆盖率数据
find $PWD -name "jacoco.*"
mvn \
clean \
org.jacoco:jacoco-maven-plugin:0.8.6:prepare-agent \
test \
org.jacoco:jacoco-maven-plugin:0.8.6:report \
sonar:sonar \
-Dsonar.projectKey=demo \
-Dsonar.host.url=http://perf2.hogwarts.ceshiren.com:9000 \
-Dsonar.login=cfc1c1d8bb8007fb2cff6b3cd797adc091698046 \
-Dsonar.coverage.jacoco.xmlReportPaths="$PWD/**/**/**/**/jacoco.xml" \
-Dmaven.test.failure.ignore=true \
-Dmaven.test.skip=false
集成测试与代码覆盖率实战
- 使用tcp模式
- 精准测试做法,在每次集成测试的用例之后(teardown)中获取覆盖率数据并重置覆盖率数据
- 传统覆盖率做法,在所有集成测试的用例之后(teardown_session)中获取覆盖率数据
- 覆盖率数据merge
- 覆盖率数据的report 生成xml
- 使用sonarqube上传java专属测试相关数据 sonar.junit.reportPaths sonar.coverage.jacoco.xmlReportPaths
- 通用测试执行数据与覆盖率数据 sonar.testExecutionReportPaths sonar.coverageReportPaths