背景说明
团队人员较少时,所有编码规范全靠大家自觉执行。团队按照 Gitflow 做版本控制,develop、release、master 分支受保护,向主干合并需要负责人之一做 Code Review进行人工代码审核与检查。不过在开发过程中如果遇到一个特性改动量很大时,代码合并的 Code Review 已经很难阅读了,为了赶工期,人为的把控自然会有松动也会疲惫,久而久之这样的代码又放之任之了,成为了团队的技术债务。因此我们需要一套公开透明的代码质量系统,能随时查看有问题的代码,方便做重构计划。
SonarQube介绍
SonarQube是一个开源的代码质量管理系统,它可以从多个维度检测代码质量,可以快速的定位代码中潜在的或者明显的 Bug、错误。
· 提供了完全自动化的分析:与Maven、Ant、Gradle和持续集成工具(Atlassian Bamboo、Jenkins、Hudson等)
· 与Eclipse开发环境集成
· 支持扩展插件
环境、软件准备
· Docker、MySQL
· SonarQube: 7.6 (tag:7.6-community 开始支持kotlin、css)
· Sonar GitLab Plugin:version 4.1.0(取决于SonarQube版本)
· GitLab:GitLab Community Edition 8.7.2
· gitlab-runner:version 1.11.2
· Sonar Auth GitLab Plugin:version 1.2.2 (可选,取决于SonarQube版本)
SonarQube安装(docker方式)
需要先创建空数据库sonar
docker search sonarqube
docker pull sonarqube:7.6-community
docker run -d --name sonarqube \
-p 9000:9000 \
-e sonar.jdbc.username=root \
-e sonar.jdbc.password=123456 \
-e sonar.jdbc.url=jdbc:mysql://xxx:3306/sonar?useUnicode=true\&autoReconnect=true\&characterEncoding=utf8 \
sonarqube:7.6-community
GitLab安装(docker方式)
可以参照官方安装文档进行安装,本文略过:
https://docs.gitlab.com/omnibus/docker/
Sonar GitLab Plugin 安装
方式一:可以直接下载插件 sonar-gitlab-plugin-4.1.0-SNAPSHOT,放到 <sonarqube_install_dir>/extensions/plugins目录,重启 SonarQube 即可。
方式二:admin 登录 SonarQube(7.6-community为例),点击 配置 —> 应用市场 —> 搜索 ,输入 GitLab,在列表中点击安装,安装完毕后重启 SonarQube 即可。
SonarQube版本对应Sonar GitLab Plugin版本
GitLab添加统一认证账号
为了方便管理,需要在GitLab添加账号(如sonarQube),作为对接 SonarQube 的统一账户,为其赋予项目/项目组开发者权限(添加comment和注释行)。
使用sonarQube 登录GitLab,获取的User Token为下一步配置使用(不同版本略有差异,以下以两种版本为例)
·Community Edition 11.11.0:User Settings —> Access Tokens —>Personal Access Tokens
· GitLab Community Edition 8.7.2:User Settings —> Account —> Private Token
SonarQube配置
admin 登录 SonarQube(7.6-community为例),点击 配置 —> 通用配置 —> GitLab —> Reporting —> 配置 GitLab User Token 以及 GitLab url,其他配置默认即可。
· GitLab url : GitLab 服务地址(如:https://gitlab.host.com)
· GitLab User Token :GitLab 上用户的 Token(上一步获取的User Token)
gitlab-runner
gitlab-runner介绍与安装配置略过。 编写gitlab-ci.yml,实现日常提交分支提交自动扫描检测代码(ci/sonar_preview.sh,自动检测并对commit添加注释 ),develop、release代码合并则上传检测报告(ci/sonar_analyze.sh ,或者阶段性分支上传检测报告,提交检测报告扫描往往耗时较长,在持续集成过程中,develop、release每次都提交报告也不大必要)。
Maven
ci/sonar_preview.sh
mvn --batch-mode verify sonar:sonar \
-Dsonar.host.url=http://host:port \
-Dsonar.login=xxx \
-Dsonar.password=xxx \
-Dsonar.analysis.mode=preview \
-Dsonar.java.binaries=target/sonar \
-Dsonar.gitlab.project_id=$CI_PROJECT_ID \
-Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA \
-Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME \
-Dmaven.test.skip=true
if [ $? -eq 0 ]; then
echo "sonarqube code-analyze-preview over."
fi
ci/sonar_analyze.sh
mvn --batch-mode verify sonar:sonar \
-Dsonar.host.url=http://host:port \
-Dsonar.login=admin \
-Dsonar.password=xxx \
-Dsonar.issuesReport.html.enable=true \
-Dsonar.analysis.mode=publish \
-Dmaven.test.skip=true
if [ $? -eq 0 ]; then
echo "sonarqube code-analyze over."
fi
Gradle
集成sonarqube插件,添加task:
buildscript {
dependencies {
# 在此位置追加以下依赖行
classpath("org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.7.1")
}
}
# plugins段放置位置有要示,放在buildscript段前面会报错,放到文件最末尾也报错,紧跟buildscript放置OK,其余位置没有偿试
plugins {
# 添加插件信息
id("org.sonarqube") version "2.7.1"
}
# 声明插件
apply(plugin:"org.sonarqube")
# 如果项目不存在嵌套的子项目,则以上配置即可
# 如果项目存在嵌套的子项目,还要添加以下配置
subprojects {
# 在subprojects段中添加以下块内容
sonarqube {
properties {
property("sonar.sources", "src/main/kotlin")
}
}
}
ci/sonar_preview.sh
gradle sonarqube \
-Dsonar.host.url=http://host:port \
-Dsonar.login=admin \
-Dsonar.password=admin \
-Dsonar.analysis.mode=preview \
-Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA \
-Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME \
-Dsonar.gitlab.project_id=$CI_PROJECT_ID
-x test
if [ $? -eq 0 ]; then
echo "sonarqube code-analyze-preview over."
fi
ci/sonar_analyze.sh
gradle sonarqube \
-Dsonar.host.url=http://host:port \
-Dsonar.login=admin \
-Dsonar.password=admin \
-Dsonar.issuesReport.html.enable=true \
-Dsonar.analysis.mode=publish \
-x test
if [ $? -eq 0 ]; then
echo "sonarqube code-analyze over."
fi
gitlab-ci.yml:
stages:
- build
- build-deploy
sonar_preview:
stage: build
script:
- ci/sonar_preview.sh
except:
- develop
- /^release-.*$/
- master
tags:
- meyours-ci
sonar_analyze:
stage: build-deploy
script:
- ci/sonar_analyze.sh
only:
- develop
- /^release-.*$/
tags:
- meyours-ci
gitlab CI/CD流程(来自Gitlab官方)
排除扫描的目录
在实际应用中,我们需要排除某些目录/文件扫描检测(如我们后端代码中jooq生成的实体类文件),以免构建时间过长、消耗资源,配置路径如下:
*代表一个或多个字符
**代表一个或多个目录
整合阿里JAVA开发规约
下载插件 JAR 包,放到 SonarQube 所在服务器的 <SonarQube Home>\extensions\plugins 目录下,重启SonarQube服务。
1. 登录 SonarQube 打开 质量配置(profiles)页,点击右上方的【创建】按钮,创建 p3c profiles:
2. 首次创建会跳转到代码规则配置页面,刚新建的 profile 是没有激活任何规则的,需要手动激活
3. 跳转到激活页面,搜索【p3c】,点击【批量修改】,激活所有 p3c 规则
4. 返回质量配置页,我们可以设置 p3c 为默认,点击激活更多规则将sonar way默认规则加入
插件下载地址:
https://github.com/rhinoceros/sonar-p3c-pmd/releases/download/pmd-3.2.0-beta-with-p3c1.3.6-pmd6.10.0/sonar-pmd-plugin-3.2.0-SNAPSHOT.jar
流程与管理
规范
为代码编写可执行的单元测试用例,及时执行测试用例并获取代码覆盖率报告,且发布前代码覆盖率必须达到 x% 以上。
通过这套SonarQube代码质量系统,实时知道工程代码还有哪些待优化的部分以及技术债务。
详细计划
·所有单元测试用例优先保障覆盖率,再关注测试结果验证
· 技术债务需要清零,并纳入编码规范
· 静态代码分析对代码质量的标准应逐步提高:内部编码规范
· 代码重复率不能高于 x%
· 试行将 Sonar 中的项目代码质量评分纳入绩效考评范围
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理