SonarQube快速实践

news2024/10/23 9:45:45

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.coloradmin.cn/o/2221495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

转行AI产品经理,第二步怎么走

之前写了一篇文章《转行AI产品经理&#xff0c;第一步怎么走》&#xff0c;好多小伙伴私信我&#xff0c;和我聊了一些细节&#xff0c;我感觉有必要再聊一聊&#xff0c;转行AI产品经理&#xff0c;第二步怎么走。 在上一篇文章里我们聊了一个小糖人游戏&#xff0c;从而得出…

用AI怎样来迭代优秀的学习法,AI+费曼学习法的妙用!

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 AI工具集1&#xff1a;大厂AI工具【共23款…

Quartus Ⅱ仿真 2.三人表决电路

奥里给&#xff0c;一起加油啊&#xff0c;我会陪着你们的&#xff01; 仿真波形&#xff1a; 输出结果&#xff1a; 介绍&#xff1a; 三人表决电路是一种数字逻辑电路&#xff0c;用于实现三个输入信号的多数表决。在这种电路中&#xff0c;如果至少有两个输入为高电平&a…

MySQL-事物隔离级别

1. MySQL事物的四种隔离级别 1.1 读未提交&#xff08;READ UNCOMMITTED&#xff09; READ UNCOMMITED提供了事物之间最小限度的隔离&#xff0c;除了幻读和不可重复读取的操作外&#xff0c;处于这个隔离级别的事务可以读到其它事务还未提交的数据。 1.2 读已提交&#xf…

利用 Direct3D 绘制几何体—7.编译着色器

在 Direct3D 中&#xff0c;着色器程序必须先被编译为一种可移植的字节码。接下来&#xff0c;图形驱动程序将获取这些字节码&#xff0c;并将其重新编译为针对当前系统 GPU 所优化的本地指令 [ATI1]。我们可以在运行期间用下列函数对着色器进行编译。 HRESULT D3DCompileFrom…

创建型模式-----(单例模式)

目录 基本概念 饿汉式&#xff1a; 懒汉式&#xff1a; 上锁双判空版本 std::call_once版本&#xff1a; C11标准后局部静态变量版本&#xff1a; 项目中单例模板的应用 基本概念 单例模式&#xff1a;在程序运行期间只有一份&#xff0c;与程序生存周期一样&#xff0c;…

对比学习论文随笔 1:正负样本对(Contrastive Learning 基础论文篇)

为了阅读的流畅&#xff0c;当前针对相同的代理任务按时间顺序进行梳理&#xff0c;涉及仅使用正负样本思想且优化目标一致的「基础」论文&#xff08;2018-2020&#xff09;&#xff0c;编码器均采用 ResNet。 文章目录 前言对比学习和代理任务&#xff08;Pretext task&#…

浪潮云启操作系统(InLinux)bcache缓存实践:理解OpenStack环境下虚拟机卷、Ceph OSD、bcache设备之间的映射关系

前言 在OpenStack平台上&#xff0c;采用bcache加速ceph分布式存储的方案被广泛用于企业和云环境。一方面&#xff0c;Ceph作为分布式存储系统&#xff0c;与虚拟机存储卷紧密结合&#xff0c;可以提供高可用和高性能的存储服务。另一方面&#xff0c;bcache作为混合存储方案&…

Java笔试06

在Java中&#xff0c;异常可以分为两大类&#xff1a;编译时异常&#xff08;编译时检查异常&#xff09;和运行时异常&#xff08;非编译时检查异常&#xff09;。 编译时异常&#xff08;Checked Exceptions&#xff09;是指在编译时期必须被捕获或声明抛出的异常。这些异常…

字节流写入文件

一、创建输出流对象表示的文件三种方式 方法一&#xff1a; FileOutputStream fos new FileOutputStream("fos.txt",true);//最简便方法二&#xff1a; FileOutputStream fos new FileOutputStream(new File("fos.txt"));方法三&#xff1b; File f ne…

