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
疑问
是否存在遗漏的配置?该扫描变更文件的方式是否正确?
解答
一、扫描变更文件的方式不正确
- 差异对比目标错误:
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%,}) - 路径处理隐患:如果变更文件包含空格,当前脚本会导致路径被错误拆分;需确保生成的
src_file_paths中所有路径都是相对于sonar-scanner执行目录的有效相对路径。
二、Sonar PR分析配置存在遗漏
PR参数不完整:SonarQube 9.x针对Gerrit PR分析,需补充以下参数:
-Dsonar.pullrequest.provider=gerrit同时,
sonar.pullrequest.branch应使用GERRIT_CHANGE_BRANCH而非GERRIT_REFSPEC,因为GERRIT_REFSPEC是Gerrit内部的变更引用格式,不符合SonarQube对分支名的要求。排除规则与扫描路径冲突:检查
src_file_paths中的文件是否被sonar.exclusions规则命中(比如.tf文件、test目录下的文件),可临时注释sonar.exclusions测试是否能扫描到文件。语言插件与配置缺失:当前配置禁用了C/C++/Objective-C,但如果项目是其他语言(如Java、Python),需确保SonarQube已安装对应语言插件,必要时配置文件后缀(例如Python项目需
sonar.python.file.suffixes=.py)。SCM依赖问题:PR分析依赖SCM信息识别变更文件,确保Jenkins节点的git环境能正常访问仓库,且SonarQube服务器可获取SCM数据。
三、Jenkins插件配置需完善
- 插件兼容性:确认Sonar Gerrit插件版本与SonarQube 9.2.4兼容,版本不匹配可能导致分析结果无法同步。
sonarToGerrit配置不完整:当前Jenkinsfile中的sonarToGerrit缺少必要参数(如serverName、projectKey等),需补充完整以确保能正确连接SonarQube并获取分析结果。
内容的提问来源于stack exchange,提问作者AhmFM
相关产品推荐
相关产品推荐

