SonarQube使用教程(Docker安装)
一、SonarQube介绍面向多语言的代码质量与安全静态分析平台1、组成①sonarQubeweb界面管理平台1展示所有的项目代码的质量数据。2配置质量规则、管理项目、配置通知、配置SCM等。②sonarScanner代码扫描工具1专门用来扫描和分析项目代码支持20语言。2代码扫描和分析完成之后会将扫描结果存储到数据库当中在sonarQube平台看到扫描的数据。2、优势① 检测维度全基于代码编写规范与安全规范双重规则集自动识别安全漏洞、代码异味、重复代码、圈复杂度及测试覆盖率缺口② 工程集成无缝对接IDE、SCMGit/SVN及CI/CD流水线自动定位问题代码与具体提交人。③ 持续赋能通过量化质量门禁与增量分析驱动团队持续交付更干净、更安全的代码。二、SonarQube下载官网https://www.sonarsource.com/products/sonarqube/downloads/1、安装要求① 软件环境硬性要求JDK 版本分界线很关键SonarQube 8.9 LTS仅支持JDK11SonarQube 9.9 LTS支持JDK11 / JDK17推荐JDK17SonarQube 10.x强制OpenJDK 17不再兼容JDK11② 数据库重点避坑内置H2数据库仅用于测试、本地临时使用生产严禁使用正式生产仅支持PostgreSQL 12~16支持MySQL的SonarQube版本7.8及更早需要较旧的Java版本通常是Java 8或11③ 端口与权限要求默认 Web 端口9000需放行防火墙禁止管理员root用户启动SonarQube必须新建普通用户运行。Docker默认容器内部进程不是root用户容器内置了普通账号因此不用手动新建用户。④ 附属依赖如需对接CI/ESLintNode.js 14~20Docker部署Docker Engine ≥20.102、安装软件① 查看docker版本是否符合要求docker安装教程暂时占位运行Docker Desktop并且开启WSL2按下CtrlShiftEsc打开任务管理器 → 性能 →CPU右下角查看虚拟化已启用 ✅② 创建目录必须使用 Docker 命名卷named volumes不能用 bind mounts。我没有放在C盘都放在D盘了可以根据要求选择数据存放位置。1mkdir D:\sonarqube\postgres_data对应容器路径/var/lib/postgresql/data存什么PostgreSQL的全部数据库文件SonarQube的用户账号、项目配置、分析结果、权限设置、插件市场元数据等能不能删删了等于数据库清空SonarQube所有配置和扫描记录都没了2mkdir D:\sonarqube\sonarqube_data对应容器路径/opt/sonarqube/data存什么SonarQube内置Elasticsearch的索引数据项目分析结果的搜索索引缓存、临时计算数据等能不能删可以删但删了要重建索引启动会变慢首次登录后项目搜索可能暂时不可用。一般只在索引损坏、升级异常或清理空间时才删。3mkdir D:\sonarqube\sonarqube_extensions对应容器路径/opt/sonarqube/extensions存什么你自己安装的插件比如汉化包、语言插件上传的自定义规则、质量配置等能不能删别随便删。删了插件就没了SonarQube 可能缺少必要的语言支持或功能。如果因为插件导致启动失败可以进这个目录的 plugins 子目录删掉问题插件。4mkdir D:\sonarqube\sonarqube_logs对应容器路径/opt/sonarqube/logs存什么SonarQube的运行日志包括sonar.log、web.log、es.log、ce.log等出问题排查时主要靠这些日志能不能删可以删。日志文件删了会自动重新生成。但建议先压缩备份方便后续排查历史问题。③ 创建docker-compose.yml在任意路径下新建文件我放在D:\sonarqube下了写入以下代码version:3.8services:sonarqube:image:sonarqube:community container_name:sonarqube depends_on:-postgres environment:SONAR_JDBC_URL:jdbc:postgresql://postgres:5432/sonarSONAR_JDBC_USERNAME:sonarSONAR_JDBC_PASSWORD:sonar123 ports:-9000:9000volumes:-D:\sonarqube\sonarqube_data:/opt/sonarqube/data-D:\sonarqube\sonarqube_extensions:/opt/sonarqube/extensions-D:\sonarqube\sonarqube_logs:/opt/sonarqube/logs restart:unless-stopped postgres:image:postgres:15container_name:sonarqube_postgres environment:POSTGRES_USER:sonarPOSTGRES_PASSWORD:sonar123POSTGRES_DB:sonar ports:-5432:5432volumes:-D:\sonarqube\postgres_data:/var/lib/postgresql/data restart:unless-stoppedWindows 上 Docker Desktop 默认会把 C 盘共享给容器但D 盘可能默认没有共享需要手动开启。设置方法打开Docker Desktop点击右上角齿轮图标 →Resources→File sharing把D:\或D:\sonarqube加到共享列表里点击Apply然后重启Docker③ 下载 SonarQube和数据库cdD:\sonarqubedockercompose up-d检查状态如图就是安装成功dockerps-a④ 访问http://localhost:9000账号admin密码admin3、创建项目SonarQube页面点击顶部项目点击创建项目选择手动创建三、汉化下载汉化插件之后重启当前的服务Install Pending 卡住网页端触发重启失败直接用命令强制重启即可解决。cdD:\sonarqubedockercompose restart sonarqube四、查看PostgreSQL的图形化工具下载链接https://www.pgadmin.org/download/1、安装一路Next安装即可最后在开始菜单中找到软件打开2、新建并连接数据库一定要在docker中启动数据库才能连接3、创建角色直接用默认的超级管理员权限用户就行也可以创建一个普通的用户4、创建数据库直接用默认的数据库也行也可以创建一个新的数据库五、Sonar-scanner安装官网链接https://docs.sonarsource.com/sonarqube-server/10.8/analyzing-source-code/scanners1、Docker安装镜像docker pull sonarsource/sonar-scanner-cli2、验证是否成功docker images | findstr sonar-scanner-cli六、扫描代码1、拉取源码2、项目根目录新建配置文件文件名固定sonar-project.properties① Java 项目版使用前置先执行mvn clean compile生成target/classes需要覆盖率则执行mvn test jacoco:report# 【通用基础配置 前后端通用】 # SonarQube服务部署地址修改为你的Sonar地址端口sonar.host.urlhttp://127.0.0.1:9000# 身份认证TokenSonar平台个人账号-Security里生成用于上报扫描结果鉴权sonar.login替换为你的Sonar个人访问token# 项目唯一标识整个Sonar服务内不能重复英文/数字/下划线核心区分不同项目sonar.projectKeybackend_xx_server# Sonar网页展示的项目名称可以中文方便辨认sonar.projectNamexx后端服务# 项目版本号迭代新版本时可更新用于追溯不同版本代码质量sonar.projectVersion1.0# 源码编码格式统一UTF-8避免中文注释乱码、解析失败sonar.sourceEncodingUTF-8# 指定需要扫描的源码根目录. 代表当前项目根目录全部扫描sonar.sources.# 【Java后端专属配置】 # 限定仅扫描Java语言关闭多语言识别提升扫描速度sonar.languagejava# 编译后的class文件目录(Maven默认路径)Sonar依靠class做类型推断、精准代码分析必须编译后再扫描sonar.java.binariestarget/classes# 单元测试编译后的class目录用来区分业务代码与测试代码sonar.java.test.binariestarget/test-classes# 指定覆盖率采集工具为Jacoco适配Java单元测试覆盖率统计sonar.java.coveragePluginjacoco# Jacoco生成的覆盖率二进制文件路径Sonar读取后展示单元测试覆盖率sonar.jacoco.reportPathstarget/jacoco.exec# 【过滤配置不需要扫描的目录/文件】 # 排除目录规则xxx/** 代表该文件夹下所有内容全部跳过扫描# 排除打包产物、测试目录、文档、SQL脚本减少无效扫描sonar.exclusionstarget/**,test/**,doc/**,sql/**,*.sql# 白名单指定哪些目录属于单元测试代码测试代码不计入业务代码复杂度、重复率统计sonar.test.inclusionssrc/test/**② React JS/TS 前端版使用前置安装依赖npm install生成覆盖率文件npm run test:coverage# 【通用基础配置 前后端通用】 sonar.host.urlhttp://127.0.0.1:9000sonar.login替换为你的Sonar个人访问tokensonar.projectKeyreact_admin_websonar.projectNameReact前端管理系统sonar.projectVersion1.0sonar.sourceEncodingUTF-8# 前端业务代码统一放在src目录只扫描src避免扫描根目录多余文件sonar.sourcessrc# 【React前端专属配置】 # 开启JSX语法解析Sonar才能识别React标签、组件写法避免误报语法错误sonar.javascript.jsx.supporttrue# TSReact项目开启纯JS项目注释此行即可sonar.typescript.enabledtrue# 自动读取项目根目录的.eslintrc配置本地eslint和Sonar校验规则完全保持一致sonar.javascript.eslint.use.eslintrctrue# 【过滤配置 前端必配防止扫描node_modules卡死】 # 排除依赖包、打包产物、静态资源、配置文件、说明文档千万不要删掉node_modules/**sonar.exclusionsnode_modules/**,dist/**,build/**,public/**,config/**,*.md# 标记哪些文件是单元测试代码sonar.test.inclusionssrc/**/*.test.js,src/**/*.test.tsx,src/**/__tests__/**# Jest/Vitest执行测试后生成的覆盖率文件Sonar读取展示前端单元测试覆盖率sonar.javascript.lcov.reportPathscoverage/lcov.info③ Vue2/Vue3 前端版# 通用基础配置 sonar.host.urlhttp://127.0.0.1:9000sonar.login替换为你的Sonar个人访问tokensonar.projectKeyvue_web_systemsonar.projectNameVue前端管理平台sonar.projectVersion1.0sonar.sourceEncodingUTF-8sonar.sourcessrc# Vue专属配置 # 开启Vue单文件组件解析识别.vue中的template/script/stylesonar.javascript.vue.supporttrue# 复用项目本地eslint配置统一编码规范sonar.javascript.eslint.use.eslintrctrue# 过滤配置 sonar.exclusionsnode_modules/**,dist/**,build/**,public/**,*.md# 识别测试代码目录sonar.test.inclusionstests/**,src/**/*.spec.js# 前端覆盖率文件地址sonar.javascript.lcov.reportPathscoverage/lcov.info④ 前后端混合版本# 基础连接配置sonar.host.urlhttp://127.0.0.1:9000sonar.login替换为你的Sonar个人访问tokensonar.projectKeyfullstack_projectsonar.projectName前后端一体化项目sonar.projectVersion1.0sonar.sourceEncodingUTF-8sonar.sources.# 删掉 sonar.languagexxx自动识别Java/JS/Vue/React多语言# Java编译目录配置sonar.java.binariestarget/classes# 同时支持React JSX Vue解析sonar.javascript.jsx.supporttruesonar.javascript.vue.supporttrue# 读取前端eslint规则sonar.javascript.eslint.use.eslintrctrue# 全局统一排除所有无用目录sonar.exclusionstarget/**,node_modules/**,dist/**,build/**,test/**,*.md# Java覆盖率、前端覆盖率双配置sonar.jacoco.reportPathstarget/jacoco.execsonar.javascript.lcov.reportPathscoverage/lcov.info3、新建环境变量文件.envSONAR_HOST_URLhttp://host.docker.internal:9000SONAR_TOKENsqa_965xxxSONAR_PROJECT_VERSION2026.08-01.gitignore忽略这个环境变量文件SONAR_TOKEN 在Sonarqube网站中进行创建4、添加环境变量① 切换到.env文件所在的目录或者将代码中的.env换为绝对路径执行下面的代码Get-Content .env|ForEach-Object{if($_-match^(.*?)(.*)$){[System.Environment]::SetEnvironmentVariable($matches[1],$matches[2],Process)}}② 验证环境变量是否设置成功$env:SONAR_HOST_URL$env:SONAR_TOKENTips更改环境变量文件后需要重新设置5、上传分析结果-v...把你本地的代码目录挂载到容器里的 /usr/src扫描器会自动读取里面的sonar-project.propertiesdockerrun--rm--env-file.env绝对路径-v被扫描项目的绝对路径:/usr/srcsonarsource/sonar-scanner-cli

