团队代码质量这样管理,甩掉技术债务

内容分享5小时前发布
0 3 0

背景说明

团队人员较少时,所有编码规范全靠大家自觉执行。团队按照 Gitflow 做版本控制,develop、release、master 分支受保护,向主干合并需要负责人之一做 Code Review进行人工代码审核与检查。不过在开发过程中如果遇到一个特性改动量很大时,代码合并的 Code Review 已经很难阅读了,为了赶工期,人为的把控自然会有松动也会疲惫,久而久之这样的代码又放之任之了,成为了团队的技术债务。因此我们需要一套公开透明的代码质量系统,能随时查看有问题的代码,方便做重构计划。

SonarQube介绍

SonarQube是一个开源的代码质量管理系统,它可以从多个维度检测代码质量,可以快速的定位代码中潜在的或者明显的 Bug、错误。

  • 支持超过25种编程语言:Java、PHP、JavaScript、Python、PL/SQL、Kotlin等。
  • 提供重复代码、编码标准、单元测试、代码覆盖率、代码复杂度、潜在Bug、注释和软件设计报告、指标历史记录
  • 提供了完全自动化的分析:与Maven、Ant、Gradle和持续集成工具(Atlassian Bamboo、Jenkins、Hudson等)
  • 与Eclipse开发环境集成
  • 支持扩展插件

以上介绍来自:维基百科-SonarQube

环境、软件准备

  • 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>extensionsplugins 目录下,重启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 中的项目代码质量评分纳入绩效考评范围
© 版权声明

相关文章

3 条评论

  • 头像
    -咕嘟鸭小趴菜yy 投稿者

    后面会更新详细的落地实践分享,欢迎关注转发

    无记录
    回复
  • 头像
    这人很哇噻_ 投稿者

    可以的,我这边没用jenkins

    无记录
    回复
  • 头像
    Tw199Y 投稿者

    收藏了,感谢分享

    无记录
    回复