Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 86 additions & 67 deletions eng/pipelines/common/templates/jobs/ci-code-coverage-job.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,67 +3,82 @@
# The .NET Foundation licenses this file to you under the MIT license. #
# See the LICENSE file in the project root for more information. #
#################################################################################

# This job processes code coverage reports generated during test runs,
# merges them, generates code coverage reports, publishes them to the
# pipeline, and uploads them to CodeCov.
Comment thread
paulmedynski marked this conversation as resolved.

parameters:

# True to include debug steps.
- name: debug
type: boolean
default: false

- name: upload
type: string
default: $(ci_var_uploadTestResult)
Comment thread
paulmedynski marked this conversation as resolved.

- name: poolName
type: string
default: $(defaultHostedPoolName)
# Array of target frameworks to process code coverage for:
#
# e.g. [net462, net8.0, net9.0]
#
- name: targetFrameworks
type: object

- name: image
type: string
default: 'windows-2022'

- name: downloadArtifactsSteps
type: stepList
default: []
# True to upload code coverage results to CodeCov.
- name: upload
type: boolean
default: true

jobs:
- job: CodeCoverage
displayName: 'Merge Code Coverage'

variables:
uploadTestResult: ${{ parameters.upload }}
displayName: Publish Code Coverage

pool:
name: '${{ parameters.poolName }}'
vmImage: ${{ parameters.image }}
name: Azure Pipelines
vmImage: windows-2022

steps:
variables:
netFxDir: $(Build.SourcesDirectory)\coverageNetFx
netCoreDir: $(Build.SourcesDirectory)\coverageNetCore

# We don't need the source code for this job, so suppress checkout.
- checkout: none
Comment thread
paulmedynski marked this conversation as resolved.
steps:

- ${{if eq(parameters.debug, true)}}:
- pwsh: |
Get-ChildItem env: | Sort-Object Name
displayName: 'List Environment Variables [debug]'
- pwsh: Get-Volume
displayName: '[Debug] Show Disk Usage'

- pwsh: 'Get-ChildItem env: | Sort-Object Name'
displayName: '[Debug] List Environment Variables'

- template: ../steps/ensure-dotnet-version.yml@self
parameters:
packageType: 'sdk'
version: '10.0'
packageType: sdk
version: '9.0'

- pwsh: |
dotnet tool install --global dotnet-coverage
dotnet tool install --global dotnet-reportgenerator-globaltool
displayName: Install dotnet tools

- ${{ each targetFramework in parameters.targetFrameworks }}:
- task: DownloadPipelineArtifact@2
displayName: 'Download Coverage Reports [${{ targetFramework }}]'
inputs:
itemPattern: '**\${{ targetFramework }}*'
${{ if startsWith(targetFramework, 'net4') }}:
Comment thread
paulmedynski marked this conversation as resolved.
targetPath: $(netFxDir)
${{ else }}:
targetPath: $(netCoreDir)

- ${{ parameters.downloadArtifactsSteps }}
- ${{if eq(parameters.debug, true)}}:
- pwsh: Get-Volume
displayName: '[Debug] Show Disk Usage'

- ${{ if eq(parameters.debug, true)}}:
- pwsh: |
Get-ChildItem $(Build.SourcesDirectory)\coverageNetFx\ -Recurse -File -Filter *.coverage
displayName: 'List coverageNetFx files [debug]'
- pwsh: Get-ChildItem $(netFxDir) -Recurse -File -Filter *.coverage
displayName: '[Debug] List coverageNetFx files'

- pwsh: |
Get-ChildItem $(Build.SourcesDirectory)\coverageNetCore\ -Recurse -File -Filter *.coverage
displayName: 'List coverageNetCore files [debug]'
- pwsh: Get-ChildItem $(netCoreDir) -Recurse -File -Filter *.coverage
displayName: '[Debug] List coverageNetCore files'

- pwsh: |
dotnet tool install --global dotnet-coverage

function MergeFiles {
param(
[string]$InputDirectoryPath,
Expand Down Expand Up @@ -103,39 +118,35 @@ jobs:
}
}

