You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sonar Gerrit插件PR分析无代码及度量值问题排查

问题背景与现象

我们已本地部署企业版SonarQube(SQ),并配置Sonar Gerrit插件进行拉取请求(PR)分析。当前遇到的问题:

  • 分析结果仅显示PASSED,无任何代码或度量值
  • SonarQube GUI的代码标签页提示No code files were found for analysis

尝试的变更文件扫描脚本

我们尝试通过以下脚本仅扫描变更文件,不确定该方式是否正确:

project_files=$(git diff @ @~1 --name-only | awk '{printf "%s,", $1}')
src_file_paths=$(echo ${project_files%,})
-Dsonar.sources=${src_file_paths}

相关Sonar配置

sonar.host.url=http://sonar.team.com:9000

sonar.login=${env.SONAR_TOKEN}
sonar.projectKey=Services
sonar.sourceEncoding=UTF-8
sonar.scm.exclusions.disabled=true
sonar.test.inclusions=src/**/test/**/*
# Exclude test subdirectories from source scope
sonar.exclusions=src/**/test/*,src/**/test/**/*,src/**/**/*.tf
sonar.c.file.suffixes=-
sonar.cpp.file.suffixes=-
sonar.objc.file.suffixes=-

版本信息

20:18:48.812 INFO: SonarScanner 4.7.0.2747
20:18:48.812 INFO: Java 11.0.14.1 Eclipse Adoptium (64-bit)
20:18:48.812 INFO: Linux 5.4.0-65-generic amd64
20:18:48.941 DEBUG: keyStore is : 
20:18:48.941 DEBUG: keyStore type is : pkcs12
20:18:53.185 INFO: Analyzing on SonarQube server 9.2.4

Jenkinsfile配置片段

withSonarQubeEnv('sonar.team.com') {
    sh '''
    src/jenkins/ci/pba.sh
    '''.stripIndent()
}
sonarToGerrit(
    inspectionConfig: [
            analysisStrategy: pullRequest()
    ],

sonar-scanner执行命令

sonar-scanner -X \
    -Dsonar.pullrequest.key="${GERRIT_CHANGE_NUMBER}-${GERRIT_PATCHSET_NUMBER}" \
    -Dsonar.pullrequest.base="${GERRIT_BRANCH}" \
    -Dsonar.pullrequest.branch="${GERRIT_REFSPEC}" \
    -Dsonar.sources=${src_file_paths} \
    -Dsonar.exclusions=**/*.tf,src/**/test/*,src/**/test/**/*,src/**/**/*.tf
疑问

是否存在遗漏的配置?该扫描变更文件的方式是否正确?

解答

一、扫描变更文件的方式不正确

  1. 差异对比目标错误:git diff @ @~1仅对比当前提交与本地仓库的上一个提交,而Gerrit PR分析需要对比的是当前变更集与目标分支(GERRIT_BRANCH)的差异。正确的脚本应该先拉取目标分支再对比:
    git fetch origin ${GERRIT_BRANCH}
    project_files=$(git diff origin/${GERRIT_BRANCH} HEAD --name-only | awk '{printf "%s,", $1}')
    src_file_paths=$(echo ${project_files%,})
    
  2. 路径处理隐患:如果变更文件包含空格,当前脚本会导致路径被错误拆分;需确保生成的src_file_paths中所有路径都是相对于sonar-scanner执行目录的有效相对路径。

二、Sonar PR分析配置存在遗漏

  1. PR参数不完整:SonarQube 9.x针对Gerrit PR分析,需补充以下参数:

    -Dsonar.pullrequest.provider=gerrit
    

    同时,sonar.pullrequest.branch应使用GERRIT_CHANGE_BRANCH而非GERRIT_REFSPEC,因为GERRIT_REFSPEC是Gerrit内部的变更引用格式,不符合SonarQube对分支名的要求。

  2. 排除规则与扫描路径冲突:检查src_file_paths中的文件是否被sonar.exclusions规则命中(比如.tf文件、test目录下的文件),可临时注释sonar.exclusions测试是否能扫描到文件。

  3. 语言插件与配置缺失:当前配置禁用了C/C++/Objective-C,但如果项目是其他语言(如Java、Python),需确保SonarQube已安装对应语言插件,必要时配置文件后缀(例如Python项目需sonar.python.file.suffixes=.py)。

  4. SCM依赖问题:PR分析依赖SCM信息识别变更文件,确保Jenkins节点的git环境能正常访问仓库,且SonarQube服务器可获取SCM数据。

三、Jenkins插件配置需完善

  1. 插件兼容性:确认Sonar Gerrit插件版本与SonarQube 9.2.4兼容,版本不匹配可能导致分析结果无法同步。
  2. sonarToGerrit配置不完整:当前Jenkinsfile中的sonarToGerrit缺少必要参数(如serverName、projectKey等),需补充完整以确保能正确连接SonarQube并获取分析结果。

内容的提问来源于stack exchange,提问作者AhmFM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:18:33