SonarQube Skill — 代码质检自动修复

AI探索
2026-05-15 21:09:01
分享

1778850646858.jpg

SonarQube Skill 是一个面向 OpenCode 的代码质检 AI 辅助工具。通过本地 Python 脚本调用 SonarQube Web API,自动推断当前 Git 分支与 pom.xml 项目名,一键查询质量阈状态、核心度量指标、问题列表及规则详情,并尝试自动修复代码问题。

仅通过手动输入 /sonarqube 唤起,不会在编码过程中自动触发。

 

适用场景

  • 当前仅支持 Java Maven 项目结构,SonarQube 项目名称需与 pom.xml 的 artifactId 一致

  • 支持按分支(branch)或 Pull Request 两种维度进行质检分析

  • 适用于 PR 合入前的质量卡控、日常代码巡检、技术债务盘点等场景

1778850695800.jpg

核心能力

能力说明
自动项目识别从 pom.xml 解析 artifactId(跳过 parent,自动去除 -cloud 后缀)
自动分支推断读取当前 Git 分支,自动匹配 SonarQube 对应分支或 PR
一键质检报告report 命令聚合质量阈 + 核心度量 + Top 问题,输出精简 JSON
质量阈检查查询质量门状态及未通过的阈值条件
问题列表查询支持按严重级别、问题类型、状态等过滤
规则详情获取规则描述,自动剥离 HTML 标签,截断至 1500 字符
度量指标获取 Bug 数、漏洞数、异味数、覆盖率、重复率等核心指标
自动代码修复对可自动修复的问题类型(如未使用 import、空 catch 块等)直接修改源文件
三层配置优先级默认配置 → 用户级配置 → 环境变量覆盖


项目结构

sonarqube/
├── config/
│   └── settings.json          # 项目级配置(可覆盖默认 SonarQube 地址和 Token)
├── docs/
│   └── img/                   # 文档图片
├── scripts/
│   ├── config_loader.py       # 配置加载器:默认值 → 用户配置 → 环境变量
│   └── sonar_client.py        # 核心客户端:封装所有 SonarQube Web API 调用
├── SKILL.md                   # Skill 定义文件(OpenCode 工作流描述)
└── README.md                  # 本文件

快速开始

前置条件

  • 项目为 Java Maven 结构,根目录存在 pom.xml

  • 已配置代码仓库(通过 git branch --show-current 获取当前分支)

  • SonarQube 服务可访问,且项目已在该服务上完成过扫描

一键运行

在 OpenCode 对话框中直接输入:

/sonarqube

等价于执行:

python scripts/sonar_client.py report

脚本自动完成以下步骤:

  1. 获取当前 Git 分支

  2. 从 pom.xml 提取 artifactId(跳过  块,去除 -cloud 后缀)作为项目 Key

  3. 查询质量阈状态及失败条件

  4. 获取核心度量指标(Bug、漏洞、异味、覆盖率、重复率)

  5. 拉取 Top 30 问题列表(BLOCKER / CRITICAL / MAJOR,状态 OPEN / CONFIRMED / REOPENED)

  6. 返回精简 JSON 供 AI 分析并尝试自动修复

命令参考

所有命令均通过 scripts/sonar_client.py 执行。

项目信息

python scripts/sonar_client.py project-info

返回当前分支、项目 Key、匹配的 PR ID 及 Dashboard 链接。

一键质检报告(推荐)

# 按分支维度
python scripts/sonar_client.py report --limit 30

# 按 Pull Request 维度
python scripts/sonar_client.py report --mr

# 手动指定项目与分支
python scripts/sonar_client.py report --project my-project --branch feature/xxx

返回 qualityGate(质量阈状态及失败条件)、measures(核心度量)、topIssues(Top 问题列表)。

质量阈查询

python scripts/sonar_client.py qualitygate --project  [--branch ]

返回质量阈整体状态(OK / ERROR)及未通过的具体条件项。

问题列表

