代码分析所关注的质量指标:
常见代码分析工具:
SonarQube 使用流程:
# 自带小型内存级db docker run -d \ --name sonarqube_dev \ -p 9000:9000 -p 9092:9092 \ sonarqube
访问主机 IP:9000
:
# 设置变量 db_instance=postgres_prod # postgres 实例名称 sonarqube_instance=sonarqube_prod # sonar 实例名称 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 # 日志目录 # 启动 soarqube 时所需的配置 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 # 启动过程较慢,可以从日志查看启动进度 docker logs -f sonarqube
Sonar 平台默认登录账号:admin/admin
填写任意字符后生成 Token(注意保存):
SONARQUBE_TOKEN=e74425b959d9b4666195d7278fafee8fac5d6a72
以 Maven 为例:
mvn clean verify sonar:sonar \ # sonar:sonar 需要先在本地maven中安装插件 -Dsonar.projectKey=demo \ -Dsonar.host.url=http://192.168.3.222:9000 \ -Dsonar.login=e74425b959d9b4666195d7278fafee8fac5d6a72
使用以下开源平台进行代码分析演练:
git clone https://github.com/linlinjava/litemall.git cd litemall # 打包项目 mvn clean package SONARQUBE_TOKEN=e74425b959d9b4666195d7278fafee8fac5d6a72 # 使用 java 11 # 使用 sonar 对该项目代码进行分析,并上传结果到 sonar 平台中 mvn sonar:sonar \ -Dsonar.host.url=http://192.168.3.222:9000 \ -Dsonar.login=$SONARQUBE_TOKEN -Dsonar.projectKey=demo
代码构建-分析概况:
代码构建-分析明细:
空指针分析:
非侵入式的生成 jacoco 代码覆盖率数据:
# 查找生成的 jacoco 覆盖率数据文件路径 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.host.url=http://192.168.3.222:9000 \ -Dsonar.login=$SONARQUBE_TOKEN \ -Dsonar.projectKey=demo \ -Dsonar.coverage.jacoco.xmlReportPaths="$PWD/**/**/**/**/jacoco.xml" \ -Dmaven.test.failure.ignore=true \ -Dmaven.test.skip=false
侵入式的生成 jacoco 代码覆盖率数据:
关键数据:
做法:
示例:在进行集成测试(生成覆盖率数据)后,再利用 scanner 上传覆盖率数据到 sonar 上
# 查找 jacoco 覆盖率数据文件所在路径 find $PWD -name "jacoco.*" # 上传覆盖率数据到 sonar mvn \ sonar:sonar \ -Dsonar.host.url=http://192.168.3.222:9000 \ -Dsonar.login=$SONARQUBE_TOKEN \ -Dsonar.projectKey=demo \ -Dsonar.coverage.jacoco.xmlReportPaths="$PWD/**/**/**/**/jacoco.xml" \ -Dmaven.test.failure.ignore=true \ -Dmaven.test.skip=false