最近太忙了,随着公司开发越来越多,代码都是五花八门问题层出不穷,最终领导要求出具一个自动代码检测工具,然而调研了一圈还是选择了 SonarQube。废话不多说,开整。

 

SonarQube 使用说明文档

1. 工具说明

SonarQube 是一个用于静态代码分析的开源平台,可持续检测代码中的Bug、代码异味(Code Smell)、安全漏洞、重复代码、单元测试覆盖率等问题。 它支持多种主流语言,并能与持续集成(CI)工具深度集成,提升代码质量和团队开发效率。

2. 工具基础功能与使用说明

核心功能介绍

功能 说明
Bug 检测 识别潜在程序错误
Code Smell 提示代码可维护性问题
安全漏洞 检查潜在安全隐患
重复代码检测 检测重复逻辑,优化代码结构
单元测试覆盖率 与测试框架结合,展示覆盖率
质量门禁(Quality Gate) 设置项目通过标准,自动审核代码质量
多语言支持 支持 Java、JavaScript、Python、C#、Kotlin 等主流语言

首页

菜单栏
  • 项目:被扫描的项目

  • 问题:被扫描的项目的问题

  • 代码规则:代码检测规则

  • 质量配置:质量配置是在分析时使用的规则集合。可以启用或者禁用某些规则。

  • 质量阈(质量门禁):正常/错误。可以指定一些指标条件时为错误,比如bug数大于某个值时为错误。

项目概况
  • 漏洞:漏洞的数量

  • 异味:不规范代码的数量

  • 覆盖率:单元测试的对代码的覆盖率

  • 重复:重复代码的行数占总代码行数的比例

  • 大小:代码行数

  • 编程语言:项目检测的编程语言

  • 等级说明:由ABCDE5个等级,从A的绿色到E的红色表示严重等级。

项目总览

  • 指标说明:一般将鼠标放在图标上就会显示这个指标的说明

问题
  • 类型:一条规则定义的类型,有4种:bug,漏洞,异味,安全热点时单独的

  • 严重程度:有5种:阻断,严重,重要,次要,提示

  • 状态:5种:打开,解决,重开,关闭,确认

  • 负责人:分配给谁

  • 修复预估时间:系统给的预计修复时间

  • 评论:可以评论

指标

指标有:

指标总览

  • A = 0 Bug 最高等级A,表示代码无bug

  • B = at least 1 Minor Bug 代码只要有一个次要bug,等级就为B

  • C = at least 1 Major Bug 只要包含一个重要bug,等级将为C

  • D = at least 1 Critical Bug 只要有一个严重bug,等级评估为D

  • E = at least 1 Blocker Bug 只要有一个最高等级的阻断级别的bug,可靠性评估为E,最低级别。

图中气泡大小根据bug数变化,bug数越大气泡越大。视觉更加直观。

Security安全性

安全度指标计算方法

  • A = 0 Vulnerability 没有漏洞时,项目评估为最高级别A

  • B = at least 1 Minor Vulnerability 只要包含一个次要漏洞,项目评估为级别B

  • C = at least 1 Major Vulnerability 只要包含一个重要漏洞,项目评估为级别C

  • D = at least 1 Critical Vulnerability 只要包含一个严重漏洞,评估为D

  • E = at least 1 Blocker Vulnerability 只要包含一个阻断漏洞,项目评估为最低级别E

Maintainability(可靠/可维护性)

技术债务:Technical Debt,当前不规范的代码,会对以后产品修改的成本造成影响。

开发成本:开发一行代码(LOC)的成本。 示例:如果开发1 LOC的成本估计为30分钟,则此属性的值为30。目前我们采用的是系统默认值30。注意此处成本是指从零开始重写代码所需的成本。

可维护性:可维护性等级范围从A(非常好)到E(非常差)。 评级由技术债务比率的值决定,技术债务比率是将项目的技术债务与从零开始重写代码所需的成本进行比较。 A到D的默认值为0.05,0.1,0.2,0.5。任何超过0.5评级就为E。

举个例子:假设开发成本是30分钟,2,500 LOC的技术债务为24,000分钟的项目将有技术债务比率为24000 /(30 * 2,500)= 0.32。 因此项目的可维护性评级就是D。

Coverage覆盖率

行覆盖和条件覆盖的混合。单元测试覆盖多少源代码。Coverage = (CT + CF + LC)/(2*B + EL),其中 :

  • CT = conditions that have been evaluated to ‘true’ at least once至少有一次被判断为true的条件数

  • CF = conditions that have been evaluated to ‘false’ at least once 至少一次被判断为false的条件数

  • LC = covered lines = lines_to_cover uncovered_lines 已覆盖的行数

  • B = total number of conditions 条件总数

  • EL = total number of executable lines (lines_to_cover) 所有可执行的代码总行数

Duplications重复

SonarQube使用自己的复制/粘贴检测引擎,可以检测重复:

  1. 在源文件中

  2. 跨项目中的多个文件

  3. 项目的各个模块

  4. 跨多个项目

Duplicated Lines(%)

重复率=重复行数/总行数*100

  • Duplicated blocks:重复代码块行数

  • Duplicated files:重复文件数

  • Duplicated lines:重复行数

Complexity复杂度

以下关键词增加复杂性:if, for, while, case, catch, throw, return (不是方法的最后一个语句), &&, ||, ?

else, default, finally不增加复杂度

