1. 概述

本文将介绍如何使用开源代码质量检测平台 SonarQube 进行静态源代码分析。核心问题来了:为什么要分析源代码?简单来说,是为了确保项目在整个生命周期中的质量、可靠性和可维护性——糟糕的代码库维护成本总是更高。

2. 本地运行SonarQube

本地运行 SonarQube 有两种方式:

  • 通过 ZIP 文件运行服务器
    可从官网下载最新 LTS 版本。按照快速入门指南配置本地服务器。

  • 通过 Docker 容器运行
    执行以下命令启动服务器:

    docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest
    

3. 生成 SonarQube Token

启动 SonarQube 服务器后,使用初始默认凭据 admin:admin 登录(首次登录会要求修改密码)。

要在项目中使用扫描器,需从 SonarQube 界面生成访问令牌。登录后进入账户页面(http://localhost:9000/account),选择 Security 标签页,可生成三种项目令牌:

  • 项目分析令牌(Project Analysis Token)—— 仅适用于单个项目
  • 全局分析令牌(Global Analysis Token)—— 在所有项目间共享
  • 用户令牌(User Token)—— 基于用户权限,决定可访问的项目

在SonarQube中生成访问令牌

4. 分析源代码

pom.xml 中定义插件:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.sonarsource.scanner.maven</groupId>
                <artifactId>sonar-maven-plugin</artifactId>
                <version>3.4.0.905</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

插件最新版本可在这里获取。

在项目根目录执行以下命令扫描代码:

mvn clean verify sonar:sonar -Dsonar.projectKey=PROJECT_KEY 
                             -Dsonar.projectName='PROJECT_NAME' 
                             -Dsonar.host.url=http://localhost:9000 
                             -Dsonar.token=THE_GENERATED_TOKEN

⚠️ 需替换:

  • project_keyproject_name 为项目信息
  • the-generated-token 为步骤 3 生成的令牌

本文使用的示例项目可在这里查看。

命令执行后,结果将显示在项目仪表盘(http://localhost:9000)。其他可选参数可参考[官方文档](https://docs.sonarqube.org/latest/analysis/analysis-parameters/),注意各语言插件有特定的分析规则。

5. 分析结果

访问 http://localhost:9000 刷新页面,即可看到报告摘要:

概览

发现问题分为五类:

  • Bug(缺陷)
  • Vulnerability(漏洞)
  • Code Smell(代码异味)
  • Coverage(覆盖率)
  • Duplication(重复率)

每类问题都标注了数量或百分比,严重程度分为五级:阻断(Blocker)严重(Critical)主要(Major)次要(Minor)提示(Info)。项目名称前的图标显示质量门状态:✅ 通过(绿色)或 ❌ 失败(红色)。

点击项目名称进入专用仪表盘,可深入查看项目详情。项目仪表盘包含三个标签页:

  • 代码(Code)
  • 活动(Activity)
  • 管理(Administration)

问题列表

问题标签页显示:

  • 问题类别
  • 严重程度
  • 标签
  • 修复所需工时(按时间计算)

支持分配问题、添加评论、修改严重程度。左侧的筛选器可快速定位问题。如何判断代码库是否适合生产部署?这就需要质量门(Quality Gate)。

6. SonarQube 质量门

6.1 什么是质量门?

质量门是一组条件,项目必须满足这些条件才能发布到生产环境。核心问题:当前代码能否直接部署?

通过持续修复旧问题并确保新代码质量,可长期维护健康的代码库。质量门为每次新增代码设置验证规则,规则同样影响未修改的代码段。防止新问题产生,最终消除所有问题。

这类似于从源头修复漏水。引出关键概念——泄漏期(Leak Period):指两次分析/版本之间的时间段。

重新分析同一项目后,项目仪表盘的概览标签页会显示泄漏期结果:

泄漏期

在 Web 界面的 Quality Gates 标签页可管理所有质量门。默认预装了 SonarQube way 质量门,其失败条件包括:

  • 新代码覆盖率 < 80%
  • 新代码重复率 > 3%
  • 可维护性/可靠性/安全性评级低于 A

基于此,我们可以创建自定义质量门。

6.2 添加自定义质量门

操作步骤:

  1. 点击 Quality Gates 标签页 → Create 按钮(页面左侧)
  2. 输入名称(如 baeldung
  3. 设置条件:

创建自定义质量门1

Add Condition 下拉菜单选择 Blocker Issues,立即显示在条件列表中:

  • 操作符(Operator)设为 is greater than
  • 错误值(Error)设为 0
  • 勾选 Over Leak Period(仅限泄漏期)

创建自定义质量门2

点击 Add 保存。按相同流程添加第二个条件:

  • Add Condition 选择 issues
  • 勾选 Over Leak Period
  • 操作符设为 is less than
  • 错误值设为 1

此规则含义:若新增代码问题数小于1,则质量门失败(仅作演示用)。点击 Add 保存。

最后一步:将项目关联到自定义质量门。滚动到页面底部的 Projects 部分:

  1. 点击 All
  2. 勾选目标项目
  3. 可在页面右上角设为默认质量门

重新扫描项目(使用之前的 Maven 命令),刷新项目标签页。此时质量门将失败——因为我们设置了“无新问题则失败”的规则。

回到 Quality Gates 标签页,将 issues 条件的操作符改为 is greater than,点击 Update。再次扫描,质量门将通过。

7. 集成到 CI 流程

可将 SonarQube 集成到持续集成(CI)流程中,当代码分析不满足质量门时自动使构建失败。

我们将使用云端版 SonarQube——SonarCloud

  1. 注册账号:https://sonarcloud.io/sessions/new
  2. My Account > Organizations 获取组织密钥(格式如 xxxx-github
  3. My Account > Security 生成令牌(同本地版)

本文以 Travis CI 为例:

  1. 用 GitHub 账号注册:https://travis-ci.org/
  2. 激活目标项目的 CI 开关
  3. 添加 SonarCloud 令牌到 Travis 环境变量:
    • 进入项目页面 → More OptionsSettings
    • 滚动到 Environment Variables

Travis CI 配置1

添加新条目:

  • 名称:SONAR_TOKEN
  • 值:SonarCloud 生成的令牌
  • Travis 会自动加密隐藏

Travis CI 配置2

最后,在项目根目录创建 .travis.yml 文件:

language: java
sudo: false
install: true
addons:
  sonarcloud:
    organization: "your_organization_key"
    token:
      secure: "$SONAR_TOKEN"
jdk:
  - oraclejdk8
script:
  - mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar
cache:
  directories:
    - '$HOME/.m2/repository'
    - '$HOME/.sonar/cache'

替换 your_organization_key 为实际组织密钥。提交代码并推送到 GitHub 仓库将自动触发 Travis CI 构建和 Sonar 扫描。

8. 总结

本文介绍了如何本地部署 SonarQube 服务器,以及使用质量门定义项目生产就绪标准。更多平台功能细节可参考 SonarQube 官方文档


原始标题:Code Analysis with SonarQube | Baeldung

« 上一篇: Jinq与Spring集成指南
» 下一篇: ActiveJDBC 入门指南