Go项目基础扫描需先运行测试生成coverage.out,再用sonar-go转为coverage.xml并配置sonar.coverage.jacoco.xmlReportPaths;sonar.sources须明确指定子目录如api,pkg,cmd,避免设为.导致误扫;分支覆盖率恒为0属Go生态限制。

Go项目怎么配置sonar-scanner执行基础扫描
SonarQube 本身不直接编译或运行 Go 代码,它依赖 sonar-scanner 收集源码、覆盖率、测试结果等元数据。Go 项目必须先自行构建(可选)、运行测试并生成覆盖率报告,再交由 sonar-scanner 提交分析。
关键前提是:Go 源码需保留完整目录结构(不能是 go build -o 后的二进制),且 sonar-project.properties 中指定的 sonar.sources 必须指向实际 .go 文件所在路径(如 ./cmd, ./internal)。
-
sonar.language不再推荐显式设置(SonarQube 10+ 自动识别 Go) - 必须设置
sonar.go.tests.reportPaths指向go test -json输出的 JSON 文件(如report.json) - 覆盖率需用
go test -coverprofile=coverage.out生成,再转为 SonarQube 能读的格式(通常用sonar-go插件自带的sonar-go工具或gocov转换)
怎么生成符合 SonarQube 要求的 Go 覆盖率报告
SonarQube 原生不接受 coverage.out,必须转换为 lcov 或 sonar-generic-coverage 格式。最稳妥方式是用官方推荐的 sonar-go 工具(由 SonarSource 维护):
go install github.com/sonarqube-community/sonar-go@latest
然后在项目根目录执行:
立即学习“go语言免费学习笔记(深入)”;
go test -coverprofile=coverage.out ./...<br>sonar-go -coverprofile=coverage.out -output=coverage.xml
最后在 sonar-project.properties 中配置:
-
sonar.coverage.jacoco.xmlReportPaths=coverage.xml(注意:虽然叫 jacoco,但sonar-go输出的 XML 兼容该字段) - 若用
gocov+gocov-xml,输出的是标准 XML,同样填入sonar.coverage.jacoco.xmlReportPaths - 跳过
go tool cover -func文本输出——SonarQube 不解析它
CI 流水线里怎么避免 sonar-scanner 报 “No files nor directories matching”
这个错误几乎都源于路径配置错位。常见于 CI 环境(如 GitHub Actions、GitLab CI)中工作目录与 sonar-project.properties 中路径不一致。
- 确认
sonar.sources是相对路径,且相对于sonar-scanner当前执行目录(不是 GOPATH 或 module root) - 在 CI 脚本中加一步
ls -R | head -20查看实际文件树,比对着写sonar.sources - 如果项目含多个 module(如
api/,pkg/),不要设sonar.sources=.—— 它会扫到go.mod和 vendor,触发误报;应明确列出子目录:sonar.sources=api,pkg,cmd - Docker 化运行
sonar-scanner时,确保 volume 挂载正确,且WORKDIR与配置路径匹配
为什么 Go 单元测试通过了,但 SonarQube 显示 0% 分支覆盖率
根本原因是:SonarQube 的分支覆盖率(Branch Coverage)依赖测试运行时的「条件跳转轨迹」,而 Go 默认的 go test -cover 只提供语句覆盖率(Statement Coverage)。两者指标不同,不能混用。
-
sonar-go工具目前**不支持提取 Go 的分支覆盖数据**(Go 编译器未暴露足够信息),所以无论你怎么跑测试,Branch Coverage在 SonarQube 中始终显示 0% - 这不是配置错误,是 Go 生态和 SonarQube 插件的能力边界——接受它,专注提升
Line Coverage和Condition Coverage(后者需用sonar-gov0.4+ 配合-covermode=count) - 若强行追求分支覆盖数字,只能切换工具链(如用
gotestsum+codecov),但无法对接 SonarQube 的质量门禁
真正容易被忽略的是:Go module 的 replace 语句、vendor 目录、以及 build tags(如 //go:build !windows)会导致部分文件在扫描时被跳过,却不在日志里显式提示——建议在扫描前加 go list -f '{{.Dir}}' ./... 确认实际参与构建的包路径。


















