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