相关新闻

AWD攻防赛实战指南:Windows与Linux系统防御技巧

AWD攻防赛实战指南:Windows与Linux系统防御技巧

1. AWD攻防赛基础认知:从规则到实战定位 第一次参加AWD(Attack With Defense)线下攻防赛时,我盯着大屏幕上实时跳动的分数榜完全摸不着头脑。这种赛制与传统CTF最大的区别在于——你不仅要像猎人一样寻找漏洞,还得像建…

2026/10/20 8:26:57 阅读更多 →
PyCharm报错‘系统找不到指定的文件‘全解析与解决方案

PyCharm报错‘系统找不到指定的文件‘全解析与解决方案

1. 问题现象与初步诊断 当你在Pycharm中遇到"系统找不到指定的文件"错误时,通常会在运行、调试或执行某些操作时突然弹出。这个报错看似简单,但实际上可能涉及多种底层原因。根据我多年使用Pycharm的经验,这个错误最常见于以下几种…

2026/10/20 8:51:31 阅读更多 →
IPXWrapper:让经典游戏在Windows 10/11上重获联机生命的三大秘诀

IPXWrapper:让经典游戏在Windows 10/11上重获联机生命的三大秘诀

IPXWrapper:让经典游戏在Windows 10/11上重获联机生命的三大秘诀 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 你是否曾想过重温《红色警戒2》的激烈对战,或是与好友在《暗黑破坏神》中并肩作战&#x…

