sonarqube环境搭建

知识点

  • 掌握代码左移的基本技术
  • 掌握代码分析的基本技术
  • 了解代码度量的基本指标

环境搭建

临时部署

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/scan/sonarscanner/

https://docs.sonarqube.org/latest/analysis/languages/java/

https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-maven/

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

相关链接

https://docs.sonarqube.org/latest/

关闭