前言

公司开发部门希望在 Jenkins 构建过程中自动集成 C/C++ 的代码扫描,正好我也没接触过 SonarQube,于是记录下从零开始部署 SonarQube 服务并集成到 CI/CD 的过程,供后来者参考。


一、SonarQube 原理与工作机制详解

1.1 什么是 SonarQube?

SonarQube 是一款开源的代码质量管理平台,通过静态代码分析识别代码中的 Bug、安全隐患、重复代码、不规范风格等问题。它支持 CI/CD 集成、质量门控、可视化报告、规则自定义等功能,有助于提升开发效率与软件质量。

设计目标包括:

  • 防止 Bug 潜入主干(Shifting Left)
  • 统一代码质量度量标准
  • 提升协作开发效率

1.2 工作机制与关键组件

SonarQube 的整体流程可概括为 3 个阶段:

🔍 阶段一:代码分析

  • 使用 SonarScanner 或 IDE 插件(如 SonarLint)对项目进行扫描
  • 收集源代码、控制流、函数结构、复杂度、注释等静态信息
  • 编译型语言(如 C++、Java)需借助 build-wrapper 或编译日志获取 AST 与依赖信息

🚀 阶段二:数据传输

  • 扫描结果打包成 .sonar 文件,通过 HTTP(S) 上传至 SonarQube Server
  • 上传时需配置 token 或用户名/密码

📊 阶段三:质量评估与展示

  • Server 接收数据后执行:

    • 规则匹配引擎(Rules Engine):查找违规代码
    • 质量门检查(Quality Gates):判断是否满足发布标准
    • 报告生成与持久化:结果写入数据库(如 PostgreSQL),UI 展示可视化报表

📘 例如,Python 代码中使用 eval() 会被标记为高危漏洞,质量门不通过,从而阻止 CI 发布。

💡 一开始我误以为是由 sonar-scanner 上传代码,SonarQube Server 再去分析,实际是本地的 sonar-scanner 完成分析,然后将结果上传到服务器展示。


二、SonarQube 的语言支持与扫描机制差异

不同语言使用不同的分析策略,以下是主流语言支持情况对比:

编程语言内置支持特殊要求分析深度说明
Java支持完整语义分析
Python可识别格式、Bug、注释等问题
JavaScript可结合 ESLint 使用
C/C++需安装插件 + 构建信息使用 sonar-cxx 插件 + build-wrapper
Go分析速度较快
PHP可配合 PHPUnit 报告
Kotlin与 IntelliJ 兼容性好
HTML/CSS/TS适用于前端项目

🔎 补充说明

  • 解释型语言(如 Python/JS):通过 AST + 规则匹配进行分析
  • 编译型语言(如 C++/Java):依赖编译输出、控制流图、符号表等更复杂结构
  • 通用指标包括:Bugs、Vulnerabilities、Code Smells、Coverage、Duplication,但其计算方式会根据语言有所差异

三、SonarQube 版本体系详解

SonarQube 提供多个版本以满足不同用户需求:

版本收费特性亮点
Community Edition免费支持主流语言、基本规则配置、质量门控、Web UI
Developer Edition商用支持 C/C++/Swift、数据流分析、分支分析、Git blame 支持
Enterprise Edition商用增加多项目仪表盘、多租户支持、安全审计、SAML 登录
Data Center Edition商用支持高可用集群部署、适合大型企业环境

本文使用的是 Community Edition,可通过插件支持 C/C++ 分析,但不支持商业功能如分支差异比较、安全数据流等。
如果社区版实现不了的功能,那就由社区版 + 开源插件实现。


四、在 K8s 上部署 SonarQube(+ PostgreSQL)

我存储用的是 NFS,请PV、PVC部分请根据实际情况改动。

SonarQube 不支持 MySQL
一般来说,SonarQube 里的 H2 数据库也够用,就不用不过具体看公司规模情况,不过生产环境还是用 PostgreSQL,后续更好维护一些。

PostgreSQL

PersistentVolume、PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolume
metadata:name: pv-postgresqlnamespace: sonar
spec:capacity:storage: 50GiaccessModes:- ReadWriteManystorageClassName: postgresqlpersistentVolumeReclaimPolicy: Retainnfs:server: NFS地址path: /k8s-nfs/sonar/postgresql
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc-postgresqlnamespace: sonar
spec:accessModes:- ReadWriteManystorageClassName: postgresqlresources:requests:storage: 50Gi

