Azure Pipelines获取代码行数与覆盖率并推送至网站求助
Azure Pipelines:代码行数与覆盖率数据推送及兼容问题解决
一、修复.NET 7下Coverlet代码覆盖率兼容报错
你的配置存在两个核心问题导致.NET 5兼容报错:
- 目标框架版本占位符
netcoreappX.Y未替换为实际的.NET 7版本net7.0 - 重复执行代码覆盖率收集(DotNetCLI test已集成收集逻辑,无需单独安装coverlet.console)
修改后的YAML配置:
- stage: 'Test' displayName: 'Test stage' jobs: - job: 'TestWithCodeCoverage' displayName: 'Test with Code Coverage' steps: - task: DotNetCoreCLI@2 inputs: command: 'test' projects: '**/*.csproj' arguments: '--configuration $(buildConfiguration) /p:CollectCoverage=true /p:CoverletOutput=$(Agent.TempDirectory)/coverage/ /p:CoverletOutputFormat=cobertura' publishTestResults: true testRunTitle: 'Code Coverage' displayName: 'Run Tests & Collect Coverage' - task: PublishCodeCoverageResults@1 displayName: 'Publish Code Coverage Results' inputs: codeCoverageTool: 'Cobertura' summaryFileLocation: '$(Agent.TempDirectory)/coverage/**/*.cobertura.xml' reportDirectory: '$(Build.SourcesDirectory)/CodeCoverageReports'
说明:
- 直接通过DotNetCLI的test命令集成coverlet,避免版本冲突
- 指定
CoverletOutput到Agent临时目录,确保后续能正确定位报告文件 - 需确保测试项目的目标框架为
net7.0,与配置匹配
二、代码行数与覆盖率数据推送方案
1. 代码行数数据捕获与推送
修改PowerShell步骤,将行数存入管道变量并直接推送至网站API:
- powershell: | $loc = Get-ChildItem -Recurse -File -Path $(System.DefaultWorkingDirectory) -Include *.cs,*.vb,*.js,*.ts,*.html,*.css,*.scss,*.json | Get-Content | Measure-Object -Line $totalLines = $loc.Lines # 将行数设置为管道变量,供后续步骤复用 Write-Host "##vso[task.setvariable variable=TotalLinesOfCode;isOutput=true]$totalLines" # 推送至网站API $body = @{ buildId = "$(Build.BuildId)" totalLines = $totalLines } | ConvertTo-Json Invoke-RestMethod -Uri "你的网站API地址" -Method Post -Body $body -ContentType "application/json" displayName: 'Count & Push Lines of Code' condition: succeeded()
2. 代码覆盖率数据捕获与推送
解决兼容问题后,解析cobertura.xml提取覆盖率数据并推送:
- powershell: | # 定位生成的cobertura报告文件 $coverageFile = Get-ChildItem -Path $(Agent.TempDirectory)/coverage -Name "*.cobertura.xml" -Recurse | Select-Object -First 1 $coveragePath = Join-Path $(Agent.TempDirectory)/coverage $coverageFile # 解析XML获取行覆盖率百分比 $xml = [xml](Get-Content $coveragePath) $lineCoverage = $xml.coverage.'line-rate' * 100 $formattedCoverage = [math]::Round($lineCoverage, 2) # 推送至网站API $body = @{ buildId = "$(Build.BuildId)" lineCoverage = $formattedCoverage } | ConvertTo-Json Invoke-RestMethod -Uri "你的网站API地址" -Method Post -Body $body -ContentType "application/json" displayName: 'Extract & Push Code Coverage' condition: succeeded() dependsOn: 'Run Tests & Collect Coverage'
备选方案:利用Azure DevOps API统一拉取数据
如果需要从API批量获取数据,可在流水线完成后调用以下接口:
- 代码行数:在流水线中将行数存入构建自定义属性,通过
Builds - GetAPI获取 - 代码覆盖率:通过
Code Coverage - Get Coverage DataAPI获取已发布的报告数据
调用时需使用Azure DevOps个人访问令牌(PAT)授权。
内容的提问来源于stack exchange,提问作者user22722316
相关产品推荐
相关产品推荐

