Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
159 changes: 95 additions & 64 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,94 @@
# 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.

parameters:

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

- name: upload
# The pool image to use.
- name: image
type: string
default: $(ci_var_uploadTestResult)

- name: poolName
# The agent pool name.
- name: pool
type: string
default: $(defaultHostedPoolName)

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

- name: downloadArtifactsSteps
type: stepList
default: []
# Array of target frameworks to process code coverage for:
#
# e.g. [net462, net8.0, net9.0]
#
- name: targetFrameworks
type: object

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

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

variables:
uploadTestResult: ${{ parameters.upload }}
pool:
name: ${{ parameters.pool }}
${{ if eq(parameters.pool, 'Azure Pipelines') }}:
vmImage: ${{ parameters.image }}
${{ else }}:
demands:
- imageOverride -equals ${{ parameters.image }}

pool:
name: '${{ parameters.poolName }}'
vmImage: ${{ parameters.image }}
variables:
netFxDir: $(Build.SourcesDirectory)\coverageNetFx
netCoreDir: $(Build.SourcesDirectory)\coverageNetCore

steps:

# We don't need the source code for this job, so suppress checkout.
- checkout: none

- ${{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'

- ${{ parameters.downloadArtifactsSteps }}
- 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') }}:
targetPath: $(netFxDir)
${{ else }}:
targetPath: $(netCoreDir)

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

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

- pwsh: |
dotnet tool install --global dotnet-coverage
- pwsh: Get-ChildItem $(netCoreDir) -Recurse -File -Filter *.coverage
displayName: '[Debug] List coverageNetCore files'

- pwsh: |
function MergeFiles {
param(
[string]$InputDirectoryPath,
Expand Down Expand Up @@ -103,39 +130,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 +167,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)}}:
- 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
18 changes: 4 additions & 14 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 @@ -161,16 +158,9 @@ stages:
- template: common/templates/jobs/ci-code-coverage-job.yml@self
parameters:
debug: ${{ parameters.debug }}
downloadArtifactsSteps:
- ${{ 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'
image: ADO-MMS22-CodeCov
pool: ${{ parameters.defaultPoolName }}
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