MergeFiles -InputDirectoryPath "$(Build.SourcesDirectory)\coverageNetFx\" -OutputDirectoryName "coverageNetFxXml"
MergeFiles -InputDirectoryPath "$(Build.SourcesDirectory)\coverageNetCore\" -OutputDirectoryName "coverageNetCoreXml"
MergeFiles -InputDirectoryPath "$(netFxDir)" -OutputDirectoryName "coverageNetFxXml"
MergeFiles -InputDirectoryPath "$(netCoreDir)" -OutputDirectoryName "coverageNetCoreXml"

# dir coverageNetFxXml\
# dir coverageNetCoreXml\

Write-Host "Clean up disk ... [removing coverageNetFx & coverageNetCore]"

Remove-Item $(Build.SourcesDirectory)\coverageNetFx -Recurse -Force
Remove-Item $(Build.SourcesDirectory)\coverageNetCore -Recurse -Force
Write-Host "Removing original coverage files..."
Remove-Item $(netFxDir) -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item $(netCoreDir) -Recurse -Force -ErrorAction SilentlyContinue
displayName: Convert coverage files to xml

displayName: 'Convert coverage files to xml'
- ${{if eq(parameters.debug, true)}}:
- pwsh: Get-Volume
displayName: '[Debug] Show Disk Usage'

- ${{ if eq(parameters.debug, true)}}:
- pwsh: |
dir coverageNetFxXml\
dir coverageNetCoreXml\
displayName: 'List converted files [debug]'
displayName: '[Debug] List converted files'

- pwsh: |
dotnet tool install dotnet-reportgenerator-globaltool --tool-path tools

$jobs = @()
$jobs += Start-ThreadJob -ScriptBlock {
& tools\reportgenerator "-reports:coverageNetFxXml\*.coveragexml" "-targetdir:coveragereportNetFx" "-reporttypes:Cobertura;" "-assemblyfilters:+microsoft.data.sqlclient.dll" "-sourcedirs:$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\netfx\src;$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\src" "-classfilters:+Microsoft.Data.*"
& reportgenerator "-reports:coverageNetFxXml\*.coveragexml" "-targetdir:coveragereportNetFx" "-reporttypes:Cobertura;" "-assemblyfilters:+microsoft.data.sqlclient.dll" "-sourcedirs:$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\netfx\src;$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\src" "-classfilters:+Microsoft.Data.*"
}

$jobs += Start-ThreadJob -ScriptBlock {
& tools\reportgenerator "-reports:coverageNetCoreXml\*.coveragexml" "-targetdir:coveragereportAddOns" "-reporttypes:Cobertura;" "-assemblyfilters:+microsoft.data.sqlclient.alwaysencrypted.azurekeyvaultprovider.dll" "-sourcedirs:$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\add-ons\AzureKeyVaultProvider" "-classfilters:+Microsoft.Data.*"
& reportgenerator "-reports:coverageNetCoreXml\*.coveragexml" "-targetdir:coveragereportNetCore" "-reporttypes:Cobertura;" "-assemblyfilters:+microsoft.data.sqlclient.dll" "-sourcedirs:$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\netcore\src;$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\src" "-classfilters:+Microsoft.Data.*"
}

$jobs += Start-ThreadJob -ScriptBlock {
& tools\reportgenerator "-reports:coverageNetCoreXml\*.coveragexml" "-targetdir:coveragereportNetCore" "-reporttypes:Cobertura;" "-assemblyfilters:+microsoft.data.sqlclient.dll" "-sourcedirs:$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\netcore\src;$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\src" "-classfilters:+Microsoft.Data.*"
& reportgenerator "-reports:coverageNetCoreXml\*.coveragexml" "-targetdir:coveragereportAddOns" "-reporttypes:Cobertura;" "-assemblyfilters:+microsoft.data.sqlclient.alwaysencrypted.azurekeyvaultprovider.dll" "-sourcedirs:$(Build.SourcesDirectory)\src\Microsoft.Data.SqlClient\add-ons\AzureKeyVaultProvider" "-classfilters:+Microsoft.Data.*"
}

