Azure DevOps Linux代理上.Net项目SonarCloud代码覆盖率报告失效
解决Azure DevOps Linux代理下SonarCloud无法获取代码覆盖率的问题
核心问题是Linux环境中,Azure DevOps默认代码覆盖率收集器生成的报告格式、路径与SonarCloud的默认预期不匹配,需要手动生成兼容的覆盖率报告并明确指定给SonarCloud。以下是具体修改方案:
1. 修改测试任务,生成SonarCloud兼容的覆盖率报告
替换原有--collect "Code Coverage"参数,改用coverlet生成opencover格式的报告(SonarCloud原生支持),同时指定统一的输出路径:
单元测试任务修改后:
- task: DotNetCoreCLI@2 displayName: Run Unit Tests inputs: command: 'test' arguments: '--no-build --configuration $(BuildConfiguration) /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:CoverletOutput=$(Build.SourcesDirectory)/coverage/unit/' projects: 'src/PDO.Unit.Tests/PDO.Unit.Tests.csproj' testRunTitle: 'Net Core Tests'
集成测试任务修改后:
- task: DotNetCoreCLI@2 displayName: Run Integration Tests inputs: command: 'test' arguments: '--no-build --configuration $(BuildConfiguration) /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:CoverletOutput=$(Build.SourcesDirectory)/coverage/integration/' projects: 'src/PDO.Integration.Tests/PDO.Integration.Tests.csproj' testRunTitle: 'Net Core Tests' env: TestSettings:ConnectionStringFormat: $(TestSettings:ConnectionStringFormat)
2. 在SonarCloudPrepare任务中添加覆盖率报告路径配置
更新SonarCloudPrepare@1任务,通过extraProperties明确告诉SonarCloud去哪里找覆盖率报告:
- task: SonarCloudPrepare@1 displayName: 'Prepare analysis on SonarCloud' inputs: SonarCloud: 'SonarCloud' organization: '***' scannerMode: 'CLI' configMode: 'manual' cliProjectKey: '***' cliProjectName: '***' cliSources: '.' extraProperties: | sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/coverage/**/coverage.opencover.xml
修改说明
- 采用coverlet生成opencover格式报告,规避了Linux与Windows平台下默认覆盖率报告的格式差异;
- 统一指定报告输出目录,配合SonarCloud的通配符路径匹配,确保所有测试生成的报告都能被扫描到;
- 无需额外安装coverlet,DotNetCoreCLI的test命令会自动引用
coverlet.msbuild包完成报告生成。
内容的提问来源于stack exchange,提问作者cdiazal
相关产品推荐
相关产品推荐

