NX monorepo下配置SonarCloud分析及GitHub Actions按需运行问题
NX Monorepo 多Angular项目/库的SonarCloud差异化分析方案
1. SonarCloud 按项目/库分别分析配置
- 首先在SonarCloud控制台为仓库下每一个需要分析的应用、库分别创建独立的Sonar子项目,记录每个子项目的项目密钥(sonar.projectKey)和组织密钥(sonar.organization)
- 关闭SonarCloud对应仓库的自动扫描功能,避免全局扫描结果和单项目扫描结果冲突
- 为每个NX项目的根目录新增专属
sonar-project.properties配置文件,示例路径如apps/admin/sonar-project.properties、libs/ui/sonar-project.properties,配置参考:
sonar.projectKey=你的对应Sonar子项目密钥 sonar.organization=你的Sonar组织密钥 sonar.projectName=该项目/库在SonarCloud中的展示名称 sonar.sources=src sonar.host.url=https://sonarcloud.io sonar.javascript.lcov.reportPaths=coverage/[替换为当前项目的路径]/lcov.info sonar.typescript.tsconfigPath=tsconfig.json
- NX仓库根目录不要放置全局sonar配置文件,避免优先级冲突。
2. GitHub Actions 仅分析变更项目的配置
核心逻辑复用NX原生的affected能力识别变更项目,无需自行实现文件diff逻辑:
- 第一步在GitHub仓库的Secrets配置页添加
SONAR_TOKEN,值为SonarCloud生成的全局访问令牌,需确保该令牌有权限访问所有你创建的Sonar子项目 - 新增GitHub Actions workflow文件,路径为
.github/workflows/sonar-affected-analysis.yml,配置参考:
name: SonarCloud 变更项目分析 on: push: branches: [ main ] # 替换为你的主分支名 pull_request: types: [opened, synchronize, reopened] jobs: sonar-analysis: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # 必须拉取全量提交历史,NX才能正确计算变更范围 - uses: actions/setup-node@v4 with: node-version: 20 # 替换为你项目使用的Node版本 cache: 'npm' - run: npm ci # 仅为变更的项目生成测试覆盖率报告,按需调整test的参数 - run: npx nx affected --target=test --code-coverage --skip-nx-cache - name: 执行变更项目Sonar扫描 run: | # 获取所有变更的项目名列表 AFFECTED_PROJECTS=$(npx nx show projects --affected --json | jq -r '.[]') for PROJECT in $AFFECTED_PROJECTS do # 获取项目对应的根目录路径 PROJECT_ROOT=$(npx nx show project $PROJECT --json | jq -r '.root') echo "正在扫描项目:$PROJECT,路径:$PROJECT_ROOT" # 进入对应项目目录执行扫描 cd $PROJECT_ROOT npx sonar-scanner -Dsonar.token=${{ secrets.SONAR_TOKEN }} cd - done
可选优化配置
如果NX版本≥16,可以直接给所有项目添加统一的sonar执行target,简化CI逻辑:
- 在NX根目录的
nx.json中添加target配置:
{ "targetDefaults": { "sonar": { "executor": "nx:run-commands", "options": { "command": "sonar-scanner -Dsonar.token=$SONAR_TOKEN", "cwd": "{projectRoot}" }, "dependsOn": ["test"] } } }
- 此时CI中的扫描步骤可以直接简化为一行命令:
npx nx affected --target=sonar --skip-nx-cache
内容的提问来源于stack exchange,提问作者aneeshere
相关产品推荐
相关产品推荐

