当前位置: 首页 > article >正文

SonarQube快速实践

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 的 RAM
CPU64 位系统。
对于小规模安装:2 个核心
对于大规模安装:8 个核心
磁盘空间这取决于您使用 SonarQube 分析的代码量。
对于小规模安装:30GB 的存储空间。
  • 小规模安装通常指的是社区版/开发者版的安装,支持最多 100 万行代码。
  • 大规模安装通常指的是企业版的单节点安装,支持最多 5000 万行代码。
支持的操作系统

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

  • Linux (x64, AArch64)
  • Windows (x64)
  • macOS (x64, AArch64)
硬件配置建议

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

CategoryRecommendation
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 服务器性能产生重大影响。
软件要求
CategoryRequirement
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:

  1. 安装 SonarQube 数据库。
  2. 安装 SonarQube 服务器并执行基本设置。可以选择从 ZIP 文件或 Docker 镜像安装服务器。
  3. 如有必要,执行高级设置。

一个SonarQube实例包括下面三个组件:

SQ-instance-components

  1. 运行 SonarQube 的服务器包括以下进程:
  • 提供 SonarQube 用户界面的 Web 服务器。
  • 基于 Elasticsearch 的搜索服务器。
  • 负责处理代码分析报告并将其保存到 SonarQube 数据库中的计算引擎。
  1. 数据库用于存储以下内容:
  • 在代码扫描过程中生成的代码质量和安全性的指标和问题。
  • SonarQube 实例的配置。
  1. 在您的构建或持续集成服务器上运行的一个或多个扫描器,用于分析项目。

为了获得最佳性能,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 的用户身份登录,并根据该用户的类型按以下步骤进行操作:

  1. 使用以下命令验证上述参数的值:
sysctl vm.max_map_count
sysctl fs.file-max
ulimit -n
ulimit -u
  1. 要修改 max map countfile-max,在 /etc/sysctl.d/99-sonarqube.conf 文件中插入以下内容(如果使用默认文件 /etc/sysctl.conf,请插入其中,但不推荐这样做)。要应用更改,请运行相应的 Linux 命令:
vm.max_map_count=524288
fs.file-max=131072
  1. 要修改运行 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-vm-based-10m-reference-architecture

该参考架构涵盖以下组件:

  • 安装了 SonarQube(开发者版或企业版)和 nginx HTTPS 代理的虚拟机主机。
  • 在专用主机上运行的 PostgreSQL 数据库。
  • 与 GitHub Actions 集成的分析。
  • 通过 GitHub.com 进行身份验证。
  • 使用 Prometheus 进行监控。
  • 通过 SMTP 中继发送外发电子邮件通知。

企业版的参考架构(支持最多 5000 万行代码)

该架构描述了一个 SonarQube 企业版实例的设置,该实例在正常使用模式下可以支持最多 5000 万行代码,并且不具备高可用性设置。

该参考架构涵盖以下组件:

  • 安装了 SonarQube 企业版和 nginx HTTPS 代理的虚拟机主机
  • 在专用主机上运行的 PostgreSQL 数据库
  • 与 Jenkins CI 集成的分析
  • 通过 GitHub Enterprise 进行拉取请求报告和身份验证
  • 使用 Prometheus 进行监控
  • 通过 SMTP 中继发送外发电子邮件通知

sonarqube-vm-based-Enterprise-reference-architecture

4. 相关资料

  1. github地址:https://github.com/SonarSource/sonarqube
  2. 官方文档:https://docs.sonarqube.org/latest/setup/install-server/
  3. helm chart仓库:https://artifacthub.io/packages/helm/sonarqube/sonarqube

http://www.kler.cn/news/360788.html

相关文章:

  • JAVA集合知识总结(三)
  • 1280,学生们参加各科测试的次数
  • 苍穹外卖学习笔记(二十七)
  • 循序渐进丨MogDB 5.0 远程访问 MogDB/Oracle 数据库的简便方法(使用@符号)
  • Node Checking - Checkboxes and Radio Buttons 节点检查 - 复选框和单选按钮
  • 一款企业级的低代码开发平台,含流程引擎、表单引擎、权限管理
  • 重新阅读《马说》,感悟“伯乐相马”背后的被选择与选择的大智慧
  • leetcode解题 - #用栈实现队列 #用队列实现栈 #循环队列
  • 【分布式技术】中间件-zookeeper安装配置
  • Python编程语言:探索其无限可能的旅程
  • 集控中心操作台的应用如何确保场站安全运行
  • 鸿蒙开发:实现一个超简单的网格拖拽
  • 【论文阅读】SAM 2: 分割一切图像和视频
  • 【MySQL】InnoDB存储引擎中的锁
  • 一个Docker管理工具,让您的Docker容器自动更新
  • Redis 数据类型Geospatial Indexes(地理空间索引)
  • PLC_博图系列☞基本指令”TP:启动脉冲定时器“
  • Flume面试整理-配置文件格式
  • 性能工具之 HAR 格式化转换JMeter JMX 脚本文件
  • 多一DY4100数字式接地电阻测试仪使用测量方法