Service、Deployment

kind: Service
metadata:name: postgresqlnamespace: sonar
spec:selector:app: postgresqlports:- protocol: TCPport: 5432targetPort: 5432name: postgresql
---
apiVersion: apps/v1
kind: Deployment
metadata:name: postgresqlnamespace: sonar
spec:replicas: 1selector:matchLabels:app: postgresqltemplate:metadata:name: postgresqllabels:app: postgresqlspec:nodeSelector:group: itcontainers:- name: postgresqlimage: postgres:17env:- name: TZvalue: 'Asia/Shanghai'- name: POSTGRES_USERvalue: sonar- name: POSTGRES_PASSWORDvalue: sonar_password- name: POSTGRES_DBvalue: sonarports:- name: postgresqlcontainerPort: 5432volumeMounts:- name: postgresqlmountPath: /var/lib/postgresql- name: postgresqlmountPath: /var/lib/postgresql/datasubPath: datavolumes:- name: postgresqlpersistentVolumeClaim:claimName:  pvc-postgresql

这里会一点小坑,在 dockerhub 上面搜 postgresql 会出现各种各样的数据库,但这都不是官方的,并且数据库目录 data 位置也不一样,官方的是 postgres

SonarQube

PersistentVolume、PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolume
metadata:name: pv-sonarqubenamespace: sonar
spec:capacity:storage: 50GiaccessModes:- ReadWriteManystorageClassName: sonarqubepersistentVolumeReclaimPolicy: Retainnfs:server: NFS地址path: /k8s-nfs/sonar/sonarqube
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc-sonarqubenamespace: sonar
spec:accessModes:- ReadWriteManystorageClassName: sonarquberesources:requests:storage: 50Gi

Service、Deployment

apiVersion: v1
kind: Service
metadata:name: sonarqubenamespace: sonar
spec:selector:app: sonarqubetype: NodePortports:- protocol: TCPport: 9000targetPort: 9000nodePort: 32018name: sonarqube
---
apiVersion: v1
kind: Pod
metadata:name: sonarqubenamespace: sonarlabels:app: sonarqube
spec:containers:- name: sonarqubeimage: sonarqube:lts-community #我这里是9.9.x版本env:- name: TZvalue: 'Asia/Shanghai'- name: SONAR_JDBC_URLvalue: jdbc:postgresql://postgresql:5432/sonar- name: SONAR_JDBC_USERNAMEvalue: sonar- name: SONAR_JDBC_PASSWORDvalue: sonar_password- name: SONAR_WEB_JVM_OPTSvalue: "-Xmx2G -Xms1G -XX:+HeapDumpOnOutOfMemoryError"ports:- name: sonarqubecontainerPort: 9000volumeMounts:- name: sonarqubemountPath: /opt/sonarqube/extensionssubPath: extensions- name: sonarqubemountPath: /opt/sonarqube/logssubPath: logs- name: sonarqubemountPath: /opt/sonarqube/datasubPath: data- name: sonarqubemountPath: /opt/sonarqube/confsubPath: confrestartPolicy: Nevervolumes:- name: sonarqubepersistentVolumeClaim:claimName: pvc-sonarqube

然后给宿主机(Node 节点)修改下配置,否则es启动会报错:

echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
# 控制单个进程可拥有的虚拟内存映射区域(VMA)数量上限(例如内存映射文件、共享库等)
sudo sysctl -p
# 立即生效,无需重启系统

就可以 kubectl apply -f xxx.yaml运行起来了

📌 访问地址:http://NodeIP:32018

默认账号密码:admin,admin


五、中文插件离线安装指南

中文插件地址(github)
按对应版本下载:
在这里插入图片描述

简要步骤

下载的插件 .jar 文件,放到 sonarqube 的 extensions/plugins/ 路径下。
并重启服务后并重新登录,界面将变为中文。

个人感觉中文翻译很差,真的是机翻,还不如使用英文版。


六、Python 项目扫描实战