python scripts/sonar_client.py issues --project  [--branch ] \
  --severities BLOCKER,CRITICAL,MAJOR \
  --types BUG,VULNERABILITY,CODE_SMELL \
  --statuses OPEN,CONFIRMED,REOPENED \
  --ps 50 --page 1

参数说明默认值
--project项目 Key(必填)
--branch分支名
--severities严重级别BLOCKER,CRITICAL,MAJOR
--types问题类型BUG,VULNERABILITY,CODE_SMELL
--statuses问题状态OPEN,CONFIRMED,REOPENED
--ps每页数量50
--page页码1


每条 issue 仅保留 key / rule / severity / type / component / line / message / status 等精简字段。

规则详情

python scripts/sonar_client.py rule --key java:S1488

返回规则编号、名称、类型、严重级别、语言及清洁版描述(HTML 已剥离,描述截断 1500 字符)。

度量指标

python scripts/sonar_client.py measures --project  [--branch ] \
  --metrics bugs,vulnerabilities,code_smells,coverage,duplicated_lines_density

返回各度量项的当前值。

分支与 PR 列表

# 查看所有分支
python scripts/sonar_client.py branches --project 

# 查看所有 Pull Request
python scripts/sonar_client.py pull-requests --project 

# 匹配当前分支对应的 PR ID
python scripts/sonar_client.py sonar-pr

配置说明

配置加载遵循三层优先级(由低到高):

默认硬编码值  →  config/settings.json  →  ~/.config/opencode/sonar-config.json  →  环境变量

config/settings.json

{ 
    "sonar_endpoint": "https://your-sonarqube.example.com", 
   "sonar_token": "your-sonar-token", 
  "sonar_author": "your-username"
}

环境变量

变量说明
SONAR_BASE_URLSonarQube 服务地址(最高优先级)
SONAR_TOKEN认证 Token(最高优先级)
SONAR_AUTHOR认证用户名


不配置以上任一项时,脚本将使用内置默认值。 若脚本返回 _error: true,请检查 projectKey / branch 参数或网络连通性。

使用流程

Step 1 — 一键质检

/sonarqube

Step 2 — 按需查询规则

对于需要更详细规则说明的问题:

python scripts/sonar_client.py rule --key java:S2095

Step 3 — 定位并修复代码

AI 根据 issue 的 component(文件路径)和 line(行号)精确定位代码位置,结合规则描述选择修复策略。

修复前会自动读取源文件上下文,修复后建议本地编译验证。

Step 4 — 输出质检报告

AI 最终输出结构化报告,格式如下:

## 质量阈: 通过 / 未通过 | 失败项: xxx
## 核心指标: Bug x | 漏洞 x | 异味 x | 覆盖率 x% | 重复率 x%
## 已修复 x 个 | 待人工确认 x 个

实际效果

在对话框中输入 /sonarqube 修复质检问题,Skill 会自行分析并修复当前代码:

1778850733279.png

自动修复能力

可自动修复

问题类型示例规则修复方式
未使用的 importjava:S1128删除多余 import 语句
空 catch 块java:S1166添加日志或注释说明
== 比较字符串java:S4973替换为 .equals()
资源未关闭java:S2095添加 try-with-resources
魔法数字java:S109提取为命名常量
命名不规范java:S00114按规范重命名


需人工确认

问题类型原因
架构调整涉及模块拆分、依赖重组
复杂逻辑重构涉及多文件、业务流程
业务理解相关需要领域知识判断


注意事项

  • 脚本输出为纯 JSON,可直接在自动化流程中解析使用

  • report 和 issues 命令已对响应做精简过滤,降低 token 消耗

  • rule 命令返回的描述已剥离 HTML 标签,最大 1500 字符

  • HTTP 请求内置自动重试机制(最多 3 次,502/503/504 时指数退避)

  • 部分子命令的结果已缓存(如 Git 分支、pom.xml 解析),避免重复开销

  • 所有 API 调用必须通过 scripts/sonar_client.py 执行,不要手工构造 HTTP 请求

 

The End
免责声明:本文系转载,版权归原作者所有;旨在传递信息,不代表本站观点和立场。