SonarQube快速实践

2025-07-25 10:02:22

SonarQube快速实践

1. 简介

SonarQube 是一个本地部署的代码分析工具,旨在检测30多种编程语言、框架和基础设施即代码(IaC)平台中的代码问题。通过直接集成到您的持续集成(CI)流水线中或在我们支持的DevOps平台之一上,您的代码将在每次合并或拉取请求时根据广泛的规则集进行检查,涵盖代码的多个属性,如可维护性、可靠性和安全性问题。

作为Sonar解决方案的核心元素,SonarQube 完成了分析闭环,帮助您交付符合高质量标准的清洁代码。

2. 安装SonarQube

SonarQube 主要提供四个版本:社区版 (Community Edition)、开发者版 (Developer Edition)、企业版 (Enterprise Edition) 和数据中心版 (Data Center Edition)。

2.1 安装要求

硬件要求

CategoryRequirement内存对于小规模安装:4GB 的 RAM 对于大规模安装:16GB 的 RAMCPU64 位系统。 对于小规模安装:2 个核心 对于大规模安装:8 个核心 磁盘空间这取决于您使用 SonarQube 分析的代码量。 对于小规模安装:30GB 的存储空间。

小规模安装通常指的是社区版/开发者版的安装,支持最多 100 万行代码。大规模安装通常指的是企业版的单节点安装,支持最多 5000 万行代码。

支持的操作系统

SonarQube 可以运行在以下操作系统上:

Linux (x64, AArch64)Windows (x64)macOS (x64, AArch64)

硬件配置建议

SonarQube 在后台使用 Elasticsearch。为确保 SonarQube 的良好性能,您需要遵循与 Elasticsearch 使用相关的以下建议。

CategoryRecommendationDisk可用磁盘空间是绝对要求。Elasticsearch 实施了一种安全机制,当磁盘使用达到 95% 的水位线时,会锁定所有索引为只读模式,以防止磁盘被索引数据淹没。磁盘访问很容易成为 Elasticsearch 的瓶颈。如果条件允许,使用 SSD 的性能远远优于任何旋转介质。使用 SSD 的节点在查询和索引性能上都有显著提升。如果使用旋转介质,尽量选择最快的磁盘(高性能服务器磁盘,15,000 RPM 驱动器)。使用 RAID 0 是提高磁盘速度的有效方式,适用于旋转磁盘和 SSD。由于 Elasticsearch 具有副本和数据库主存储,因此不需要使用 RAID 的镜像或奇偶校验变体。请勿使用远程挂载的存储,如 NFS、SMB/CIFS 或网络附加存储(NAS)。它们通常速度较慢,延迟更大且平均延迟波动较大,且是单点故障。您可以将 /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 sizeCPU如果需要在更快的 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 服务器性能产生重大影响。

软件要求

CategoryRequirementWeb浏览器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