3. SonarQube 基础:核心概念与安装部署

SonarQube 是缺陷分析工具链中的“质量裁判”。它通过一套可量化的规则和指标,对代码库进行持续审查,并输出“通过/失败”的明确结论。理解其核心概念是整合 JIRA 与 CI/CD 管道的前提。

3.1 核心概念全景

SonarQube 的架构围绕四个核心实体构建:项目、规则、指标 和 质量门。它们之间的关系如下图所示:

SonarQube 核心概念关系图 项目 (Project) 代码分析 (Analysis) 规则 (Rules) 指标 (Measures) 代码规范 / 缺陷 / 安全 覆盖率 / 重复 / 复杂度 质量门 (Quality Gate) 核心流程: 项目 → 分析 → 规则+指标 → 质量门判定
关键理解:质量门是 SonarQube 的“总开关”。只有通过质量门的代码,才允许进入下一阶段(如合并到主分支或触发生产部署)。

3.2 核心概念详解

3.2.1 项目 (Project)

在 SonarQube 中,项目是代码分析的逻辑单元。通常一个项目对应一个 Git 仓库或一个微服务。每个项目拥有独立的配置、规则集和质量门。

3.2.2 规则 (Rules)

规则是 SonarQube 的“法律条文”。每条规则定义了一种代码问题(Bug、漏洞、坏味道)。规则按语言、类型和严重程度分类。

规则类型 说明 示例
BUG 代码中明确的错误,可能导致运行时失败 空指针解引用、资源未关闭
VULNERABILITY 安全漏洞,可能被攻击者利用 SQL 注入、XSS 跨站脚本
CODE_SMELL 代码可维护性问题,降低代码质量 过长方法、重复代码、命名不规范
SECURITY_HOTSPOT 需要人工审查的安全敏感代码区域 未验证的用户输入、硬编码密码

3.2.3 指标 (Measures)

指标是 SonarQube 的“体检报告”。每次分析后,SonarQube 会计算数十个量化指标,用于评估代码健康状况。

  • 可靠性指标:Bug 数量、可靠性评级(A-E)
  • 安全性指标:漏洞数量、安全评级、安全热点数量
  • 可维护性指标:代码异味数量、技术债务(人天)、可维护性评级
  • 覆盖率指标:代码行覆盖率、分支覆盖率、单元测试数量
  • 重复指标:重复代码行数、重复代码块数、重复密度
  • 规模指标:代码行数(LOC)、注释行数、语句数、类数、函数数

3.2.4 质量门 (Quality Gate)

质量门是 SonarQube 的“准入条件”。它是一个布尔表达式,由一组条件(Condition)组成。当所有条件都满足时,质量门状态为 Passed(绿色);否则为 Failed(红色)。

质量门条件示例:
新代码覆盖率 < 80% → 失败
新增 Bug 数量 > 0 → 失败
新增安全漏洞数量 > 0 → 失败
新增代码异味数量 > 50 → 失败

3.3 SonarQube 安装部署

SonarQube 支持多种部署方式。以下以 Docker Compose 方式为例,演示如何快速搭建一个包含 SonarQube Server 和 PostgreSQL 数据库的生产级环境。

3.3.1 部署架构

SonarQube Docker 部署架构 用户 / CI 工具 SonarQube Server PostgreSQL Elasticsearch Docker Compose 部署 单机多容器架构

3.3.2 环境要求

  • Docker Engine >= 20.10
  • Docker Compose >= 2.0
  • 至少 4GB 可用内存(推荐 8GB)
  • 开放端口:9000(SonarQube Web UI)

3.3.3 部署步骤

步骤 1:创建 docker-compose.yml 文件

version: "3.8"

services:
  sonarqube:
    image: sonarqube:community-10.6.0
    container_name: sonarqube
    depends_on:
      - db
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar_pass
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
    ports:
      - "9000:9000"
    networks:
      - sonarnet

  db:
    image: postgres:15
    container_name: sonarqube_db
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar_pass
      POSTGRES_DB: sonar
    volumes:
      - postgresql_data:/var/lib/postgresql/data
    networks:
      - sonarnet

volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  postgresql_data:

networks:
  sonarnet:
    driver: bridge

步骤 2:启动服务

# 启动所有容器(后台运行)
docker compose up -d

# 查看启动日志
docker compose logs -f sonarqube

步骤 3:访问并初始化

  • 浏览器访问 http://localhost:9000
  • 默认管理员账号:admin / 密码:admin
  • 首次登录后,系统会强制要求修改管理员密码
⚠️ 生产环境注意事项:
  • 不要使用默认密码,立即修改为强密码。
  • PostgreSQL 数据库建议使用独立服务器或托管服务。
  • Elasticsearch 存储路径建议挂载 SSD 磁盘。
  • 根据代码量调整 JVM 堆内存:SONARQUBE_WEB_JVM_OPTS=-Xmx2048m

3.4 验证安装

部署完成后,通过以下步骤验证 SonarQube 是否正常工作:

  1. 检查服务状态:docker compose ps,确保所有容器状态为 Up。
  2. 访问 Web UI:打开 http://localhost:9000,确认登录页面正常显示。
  3. 创建测试项目:在 UI 中手动创建一个测试项目,生成一个令牌()。
  4. 运行本地分析:在本地代码目录中执行 Sonar Scanner CLI,验证分析结果能否成功上报。
快速验证命令:
docker run --rm -e SONAR_HOST_URL="http://localhost:9000" -e SONAR_="your_" -v "$(pwd):/usr/src" sonarsource/sonar-scanner-cli

3.5 本章小结