代码复杂度过高将难以理解、难以维护。

Issues问题

  • 新违

  • 违规

  • 开启问题

  • 重开问题

  • 确认问题

  • 误判问题

  • 不修复的问题

3.搭建方式

3.1使用 Docker 搭建(推荐)

创建 docker-compose.yml 文件:

# version: "3.8"   # Docker Compose文件版本,推荐使用较新的版本
services:
  # SonarQube 服务配置
  sonarqube:
    image: sonarqube:community # 使用 SonarQube 官方社区版镜像
    hostname: sonarqube    # 配置容器的主机名
    container_name: sonarqube   # 容器的名称
    depends_on:
      - db  # 确保数据库服务在SonarQube之前启动
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar  # 数据库连接URL
      SONAR_JDBC_USERNAME: sonar  # 数据库用户名
      SONAR_JDBC_PASSWORD: sonar  # 数据库密码
      SONAR_WEB_JAVAOPTS: "-Xms512m -Xmx2g"  # JVM 启动参数:初始堆内存512MB,最大2GB
    volumes:
      - sonarqube_data:/opt/sonarqube/data   # 将SonarQube的数据目录挂载到宿主机的卷中,确保数据持久化
      - sonarqube_extensions:/opt/sonarqube/extensions  # 挂载SonarQube的扩展目录
      - sonarqube_logs:/opt/sonarqube/logs  # 挂载SonarQube的日志目录
    ports:
      - "9000:9000"  # 映射SonarQube的9000端口到宿主机的9000端口
    mem_limit: 3g            # 设置最大内存限制为 3GB
    mem_reservation: 1g      # 设置内存保留为 1GB,确保至少有这么多内存
​
  # PostgreSQL 数据库服务配置
  db:
    image: postgres:13  # 使用 PostgreSQL 13 官方镜像
    hostname: postgresql
    container_name: postgresql
    environment:
      POSTGRES_USER: sonar  # PostgreSQL 数据库用户名
      POSTGRES_PASSWORD: sonar  # PostgreSQL 数据库密码
      POSTGRES_DB: sonar  # PostgreSQL 数据库名称
    volumes:
      - postgresql_data:/var/lib/postgresql/data  # 持久化数据
​
# 定义卷(volumes)以持久化容器数据
volumes:
  sonarqube_data:  # SonarQube 数据目录
  sonarqube_extensions:  # SonarQube 扩展目录
  sonarqube_logs:  # SonarQube 日志目录
  postgresql_data:  # PostgreSQL 数据目录
​
运行说明

到docker-compose.yml目录下执行命令:

docker-compose up -d
使用 Web 界面查看结果

访问 http://localhost:9000 登录后查看项目分析报告。

初始密码:admin/admin

3.2使用 Zip 包手动搭建

3.2.1 下载与解压(使用H2数据库不推荐)

从官网下载 SonarQube:Download SonarQube | Sonar

解压到指定目录:

bash复制编辑unzip sonarqube-*.zip
cd sonarqube-*/
3.2.2 启动服务

Linux/Mac:

bash复制编辑./bin/linux-x86-64/sonar.sh start

Windows:

c复制编辑.\bin\windows-x86-64\StartSonar.bat
3.2.3 访问地址

浏览器打开:http://localhost:9000

Maven 项目集成
xml复制编辑<!-- pom.xml 中添加插件 -->
<plugin>
  <groupId>org.sonarsource.scanner.maven</groupId>
  <artifactId>sonar-maven-plugin</artifactId>
  <version>3.9.1.2184</version>
</plugin>
执行扫描命令
bash复制编辑mvn clean verify sonar:sonar \
  -Dsonar.projectKey=my-project \
  -Dsonar.host.url=http://localhost:9000 \
  -Dsonar.login=<your-token>
2.2.3 使用 Web 界面查看结果

访问 http://localhost:9000 登录后查看项目分析报告。

初始密码:admin/admin

4.集成Jenkins + git + SonarQube

注意:默认jenkins 已经安装并且配置 git

4.1 Jenkins准备工作

4.1.1 登录jenkins - 系统管理 - 插件管理 - 下载SonarQube插件

4.1.2系统管理 - 系统配置 - SonarQube servers配置sonar Qube链接信息

4.1.3系统管理 - 全局工具配置 - SonarScanner for MSBuild 安装/SonarQube Scanner 安装

这里注意:SonarQube本身也是java程序需要jdk17以上版本,低于这个版本需要自己重新下载jdk并且指定路径引用。

4.2 Jenkins配置流水线任务

4.2.1 创建一个自由风格的软件项目

4.2.2 创建Git链接

4.2.3 设置Execute SonarQube Scanner

# 项目名称,${JOB_NAME}引用的是Jenkins中的mytest
sonar.projectname=${JOB_NAME}
# SonarQube 中项目的唯一标识符
sonar.projectKey=${JOB_NAME}
# 指定了项目中需要分析的源代码目录
sonar.source=./
# 指定了编译后的字节码目录
sonar.java.binaries=./

最后保存,执行即可。

4.3 集成Jenkins + git + SonarQube 流程演示

开发者提交到git --》Jenkins通过Git链接拉取代码保存到Jenkins本地目录内 --》Jkenins调用 Sonar Scanner扫描器执行扫描任务 --》将结果保存你到数据库 -- 》 Sonar Qube Web端显示

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