Python | Leetcode Python题解之第502题IPO

题目&#xff1a; 题解&#xff1a; class Solution:def findMaximizedCapital(self, k: int, w: int, profits: List[int], capital: List[int]) -> int:if w > max(capital):return w sum(nlargest(k, profits))n len(profits)curr 0arr [(capital[i], profits[i]…

HTML作业

作业 复现下面的图片 复现结果 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><form action"#"method"get"enctype"text/plain"><…

Java程序设计:spring boot(7)——数据访问操作

目录 1 查询操作 1.1 接口方法定义 1.2 映射文件配置 1.3 UserService 1.4 UserController 2 添加操作 2.1 接口方式定义 2.2 映射文件配置 2.3 添加 commons-lang3 依赖 2.4 AssertUtil ⼯具类 2.5 ParamsException ⾃定义异常 2.6 UserService 2.7 ResultInfo …

UDP传输协议Linux C语言实战

文章目录 1.UDP简介1.1特点1.2 UDP协议头部格式1.2.1 **UDP头部**&#xff1a;1.2.2 **头部意义**&#xff1a;1.2.3 **头部参数**&#xff1a; 1.3 UDP数据长度控制1.4 UDP协议建立框架 2. 函数介绍2.1 sendto函数2.2 recvform函数2.3 其他函数 3.实例3.1 通用结构体、IPV4结构…

算法的学习笔记—(牛客JZ50)

&#x1f600;前言 在处理字符串时&#xff0c;寻找第一个只出现一次的字符是一项常见的任务。本文将探讨几种有效的解法&#xff0c;包括使用 HashMap 和位集&#xff08;BitSet&#xff09;。 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 &#x1f970;第一个只出现…

软件分享丨豆包电脑端 AI 助手

豆包电脑端 AI 助手是由字节跳动推出&#xff0c;旨在为用户提供高效便捷的工作和学习体验。它能在工作、学习等场景中发挥重要作用&#xff0c;为用户提供智能辅助&#xff0c;下面简单介绍它的特点&#xff1a; 高效搜索&#xff1a;像优化后的百度&#xff0c;直接提问就能…

【本科毕业设计】基于单片机的智能家居防火防盗报警系统

基于单片机的智能家居防火防盗报警系统 相关资料链接下载摘要Abstract第1章 绪论1.1课题的背景1.2 研究的目的和意义 第2章 系统总体方案设计2.1 设计要求2.2 方案选择和论证2.2.1 单片机的选择2.2.2 显示方案的选择 第3章 系统硬件设计3.1 整体方案设计3.1.1 系统概述3.1.2 系…

C#通过异或(^)运算符制作二进制加密(C#实现加密)

快速了解异或运算符&#xff1a; 异或运算符在C#中用 “^” 来表示 口诀&#xff1a;相同取0&#xff0c;相异取1 简单加密解密winform示例&#xff1a; /// <summary>/// 异或运算符加密实现/// </summary>/// <param name"p_int_Num">初始值<…

生成式 AI 与向量搜索如何扩大零售运营:巨大潜力尚待挖掘

在竞争日益激烈的零售领域&#xff0c;行业领导者始终在探索革新客户体验和优化运营的新途径&#xff0c;而生成式 AI 和向量搜索在这方面将大有可为。从个性化营销到高效库存管理&#xff0c;二者在零售领域的诸多应用场景中都展现出变革性潜力&#xff0c;已成为保持行业领先…

云电脑的真实使用体验

最近这几年&#xff0c;关于云电脑的宣传越来越多。 小枣君之前曾经给大家介绍过云电脑&#xff08;链接&#xff09;。简单来说&#xff0c;它属于云计算的一个应用。通过在云端虚拟出一些虚拟电脑&#xff0c;然后让用户可以远程使用&#xff08;仍然需要借助本地电脑&#x…