1. 新增项目

  • 左上角 “项目” - 右侧 :“新增项目” - “手工”
  • 输入 “显示名”“项目标识”“主分支名称”(可默认main),点击 “设置”;
  • 点击 “本地” ,确认 “令牌名称” ,点击 “创建” - “继续”
  • 点击 “其他 (比如 JS,TS,Go,Python,PHP…)”,并选择对内操作系统(我这里是Windows)

2. 安装 sonar-scanner

  • “新增项目” 做完后,下面会有下载链接和提示:
    在这里插入图片描述
  • 点击并访问,下载解压并且添加到系统/用户环境变量

    Linux 操作雷同。

3. 执行扫描:

  • 进入 Python 项目并执行:
    sonar-scanner.bat -D"sonar.projectKey=令牌名称" D"sonar.sources=." -D"sonar.host.url=http://sonar地址" D"sonar.login=sqp_91..."
    看到最后提示 SUCCESS 即成功。

4. 报告查看:

  • 在 Sonar 的 Web 页面上,选择相应项目可以查看。

注:
在 Windows 系统的扫描项目下配置sonar-project.properties文件不生效,Linux 系统反而没这个问题。

sonar-project.properties 只是把 -D 参数后面的东西写入配置文件,sonar-scanner.bat 执行时使用里面的配置而已。


结语

上面就是 SonarQube 的部署已经简单使用,后续将更新 SonarQube 如何通过 cxx 插件,实现 C/C++ 代码的扫描,以及打通 Windows AD 和 Jenkins。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91089.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91089.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91089.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux(Centos 7.6)命令详解:sz

1.命令作用使用ZMODEM/YMODEM/XMODEM协议发送文件(Send file(s) with ZMODEM/YMODEM/XMODEM protocol)注意: 需要yum install lrzsz (yum provides sz可以查看rz命令是什么rpm包提供的)2.命令语法Usage: sz [options] file ...or: sz [options] -{c|i} COMMAND3.参数详解OPTION…

智能运维中的数据转换

《智能运维实践 苏娜 孙琳 王鸽著 人工智能技术丛书 自然语言处理的常用算法 日志异常检测 根因定位 网络流量异常检测 清华大学出版社》【摘要 书评 试读】- 京东图书 数据转换是数据预处理中的关键步骤,用于将数据从原始格式转换为适合分析和建模的形式。这一过程…

IAR编辑器如何让左侧的工具栏显示出来?

在IAR编辑器中恢复左侧工具栏显示,可通过以下方法操作: 一、通过菜单栏启用工具栏 ‌进入视图菜单‌ 点击顶部菜单栏的 ‌"View"‌ → 在弹出列表中勾选 ‌"Workspace"‌ 若工具栏仍不显示,查看菜单栏右侧是否有 ‌"…

ADB+Python控制(有线/无线) Scrcpy+按键映射(推荐)

要实现电脑通过键盘控制安卓平板屏幕点击的功能,可以采用以下方案: 方案一:ADBPython控制(有线/无线) 准备工具: 安卓平板开启开发者模式(设置→关于平板→连续点击版本号)启用USB调…

同态滤波算法详解:基于频域变换的光照不均匀校正

🎭 同态滤波:图像频域的调音师技术“如同调音师在音频处理中分离并调节不同频率成分,同态滤波能够在图像频域中精确分离光照与细节信息。”🎯 图像频域调音的技术挑战 在数字图像处理中,光照不均匀问题如同音频中的混响…

Ubuntu简述及部署系统

1.什么是Ubuntu1.1概述Ubuntu属于Debian系列,Debian是社区类Linux的典范,是迄今为止最遵循GNU规范的Linux系统。Debain最早由lan Murdock于1993年创建,分为三个版本分支(branch):stable,testing…

Claude Code安装部署

1️⃣安装 Node.js(已安装可跳过) 确保 Node.js 版本 ≥ 18.0 # Ubuntu / Debian 用户 curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo bash - sudo apt-get install -y nodejs node --version# macOS 用户 sudo xcode-select --install /b…

MATLAB近红外光谱分析技术及实践技术应用

专题一、MATLAB编程基础与进阶(一)1、MATLAB 安装、版本历史与编程环境2、MATLAB 基础操作(矩阵操作、逻辑与流程控制、函数与脚本文件)3、MATLAB文件读写(mat、txt、xls、csv、jpg、wav、avi等格式)专题二…

