diff --git a/eng/pipelines/common/templates/jobs/ci-code-coverage-job.yml b/eng/pipelines/common/templates/jobs/ci-code-coverage-job.yml index 51e309ce13..f246d803cc 100644 --- a/eng/pipelines/common/templates/jobs/ci-code-coverage-job.yml +++ b/eng/pipelines/common/templates/jobs/ci-code-coverage-job.yml @@ -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, @@ -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..." @@ -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 diff --git a/eng/pipelines/dotnet-sqlclient-ci-core.yml b/eng/pipelines/dotnet-sqlclient-ci-core.yml index 23605e3e22..8a32af9d06 100644 --- a/eng/pipelines/dotnet-sqlclient-ci-core.yml +++ b/eng/pipelines/dotnet-sqlclient-ci-core.yml @@ -96,9 +96,6 @@ variables: - name: artifactName value: Artifacts - - name: defaultHostedPoolName - value: 'Azure Pipelines' - stages: - stage: build_nugets displayName: 'Build NuGet Packages' @@ -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 @@ -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