Write-Host "Running ReportGenerator..."
Expand All @@ -144,20 +155,28 @@ jobs:
foreach ($job in $jobs) {
Receive-Job -Job $job -Wait -AutoRemoveJob
}
displayName: 'Run ReportGenerator'

Write-Host "Removing merged XML files..."
Remove-Item coverageNetFxXml -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item coverageNetCoreXml -Recurse -Force -ErrorAction SilentlyContinue
displayName: Run ReportGenerator

- ${{if eq(parameters.debug, true)}}:
- pwsh: Get-Volume
displayName: '[Debug] Show Disk Usage'

- task: PublishCodeCoverageResults@2
displayName: 'Publish code coverage from netcore'
displayName: Publish code coverage results
inputs:
summaryFileLocation: '*\Cobertura.xml'

- pwsh: |
#download Codecov CLI
$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest -Uri https://cli.codecov.io/latest/windows/codecov.exe -Outfile codecov.exe

./codecov --verbose upload-process --fail-on-error -t $(CODECOV_TOKEN) -f "coveragereportNetFx\Cobertura.xml" -F netfx
./codecov --verbose upload-process --fail-on-error -t $(CODECOV_TOKEN) -f "coveragereportNetCore\Cobertura.xml" -F netcore
./codecov --verbose upload-process --fail-on-error -t $(CODECOV_TOKEN) -f "coveragereportAddOns\Cobertura.xml" -F addons
displayName: 'Upload to CodeCov'
condition: and(succeeded(), eq(variables['uploadTestResult'], 'true'))
- ${{if eq(parameters.upload, true)}}:
Comment thread
paulmedynski marked this conversation as resolved.
- pwsh: |
#download Codecov CLI
$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest -Uri https://cli.codecov.io/latest/windows/codecov.exe -Outfile codecov.exe
./codecov --verbose upload-process --fail-on-error -t $(CODECOV_TOKEN) -f "coveragereportNetFx\Cobertura.xml" -F netfx
./codecov --verbose upload-process --fail-on-error -t $(CODECOV_TOKEN) -f "coveragereportNetCore\Cobertura.xml" -F netcore
./codecov --verbose upload-process --fail-on-error -t $(CODECOV_TOKEN) -f "coveragereportAddOns\Cobertura.xml" -F addons
displayName: Upload to CodeCov
20 changes: 5 additions & 15 deletions eng/pipelines/dotnet-sqlclient-ci-core.yml
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,6 @@ variables:
- name: artifactName
value: Artifacts

- name: defaultHostedPoolName
value: 'Azure Pipelines'

stages:
- stage: build_nugets
displayName: 'Build NuGet Packages'
Expand Down Expand Up @@ -160,17 +157,10 @@ stages:
postTestJobs:
- template: common/templates/jobs/ci-code-coverage-job.yml@self
parameters:
debug: ${{ parameters.debug }}
downloadArtifactsSteps:
Comment thread
paulmedynski marked this conversation as resolved.
- ${{ each targetFramework in parameters.codeCovTargetFrameworks }}:
- task: DownloadPipelineArtifact@2
displayName: 'Download Coverage Reports [${{ targetFramework }}]'
inputs:
itemPattern: '**\${{ targetFramework }}*'
${{ if contains(targetFramework, 'net4') }}:
targetPath: '$(Build.SourcesDirectory)\coverageNetFx'
${{ else }}:
targetPath: '$(Build.SourcesDirectory)\coverageNetCore'
# TODO(ADO-40602): Revert to the parameter once the issue is fixed.
debug: true
# debug: ${{ parameters.debug }}
Comment thread
paulmedynski marked this conversation as resolved.
Outdated
targetFrameworks: ${{ parameters.codeCovTargetFrameworks }}

# test stages configurations
# self hosted SQL Server on Windows
Expand Down Expand Up @@ -524,7 +514,7 @@ stages:

# Self hosted SQL Server on Mac
mac_sql_22:
pool: $(defaultHostedPoolName)
pool: Azure Pipelines
hostedPool: true
images:
MacOSLatest_Sql22: macos-latest
Expand Down
Loading