Jenkins + SonarQube 從原理到實戰一:基于 K8s 部署與使用(含中文插件與 Python 掃描)

前言

公司開發部門希望在 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字節提升至…