SQLFluff

一、SQLFluff 是什么? SQLFluff 是一个​​开源的 SQL 代码质量工具​​,专注于通过自动化方式提升 SQL 代码的可读性、一致性和规范性。其核心功能包括: ​​代码格式化​​:自动调整缩进、空格、换行等格式问题,支…

盲盒抽卡机小程序系统开发:连接线上线下娱乐新桥梁

在互联网技术的推动下,线上线下融合已经成为娱乐行业发展的必然趋势。盲盒抽卡机,这一原本在线下备受欢迎的娱乐项目,通过小程序系统的开发,成功实现了线上线下的无缝对接,成为连接线上线下娱乐的新桥梁。盲盒抽卡机小…

【SSL证书校验问题】通过 monkey-patch 关掉 SSL 证书校验

标签:Python、SSL、monkey-patch、httpx、aiohttp、requests、OpenAI 1 为什么会有这篇文章? 在本地调试 OpenAI 代理、数据抓取、私有服务、访问外网 时,经常会碰到如下报错: SSLCertVerificationError: [SSL: CERTIFICATE_VER…

VMWARE -ESXI-ntp时间同步无法启动异常处理

从服务界面查看NTP服务是停止的(手动启动无效)尝试到系统-时间设置-添加服务-网络时间协议,添加阿里云NTP服务器(网络可达) ntp.aliyun.com 点击确定报错-无法更改主机配置出现上面的情况多半是DNS没有设置ssh登录到服…

yolo11分类一键训练工具免安装环境windows版使用教程

这个是windows上用于yolo11分类训练工具,不需要写代码只需要按照要求摆放好分类图片文件夹就可以训练。软件内置cuda和python模块,因此不需要安装python环境和cuda就可以使用。注意需要电脑配备有nvidia显卡才能使用。要求显存>4GB。首先我们打开软件…

2025年-ClickHouse 高性能实时分析数据库(大纲版)

告别等待,秒级响应!这不只是教程,这是你驾驭PB级数据的超能力!我的ClickHouse视频课,凝练十年实战精华,从入门到精通,从单机到集群。点开它,让数据处理速度快到飞起,让你…

深入理解 Scikit-learn:机器学习实战的科学之道与避坑指南

掌握工具易,领悟其道难——本文带你穿透API表面,直击工业级机器学习实践的核心逻辑。作为一名长期耕耘在机器学习研究与工业应用一线的从业者,我见过太多因误用 sklearn 而导致的模型失效案例。从数据泄露到评估失真,从特征处理失…

Android 调试桥 (adb) 基础知识点

Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与安卓手机进行通信。常用于辅助测试开发或定位问题。 一、adb的工作原理 🌟 启动服务器进程:检查是否adb服务器进程正在运行,若没有则启动。 启动或关闭adb服务&#xff…

AW2013 LED驱动芯片 工作方式介绍

根据您上传的 AW2013 芯片手册,我将为您分三个部分详细解读:一、芯片简介(AW2013 概述) AW2013 是一款 3 通道的 IC 控制恒流 LED 驱动芯片,支持以下功能:单通道最大恒流输出:15mA,支…

node.js中的fs与path模块

前言 什么是Node.js? Node.js 是一个开源和跨平台的 JavaScript 运行时环境 Node.js 在浏览器之外运行 V8 JavaScript 引擎,即 Google Chrome 的核心。一、fs模块基础 1. 引入fs模块 const fs require(fs);2. 同步与异步方法 fs模块提供了同步和异步两种…

C# 静态类_静态方法_静态字段(static 声明静态的关键字 )

静态类里面的所有成员都必须得是静态的,是不能被实例化的(不能用对象调用),不能在静态类中声明实例(非静态)字段 属性 方法 静态方法中也只能访问静态字段, 普通方法中不管数据是不是静态都能使用1、定义一个静态类 //…

MRDIMM对服务器总体拥有成本(TCO)影响的系统性分析

以下是针对MRDIMM对服务器总体拥有成本(TCO)影响的系统性分析,结合技术特性与经济性指标:一、MRDIMM降低TCO的核心机制带宽效率提升 MRDIMM通过数据缓冲器实现双Rank并行传输,单次数据传输量从标准RDIMM的64字节提升至…