SonarQube快速实践
1. 简介
SonarQube 是一个本地部署的代码分析工具,旨在检测30多种编程语言、框架和基础设施即代码(IaC)平台中的代码问题。通过直接集成到您的持续集成(CI)流水线中或在我们支持的DevOps平台之一上,您的代码将在每次合并或拉取请求时根据广泛的规则集进行检查,涵盖代码的多个属性,如可维护性、可靠性和安全性问题。
作为Sonar解决方案的核心元素,SonarQube 完成了分析闭环,帮助您交付符合高质量标准的清洁代码。
2. 安装SonarQube
SonarQube 主要提供四个版本:社区版 (Community Edition)、开发者版 (Developer Edition)、企业版 (Enterprise Edition) 和数据中心版 (Data Center Edition)。
2.1 安装要求
硬件要求
Category | Requirement |
---|---|
内存 | 对于小规模安装:4GB 的 RAM 对于大规模安装:16GB 的 RAM |
CPU | 64 位系统。 对于小规模安装:2 个核心 对于大规模安装:8 个核心 |
磁盘空间 | 这取决于您使用 SonarQube 分析的代码量。 对于小规模安装:30GB 的存储空间。 |
- 小规模安装通常指的是社区版/开发者版的安装,支持最多 100 万行代码。
- 大规模安装通常指的是企业版的单节点安装,支持最多 5000 万行代码。
支持的操作系统
SonarQube 可以运行在以下操作系统上:
- Linux (x64, AArch64)
- Windows (x64)
- macOS (x64, AArch64)
硬件配置建议
SonarQube 在后台使用 Elasticsearch。为确保 SonarQube 的良好性能,您需要遵循与 Elasticsearch 使用相关的以下建议。
Category | Recommendation |
---|---|
Disk | 可用磁盘空间是绝对要求。Elasticsearch 实施了一种安全机制,当磁盘使用达到 95% 的水位线时,会锁定所有索引为只读模式,以防止磁盘被索引数据淹没。磁盘访问很容易成为 Elasticsearch 的瓶颈。如果条件允许,使用 SSD 的性能远远优于任何旋转介质。使用 SSD 的节点在查询和索引性能上都有显著提升。如果使用旋转介质,尽量选择最快的磁盘(高性能服务器磁盘,15,000 RPM 驱动器)。 使用 RAID 0 是提高磁盘速度的有效方式,适用于旋转磁盘和 SSD。由于 Elasticsearch 具有副本和数据库主存储,因此不需要使用 RAID 的镜像或奇偶校验变体。 请勿使用远程挂载的存储,如 NFS、SMB/CIFS 或网络附加存储(NAS)。它们通常速度较慢,延迟更大且平均延迟波动较大,且是单点故障。您可以将 <sonarqubeHome>/Data (其中 sonarqubeHome 是 SonarQube 安装目录;建议将此目录设置为 /opt/sonarqube )放置在一个单独的分区中,以帮助缓解上述单点故障问题。 |
RAM | 建议将可用内存的 50% 分配给 Elasticsearch 的堆,同时保留另外 50% 的内存。原因是 Lucene(由 Elasticsearch 使用)旨在利用底层操作系统来缓存内存中的数据结构。请勿分配超过 32GB 的堆内存。有关更多详细信息,请参阅以下 Elasticsearch 文章: - Elasticsearch Guide: Heap Sizing - A Heap of Trouble - Elasticsearch Reference: JVM heap size |
CPU | 如果需要在更快的 CPU 和更多核心之间进行选择,则应选择更多核心。多个核心提供的额外并发性将远远超过略微更快的时钟速度。数据本质上是分布在多个节点上的,因此执行时间取决于最慢的节点。拥有多个中等性能的节点比拥有一个快的节点和一个慢的节点更好。 |
I/O scheduler for SSD | 如果您使用 SSD,请不要使用 CFQ(完全公平排队)I/O 调度器(这是大多数 Unix 发行版的默认 I/O 调度器)。请改用 deadline 或 NOOP 调度器。 在将数据写入磁盘时,I/O 调度器决定何时将数据实际发送到磁盘。CFQ 为每个进程分配“时间片”,然后优化这些不同队列的交付到磁盘。它针对旋转介质进行了优化:旋转盘片的特性使得基于物理布局将数据写入磁盘更加高效。deadline 调度器根据写入请求的挂起时间进行优化,而 NOOP 则仅是一个简单的 FIFO 队列。 |
Hard drives | 它们应该具有出色的读写性能。最重要的是,“data” 文件夹存储了 Elasticsearch 索引,当服务器运行时,会进行大量的 I/O 操作。因此,硬盘的读写性能将对整体 SonarQube 服务器性能产生重大影响。 |
软件要求
Category | Requirement |
---|---|
Web浏览器 | Microsoft Edge: 最新版本 Mozilla Firefox: 最新版本 Google Chrome: 最新版本 Safari: 最新版本 |
Java | 仅适用于从 ZIP 文件进行的服务器安装。 - Oracle JRE 或 OpenJDK - Java 版本 17 - 建议:使用 Java CPU(critical patch update)版本。 注意:SonarQube 能够分析任何类型的 Java 源文件,无论它们符合哪个版本的 Java。 |
数据库要求
下表展示了支持的数据库类型:
- PostgreSQL,version11到15;
- SQL Server:2014,2016,2017,2019,2022;
- Oracle:21C, 19C, XE Editions。
更多信息查看:
https://docs.sonarsource.com/sonarqube/latest/setup-and-upgrade/installation-requirements/database-requirements/
2.2 安装
安装概述
支持从 ZIP 文件或 Docker 镜像创建单节点 的SonarQube 实例。有关 Kubernetes 安装,请参阅《在 Kubernetes 上部署 SonarQube》。有关集群设置(数据中心版本)的详细信息,请参阅《将服务器安装为集群》。
按以下步骤在服务器端安装 SonarQube:
- 安装 SonarQube 数据库。
- 安装 SonarQube 服务器并执行基本设置。可以选择从 ZIP 文件或 Docker 镜像安装服务器。
- 如有必要,执行高级设置。
一个SonarQube实例包括下面三个组件:
- 运行 SonarQube 的服务器包括以下进程:
- 提供 SonarQube 用户界面的 Web 服务器。
- 基于 Elasticsearch 的搜索服务器。
- 负责处理代码分析报告并将其保存到 SonarQube 数据库中的计算引擎。
- 数据库用于存储以下内容:
- 在代码扫描过程中生成的代码质量和安全性的指标和问题。
- SonarQube 实例的配置。
- 在您的构建或持续集成服务器上运行的一个或多个扫描器,用于分析项目。
为了获得最佳性能,SonarQube 服务器和数据库应安装在不同的主机上,并且服务器主机应为专用主机。服务器和数据库主机应位于同一网络中。
所有主机必须进行时间同步。
安装实践
本文记录使用docker-compose编排进行SonarQube的安装,数据库使用PG。Docker Engine版本建议大于等于 20.10。
Linux 系统上的安装前步骤
配置主机以符合 Elasticsearch 要求
由于 SonarQube 使用嵌入式 Elasticsearch,请确保您的主机配置符合 Elasticsearch 生产模式的要求以及文件描述符配置。
配置最大打开文件数和其他限制
必须确保:
- 进程可以拥有的最大内存映射区域数量(
vm.max_map_count
)大于或等于 524288。 - 最大打开文件描述符数量(
fs.file-max
)大于或等于 131072。 - 运行 SonarQube 的用户可以打开至少 131072 个文件描述符。
- 运行 SonarQube 的用户可以打开至少 8192 个线程。
您必须在主机系统上设置这些限制,无论安装类型如何:
- 对于 Docker 安装:这些设置将应用于 Docker 容器。
- 对于 Kubernetes 部署:请参阅这些指南。
要检查和更改这些限制,请以运行 SonarQube 的用户身份登录,并根据该用户的类型按以下步骤进行操作:
- 使用以下命令验证上述参数的值:
sysctl vm.max_map_count
sysctl fs.file-max
ulimit -n
ulimit -u
- 要修改
max map count
和file-max
,在/etc/sysctl.d/99-sonarqube.conf
文件中插入以下内容(如果使用默认文件/etc/sysctl.conf
,请插入其中,但不推荐这样做)。要应用更改,请运行相应的 Linux 命令:
vm.max_map_count=524288
fs.file-max=131072
- 要修改运行 SonarQube 用户的限制,在
/etc/security/limits.d/99-sonarqube.conf
文件中插入以下内容(如果使用默认文件/etc/security/limits.conf
,请插入其中,但不推荐这样做),其中sonarqube
是运行 SonarQube 的用户。要应用更改,请运行相应的 Linux 命令:
sonarqube - nofile 131072
sonarqube - nproc 8192
docker-compose安装SonarQube
创建docker-compose.yml
文件,内容如下:
services:
sonarqube:
image: sonarqube:lts-community
hostname: sonarqube
container_name: sonarqube
read_only: true
depends_on:
db:
condition: service_healthy
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
- sonarqube_temp:/opt/sonarqube/temp
ports:
- "9000:9000"
db:
image: postgres:15
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
hostname: postgresql
container_name: postgresql
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
POSTGRES_DB: sonar
volumes:
- postgresql:/var/lib/postgresql
- postgresql_data:/var/lib/postgresql/data
volumes:
sonarqube_data:
sonarqube_temp:
sonarqube_extensions:
sonarqube_logs:
postgresql:
postgresql_data:
启动容器:
[root@sonar-server sonarqube]# ls
docker-compose.yml postgres-15.tar.gz snoarqube-lts-community.tar.gz
[root@sonar-server sonarqube]# docker-compose up -d
[+] Running 3/3
✔ Network sonarqube_default Created 0.1s
✔ Container postgresql Healthy 11.1s
✔ Container sonarqube Started 11.6s
启动完毕后,使用浏览器访问http://localhost:9000
即可访问SonarQube,默认系统管理员账号密码为admin/admin
。
说明
上述vaolumes本地路径默认为:/var/lib/docker/volumes/。
3. 参考架构
该部分的详细情况参考官方文档:
https://docs.sonarsource.com/sonarqube/latest/setup-and-upgrade/reference-architectures/up-to-10m-loc/
开发者版/企业版的参考架构(支持最多 1000 万行代码)
下面页面描述了一个 SonarQube 实例的架构,该实例在正常使用模式下可以支持最多 1000 万行代码,并且不具备高可用性设置。
该参考架构涵盖以下组件:
- 安装了 SonarQube(开发者版或企业版)和 nginx HTTPS 代理的虚拟机主机。
- 在专用主机上运行的 PostgreSQL 数据库。
- 与 GitHub Actions 集成的分析。
- 通过 GitHub.com 进行身份验证。
- 使用 Prometheus 进行监控。
- 通过 SMTP 中继发送外发电子邮件通知。
企业版的参考架构(支持最多 5000 万行代码)
该架构描述了一个 SonarQube 企业版实例的设置,该实例在正常使用模式下可以支持最多 5000 万行代码,并且不具备高可用性设置。
该参考架构涵盖以下组件:
- 安装了 SonarQube 企业版和 nginx HTTPS 代理的虚拟机主机
- 在专用主机上运行的 PostgreSQL 数据库
- 与 Jenkins CI 集成的分析
- 通过 GitHub Enterprise 进行拉取请求报告和身份验证
- 使用 Prometheus 进行监控
- 通过 SMTP 中继发送外发电子邮件通知
4. 相关资料
- github地址:https://github.com/SonarSource/sonarqube
- 官方文档:https://docs.sonarqube.org/latest/setup/install-server/
- helm chart仓库:https://artifacthub.io/packages/helm/sonarqube/sonarqube