2026/10/19 16:09:20 阅读更多 →

最新新闻

基于语义向量的名著推荐系统:从协同过滤到Django工程实践

基于语义向量的名著推荐系统:从协同过滤到Django工程实践

1. 为什么经典名著做推荐,比想象中难得多我做在线阅读平台的项目已经有几年了,从资讯流到工具类产品都碰过,但真正让我觉得"推荐系统不是套个协同过滤就能完事"的,恰恰是这个古典名著推荐项目。以前做过的商品推荐、视频…

2026/10/20 17:55:50 阅读更多 →
WorkBuddy链接微信实战:用Webhook将消息流改造成自动化工作流

WorkBuddy链接微信实战:用Webhook将消息流改造成自动化工作流

这个系列写到第七篇,前面几篇已经把 WorkBuddy 的安装部署、任务编排、数据看板这些底层能力聊了不少。但说实话,后台私信里问得最多的,反而是“我的微信能不能接进去”。这其实不奇怪——大部分人日常最高频的信息入口就是微信,工…

2026/10/20 17:55:50 阅读更多 →
小熊派nano环境搭建实战:交叉编译与固件烧录全流程

小熊派nano环境搭建实战:交叉编译与固件烧录全流程

第一次拿到小熊派nano这块板子,很多人的第一反应是先找个教程点个灯。但真走到“点灯”这一步,中间隔着的不是一根杜邦线,而是一整条工具链:电脑上得装对应的交叉编译器,得把官方源码仓库完整克隆到本地,还…

