GitHub Actions集成SonarQube无法获取projectKey报错排查
问题根因分析
两个报错的关联逻辑很明确:
- 日志里的Spring Bean依赖加载失败不是项目引入Spring框架导致的:SonarQube扫描器内部用Spring容器管理自身组件,必填配置缺失时容器初始化链路中断,就会抛出这类连锁错误,和业务项目的依赖没有关系。
- sonar.projectKey读取失败是配置方式不匹配导致,核心错误有2处:
- 使用的
sonarsource/sonarqube-scan-action是独立的Sonar Scanner CLI扫描器,默认不会读取Gradle配置文件里定义的sonarqube参数,写在build.gradle中的sonar.projectKey根本没有被扫描器加载。 - Gradle配置中把
sonar.projectBaseDir设置为src属于错误配置,该参数默认应指向项目根目录,设置为src会导致扫描器路径解析异常。
- 使用的
修复方案
两种方案二选一即可:
方案1:保留sonarqube-scan-action,直接在工作流传入扫描参数
这种方式不需要依赖Gradle插件,直接给扫描action传入必填参数即可,修正后的build.yaml配置如下:
on: push: branches: - master pull_request: types: [opened, synchronize, reopened] name: NotificationApi Build jobs: sonarqube: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: SonarQube Scan uses: sonarsource/sonarqube-scan-action@master env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} with: args: > -Dsonar.projectKey=NotificationApi -Dsonar.projectBaseDir=.
注意:如果选择该方案,可以删除
build.gradle里的sonarqube配置块,这部分配置不会被CLI扫描器读取。
方案2:通过Gradle SonarQube插件跑扫描,复用build.gradle中的配置
这种方式可以直接读取Gradle中定义的sonar参数,需要调整工作流,增加JDK、Gradle运行环境的准备步骤,修正后的build.yaml配置如下:
on: push: branches: - master pull_request: types: [opened, synchronize, reopened] name: NotificationApi Build jobs: sonarqube: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up JDK 11 uses: actions/setup-java@v3 with: java-version: '11' distribution: 'temurin' - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Run SonarQube Scan via Gradle run: ./gradlew sonarqube env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
同时修正build.gradle中错误的sonar.projectBaseDir配置:
sonarqube { properties { property("sonar.projectKey", "NotificationApi") property("sonar.projectBaseDir", ".") } }
效果说明
配置修正后重新运行工作流,Spring依赖报错会随着sonar.projectKey参数正常加载自动消失,扫描流程可正常执行。
内容的提问来源于stack exchange,提问作者MrAndre
相关产品推荐
相关产品推荐

