- script: |
git config --global http.https://dev.azure.com/<company>/.extraheader "AUTHORIZATION: bearer $(System.AccessToken)"
# Now fetch the PR source branch using the token
git fetch origin $(System.PullRequest.SourceBranch):$(System.PullRequest.SourceBranch)
git checkout $(System.PullRequest.SourceBranch)
displayName: 'Fetch and Checkout PR Source Branch'
env:
# This exposes the system access token to the script
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- script: |
git checkout $(System.PullRequest.SourceBranch)
displayName: 'Checkout PR Source Branch'
- task: DotNetCoreCLI@2
displayName: New Manifest for tool
inputs:
command: custom
custom: 'new '
arguments: tool-manifest
- task: PowerShell@2
displayName: Set the prereleaseVersionNumber variable value
inputs:
targetType: 'inline'
script: |
[string] $dateTime = (Get-Date -Format 'yyyyMMddTHHmmss')
[string] $prereleaseVersionNumber = "$(stableVersionNumber)-$(Build.SourceVersion)"
Write-Host "Setting the prerelease version number variable to '$prereleaseVersionNumber'."
Write-Host "##vso[task.setvariable variable=prereleaseVersionNumber]$prereleaseVersionNumber"
- task: PowerShell@2
displayName: Set the versionNumber to the stable or prerelease version number based on if the 'main' branch is being built or not
inputs:
targetType: 'inline'
script: |
[bool] $isMainBranch = $$(isMainBranch)
[string] $versionNumber = "$(prereleaseVersionNumber)"
if ($isMainBranch)
{
$versionNumber = "$(stableVersionNumber)"
}
Write-Host "Setting the version number to use to '$versionNumber'."
Write-Host "##vso[task.setvariable variable=versionNumber]$versionNumber"
- task: PowerShell@2
displayName: Set the name of the build (i.e. the Build.BuildNumber)
inputs:
targetType: 'inline'
script: |
[string] $buildName = "$(versionNumber)_$(Build.SourceBranchName)"
Write-Host "Setting the name of the build to '$buildName'."
Write-Host "##vso[build.updatebuildnumber]$buildName"
- task: NuGetToolInstaller@1
displayName: 'Install NuGet 5.8'
inputs:
versionSpec: '5.8.x'
- task: NuGetCommand@2
displayName: 'Restore packages using NuGet'
inputs:
restoreSolution: '**/*.csproj'
- task: UseDotNet@2
displayName: Use .NET 6.0
inputs:
packageType: 'sdk'
version: '6.0.x'
- task: DotNetCoreCLI@2
displayName: 'Add Coverlet.msbuild package'
inputs:
command: 'custom'
custom: 'add'
projects: '$(Build.SourcesDirectory)/Virtue/Virtue.API/Virtue.API.csproj'
arguments: 'package coverlet.msbuild'
- task: DotNetCoreCLI@2
displayName: 'dotnet restore Virtue.API'
inputs:
command: 'restore'
projects: '$(Build.SourcesDirectory)/Virtue/Virtue.API/Virtue.API.csproj'
includeNuGetOrg: true
noCache: true
- task: SonarCloudPrepare@1
inputs:
SonarCloud: 'SonarCloud Service Connection'
organization: '<company_name>'
scannerMode: 'MSBuild'
projectKey: 'dotnet'
projectName: 'Dotnet'
extraProperties: |
sonar.projectBaseDir=$(Build.SourcesDirectory)
sonar.exclusions=**/README.md,**/obj/**,**/*.dll
sonar.inclusions=**/*.csproj
sonar.cs.vscoveragexml.reportsPaths=$(Build.SourcesDirectory)/**/coverage.xml
sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/**/coverage.opencover.xml
sonar.cs.vstest.reportsPaths=$(Agent.TempDirectory)/*.trx
sonar.pullrequest.key=$(System.PullRequest.PullRequestId)
sonar.pullrequest.branch=$(System.PullRequest.SourceBranch)
sonar.pullrequest.base=$(System.PullRequest.TargetBranch)
- task: DotNetCoreCLI@2
inputs:
command: 'build'
projects: '**/*.csproj'
arguments: '--configuration $(buildConfiguration)'
- task: DotNetCoreCLI@2
displayName: 'Test ...'
inputs:
command: test
projects: '**/*Tests/*.csproj'
arguments: '--configuration $(BuildConfiguration) /p:CollectCoverage=true /p:CoverletOutputFormat=opencover --logger trx'
testRunTitle: 'dotnet test'
- task: PublishCodeCoverageResults@1
inputs:
codeCoverageTool: 'Cobertura'
summaryFileLocation: '$(Build.SourcesDirectory)/**/coverage.opencover.xml'
reportDirectory: '$(Build.SourcesDirectory)/**/coverage/'
- script: |
dotnet tool install -g dotnet-reportgenerator-globaltool
reportgenerator -reports:$(Build.SourcesDirectory)/**/coverage.opencover.xml -targetdir:$(Build.SourcesDirectory)/CoverageReport -reporttypes:"HtmlInline;Cobertura"
displayName: 'Generate Coverage Report'
- task: PublishTestResults@2
displayName: "Publish Test Results"
inputs:
testResultsFormat: VSTest
testResultsFiles: "$(Build.SourcesDirectory)/**.*trx"
mergeTestResults: true
condition: succeededOrFailed()
- task: SonarCloudAnalyze@1
inputs:
sonar.analysis.level: 'DOTNET'
- task: SonarCloudPublish@1
inputs:
pollingTimeoutSec: '300'
为什么在拉取请求时,它没有从我的功能分支中获取新行。我可以看到零覆盖率并且没有新线路。请帮我。它处于高优先级。
我尝试了很多方法,但没有成功。我想使用触发我的天蓝色管道的拉取请求来分析新的代码行
收集代码覆盖率需要了解一些要点:
默认情况下,测试和代码覆盖率的输出结果文件生成在“
$(Agent.TempDirectory)
”目录下,而不是“$(Build.SourcesDirectory)
”目录下。
如果您想指定不同的输出目录,在 dotnet test
命令上,您可以配置如下参数。
dotnet test --results-directory "$(Build.SourcesDirectory)/TestResults" -p:CollectCoverage=true -p:CoverletOutput="$(Build.SourcesDirectory)/TestResults/coverage/" . . .
如果您的项目是.NET 5或更高版本,建议在测试项目中使用NuGet包“
coverlet.collector
”而不是“coverlet.msbuild
”。
在管道中,您可以如下进行配置。 dotnet test任务默认会自动发布测试结果(
publishTestResults: true
),如果您想使用单独的PublishTestResults
任务来发布测试结果,可以设置“publishTestResults: false
”。然后在 dotnet test任务后面添加一个
PublishTestResults
任务。
steps:
. . .
- task: DotNetCoreCLI@2
displayName: 'dotnet test'
inputs:
command: test
projects: path/to/test/project.csproj
arguments: '--no-build -c $(buildConfiguration) -p:CollectCoverage=true --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=cobertura'
- task: PublishCodeCoverageResults@2
displayName: 'Publish code coverage results'
inputs:
summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml'
pathToSources: '$(Agent.TempDirectory)/**/coverage.cobertura.xml'