2026/10/20 17:55:49 阅读更多 →
无ESDF的无人机局部规划器EGO-Planner:B样条轨迹优化解析

无ESDF的无人机局部规划器EGO-Planner:B样条轨迹优化解析

1. 这篇论文到底解决了什么问题1.1 传统ESDF为什么会让局部规划器“变重”ESDF是Euclidean Signed Distance Field的缩写,每个体素里存的是它到最近障碍物表面的有符号距离。对于轨迹优化来说,这个东西太好用了:只要查询某个空间点&#xff0…

2026/10/20 17:55:49 阅读更多 →
AI数据安全实战:从投毒、注入到泄露的防御与排查

AI数据安全实战:从投毒、注入到泄露的防御与排查

聊AI人工智能领域的数据安全,很多人的第一反应是权限、加密、备份。但在真实的大模型项目里,这些传统手段往往只是基础,数据泄露真正让人头疼的地方在于:数据一旦进入模型,就很难被"删掉"。模型会记住某些训…

2026/10/20 17:55:49 阅读更多 →
大模型入门必读:从深度学习原理到工程实战的系统书单

大模型入门必读:从深度学习原理到工程实战的系统书单

最近这半年,总有人在后台问我:“我想入门大模型,该看什么书?”老实说,每次被问到这个问题,我都挺为难的。现在网上关于大模型的书单五花八门,有讲算法的、有讲应用的、有讲产业趋势的&#xff0…

2026/10/20 17:54:48 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →