From 5f25ecdd704c2b2ddcdab839ce20f270d2b1c4bc Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 25 Jul 2025 14:26:42 +0000
Subject: [PATCH 1/9] Initial plan
From 04613322532a672ad41bc7dd2c63ffa92abbcfa1 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 25 Jul 2025 14:33:20 +0000
Subject: [PATCH 2/9] Initial analysis of CI refactoring requirements
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
---
restore.cmd | 0
1 file changed, 0 insertions(+), 0 deletions(-)
mode change 100644 => 100755 restore.cmd
diff --git a/restore.cmd b/restore.cmd
old mode 100644
new mode 100755
From 2348b760f5d816865f571291a282aa27e43200b6 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 25 Jul 2025 14:41:43 +0000
Subject: [PATCH 3/9] Implement CI refactoring with separate build and test
stages
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
---
azure-pipelines.yml | 491 +++++++++++++++++++++++++++++++++++++-------
1 file changed, 414 insertions(+), 77 deletions(-)
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 710fce4b49..66730e6fd2 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -42,32 +42,103 @@ variables:
stages:
-- stage: build
- displayName: Build
+- stage: BuildAndPack
+ displayName: Build and Pack
jobs:
+ - template: /eng/common/templates/jobs/jobs.yml
+ parameters:
+ enableMicrobuild: true
+ enablePublishBuildArtifacts: true
+ enablePublishTestResults: false
+ enablePublishBuildAssets: true
+ enablePublishUsingPipelines: true
+ enableTelemetry: true
+ jobs:
+ - job: Windows_BuildAndPack
+ displayName: Windows Build and Pack
+ timeoutInMinutes: 90
+ pool:
+ name: NetCore-Public
+ demands: ImageOverride -equals windows.vs2022preview.amd64.open
+ steps:
+ - task: PowerShell@2
+ displayName: 'Install Windows SDK'
+ inputs:
+ targetType: filePath
+ filePath: './eng/install-windows-sdk.ps1'
+ failOnStderr: true
+ showWarnings: true
+
+ - task: PowerShell@2
+ displayName: 'Install procdump'
+ inputs:
+ targetType: filePath
+ filePath: ./eng/install-procdump.ps1
+ failOnStderr: true
+ showWarnings: true
+
+ - task: PowerShell@2
+ displayName: 'Install Access Database Engine'
+ inputs:
+ targetType: filePath
+ filePath: ./eng/install-access-database-engine.ps1
+ failOnStderr: true
+ showWarnings: true
+
+ # Build only production projects, no tests
+ - script: eng\common\CIBuild.cmd
+ -configuration Release
+ -prepareMachine
+ /p:Publish=false
+ /p:Test=false
+ name: BuildAndPack
+ displayName: Build and Pack
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish NuGet packages for testing'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+ ArtifactName: 'NuGetPackages'
+ condition: always()
+- stage: TestWindows
+ displayName: Test Windows
+ dependsOn: BuildAndPack
+ jobs:
- template: /eng/common/templates/jobs/jobs.yml
parameters:
enableMicrobuild: true
enablePublishBuildArtifacts: true
enablePublishTestResults: true
testResultsFormat: 'vstest'
- enablePublishBuildAssets: true
- enablePublishUsingPipelines: true
+ enablePublishBuildAssets: false
+ enablePublishUsingPipelines: false
enableTelemetry: true
jobs:
- - job: Windows
+ - job: Windows_Debug
+ displayName: Windows Debug Tests
timeoutInMinutes: 90
pool:
name: NetCore-Public
demands: ImageOverride -equals windows.vs2022preview.amd64.open
- strategy:
- matrix:
- Release:
- _BuildConfig: Release
- Debug:
- _BuildConfig: Debug
steps:
+ - task: DownloadBuildArtifacts@0
+ displayName: 'Download NuGet packages'
+ inputs:
+ buildType: 'current'
+ downloadType: 'single'
+ artifactName: 'NuGetPackages'
+ downloadPath: '$(System.DefaultWorkingDirectory)'
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+
+ - task: CopyFiles@2
+ displayName: 'Copy packages to expected location'
+ inputs:
+ SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
+ Contents: '**'
+ TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+
- task: PowerShell@2
displayName: 'Install Windows SDK'
inputs:
@@ -83,6 +154,7 @@ stages:
filePath: ./eng/install-procdump.ps1
failOnStderr: true
showWarnings: true
+
- task: PowerShell@2
displayName: 'Enable local dumps'
inputs:
@@ -92,6 +164,7 @@ stages:
Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" -Name "DumpFolder" -Value "$(Build.SourcesDirectory)\artifacts\CrashDumps" -PropertyType ExpandString -Force
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" -Name "DumpCount" -Value 10 -PropertyType DWord -Force
+
- task: PowerShell@2
displayName: 'Install Access Database Engine'
inputs:
@@ -100,28 +173,18 @@ stages:
failOnStderr: true
showWarnings: true
+ # Build test projects only
- script: eng\common\CIBuild.cmd
- -configuration $(_BuildConfig)
+ -configuration Debug
-prepareMachine
/p:Publish=false
/p:Test=false
/p:FastAcceptanceTest=true
name: Build
- displayName: Build
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish NuGet packages'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/packages/$(_BuildConfig)/Shipping'
- ArtifactName: '$(Agent.Os)_$(Agent.JobName)_Attempt$(System.JobAttempt)'
- condition: always()
+ displayName: Build Test Projects
- ${{ if eq(parameters.SkipTests, False) }}:
-
- # Because the build step is using -ci flag, restore is done in a local .packages directory.
- # We need to pass NUGET_PACKAGES so that when dotnet test is doing evaluation phase on the projects, it can resolve .props/.targets from packages and import them.
- # Otherwise, props/targets are not imported. It's important that they are imported so that IsTestingPlatformApplication ends up being set.
- - script: dotnet test -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
+ - script: dotnet test -c Debug --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Debug\TestStep.binlog --no-progress
name: Test
displayName: Test
env:
@@ -132,14 +195,14 @@ stages:
- task: PublishBuildArtifacts@1
displayName: 'Publish Test Results folders'
inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
- ArtifactName: TestResults_Windows_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Debug'
+ ArtifactName: TestResults_Windows_Debug_Attempt$(System.JobAttempt)
condition: always()
- task: CopyFiles@2
displayName: 'Copy binlogs'
inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/$(_BuildConfig)/testsuite'
+ SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Debug/testsuite'
Contents: |
**/*.binlog
TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
@@ -149,57 +212,247 @@ stages:
displayName: 'Publish integration tests binlogs'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_Windows_Binlogs_$(_BuildConfig)
+ ArtifactName: Integration_Tests_Windows_Debug_Binlogs
condition: always()
# Upload code coverage to codecov.io
- script: dotnet msbuild -restore
eng/CodeCoverage.proj
- /p:Configuration=$(_BuildConfig)
- /bl:$(BUILD.SOURCESDIRECTORY)\artifacts\log\$(_BuildConfig)\CodeCoverage.binlog
+ /p:Configuration=Debug
+ /bl:$(BUILD.SOURCESDIRECTORY)\artifacts\log\Debug\CodeCoverage.binlog
displayName: Upload coverage to codecov.io
- condition: and(succeeded(), eq(variables._BuildConfig, 'Debug'))
+ condition: succeeded()
- task: PublishBuildArtifacts@1
displayName: 'Publish local dumps'
inputs:
PathtoPublish: '$(Build.SourcesDirectory)/artifacts/CrashDumps'
- ArtifactName: TestResults_Windows_$(_BuildConfig)
+ ArtifactName: TestResults_Windows_Debug
condition: failed()
- - job: Linux
+ - job: Windows_Release
+ displayName: Windows Release Tests
+ timeoutInMinutes: 90
+ pool:
+ name: NetCore-Public
+ demands: ImageOverride -equals windows.vs2022preview.amd64.open
+ steps:
+ - task: DownloadBuildArtifacts@0
+ displayName: 'Download NuGet packages'
+ inputs:
+ buildType: 'current'
+ downloadType: 'single'
+ artifactName: 'NuGetPackages'
+ downloadPath: '$(System.DefaultWorkingDirectory)'
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+
+ - task: CopyFiles@2
+ displayName: 'Copy packages to expected location'
+ inputs:
+ SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
+ Contents: '**'
+ TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+
+ - task: PowerShell@2
+ displayName: 'Install Windows SDK'
+ inputs:
+ targetType: filePath
+ filePath: './eng/install-windows-sdk.ps1'
+ failOnStderr: true
+ showWarnings: true
+
+ - task: PowerShell@2
+ displayName: 'Install procdump'
+ inputs:
+ targetType: filePath
+ filePath: ./eng/install-procdump.ps1
+ failOnStderr: true
+ showWarnings: true
+
+ - task: PowerShell@2
+ displayName: 'Enable local dumps'
+ inputs:
+ targetType: 'inline'
+ script: |
+ New-Item -Path $(Build.SourcesDirectory)\artifacts\CrashDumps -ItemType Directory -Force
+ Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
+ New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" -Name "DumpFolder" -Value "$(Build.SourcesDirectory)\artifacts\CrashDumps" -PropertyType ExpandString -Force
+ New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" -Name "DumpCount" -Value 10 -PropertyType DWord -Force
+
+ - task: PowerShell@2
+ displayName: 'Install Access Database Engine'
+ inputs:
+ targetType: filePath
+ filePath: ./eng/install-access-database-engine.ps1
+ failOnStderr: true
+ showWarnings: true
+
+ # Build test projects only
+ - script: eng\common\CIBuild.cmd
+ -configuration Release
+ -prepareMachine
+ /p:Publish=false
+ /p:Test=false
+ /p:FastAcceptanceTest=true
+ name: Build
+ displayName: Build Test Projects
+
+ - ${{ if eq(parameters.SkipTests, False) }}:
+ - script: dotnet test -c Release --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Release\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Release'
+ ArtifactName: TestResults_Windows_Release_Attempt$(System.JobAttempt)
+ condition: always()
+
+ - task: CopyFiles@2
+ displayName: 'Copy binlogs'
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Release/testsuite'
+ Contents: |
+ **/*.binlog
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
+ condition: always()
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish integration tests binlogs'
+ inputs:
+ PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
+ ArtifactName: Integration_Tests_Windows_Release_Binlogs
+ condition: always()
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish local dumps'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/CrashDumps'
+ ArtifactName: TestResults_Windows_Release
+ condition: failed()
+
+- stage: TestLinux
+ displayName: Test Linux
+ dependsOn: BuildAndPack
+ jobs:
+ - template: /eng/common/templates/jobs/jobs.yml
+ parameters:
+ enableMicrobuild: true
+ enablePublishBuildArtifacts: true
+ enablePublishTestResults: true
+ testResultsFormat: 'vstest'
+ enablePublishBuildAssets: false
+ enablePublishUsingPipelines: false
+ enableTelemetry: true
+ jobs:
+ - job: Linux_Debug
+ displayName: Linux Debug Tests
timeoutInMinutes: 90
pool:
name: NetCore-Public
demands: ImageOverride -equals build.ubuntu.2004.amd64.open
- strategy:
- matrix:
- Release:
- _BuildConfig: Release
- Debug:
- _BuildConfig: Debug
steps:
+ - task: DownloadBuildArtifacts@0
+ displayName: 'Download NuGet packages'
+ inputs:
+ buildType: 'current'
+ downloadType: 'single'
+ artifactName: 'NuGetPackages'
+ downloadPath: '$(System.DefaultWorkingDirectory)'
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+
+ - task: CopyFiles@2
+ displayName: 'Copy packages to expected location'
+ inputs:
+ SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
+ Contents: '**'
+ TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+
+ # Build test projects only
- script: eng/common/cibuild.sh
- -configuration $(_BuildConfig)
+ -configuration Debug
-prepareMachine
/p:Test=false
/p:Publish=false
/p:NonWindowsBuild=true
/p:FastAcceptanceTest=true
- displayName: Build
+ displayName: Build Test Projects
- - task: PublishBuildArtifacts@1
- displayName: 'Publish NuGet packages'
+ - ${{ if eq(parameters.SkipTests, False) }}:
+ - script: dotnet test --solution NonWindowsTests.slnf -c Debug --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Debug\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Debug'
+ ArtifactName: TestResults_Linux_Debug_Attempt$(System.JobAttempt)
+ condition: always()
+
+ - task: CopyFiles@2
+ displayName: 'Copy binlogs'
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Debug/testsuite'
+ Contents: |
+ **/*.binlog
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
+ condition: always()
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish integration tests binlogs'
+ inputs:
+ PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
+ ArtifactName: Integration_Tests_Linux_Debug_Binlogs
+ condition: always()
+
+ - job: Linux_Release
+ displayName: Linux Release Tests
+ timeoutInMinutes: 90
+ pool:
+ name: NetCore-Public
+ demands: ImageOverride -equals build.ubuntu.2004.amd64.open
+ steps:
+ - task: DownloadBuildArtifacts@0
+ displayName: 'Download NuGet packages'
inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/packages/$(_BuildConfig)/Shipping'
- ArtifactName: '$(Agent.Os)_$(Agent.JobName)_Attempt$(System.JobAttempt)'
- condition: always()
+ buildType: 'current'
+ downloadType: 'single'
+ artifactName: 'NuGetPackages'
+ downloadPath: '$(System.DefaultWorkingDirectory)'
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+
+ - task: CopyFiles@2
+ displayName: 'Copy packages to expected location'
+ inputs:
+ SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
+ Contents: '**'
+ TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+
+ # Build test projects only
+ - script: eng/common/cibuild.sh
+ -configuration Release
+ -prepareMachine
+ /p:Test=false
+ /p:Publish=false
+ /p:NonWindowsBuild=true
+ /p:FastAcceptanceTest=true
+ displayName: Build Test Projects
- ${{ if eq(parameters.SkipTests, False) }}:
- # Because the build step is using -ci flag, restore is done in a local .packages directory.
- # We need to pass NUGET_PACKAGES so that when dotnet test is doing evaluation phase on the projects, it can resolve .props/.targets from packages and import them.
- # Otherwise, props/targets are not imported. It's important that they are imported so that IsTestingPlatformApplication ends up being set.
- - script: dotnet test --solution NonWindowsTests.slnf -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
+ - script: dotnet test --solution NonWindowsTests.slnf -c Release --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Release\TestStep.binlog --no-progress
name: Test
displayName: Test
env:
@@ -210,14 +463,14 @@ stages:
- task: PublishBuildArtifacts@1
displayName: 'Publish Test Results folders'
inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
- ArtifactName: TestResults_Linux_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Release'
+ ArtifactName: TestResults_Linux_Release_Attempt$(System.JobAttempt)
condition: always()
- task: CopyFiles@2
displayName: 'Copy binlogs'
inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/$(_BuildConfig)/testsuite'
+ SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Release/testsuite'
Contents: |
**/*.binlog
TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
@@ -227,43 +480,127 @@ stages:
displayName: 'Publish integration tests binlogs'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_Linux_Binlogs_$(_BuildConfig)
+ ArtifactName: Integration_Tests_Linux_Release_Binlogs
condition: always()
- - job: MacOS
+- stage: TestMacOS
+ displayName: Test macOS
+ dependsOn: BuildAndPack
+ jobs:
+ - template: /eng/common/templates/jobs/jobs.yml
+ parameters:
+ enableMicrobuild: true
+ enablePublishBuildArtifacts: true
+ enablePublishTestResults: true
+ testResultsFormat: 'vstest'
+ enablePublishBuildAssets: false
+ enablePublishUsingPipelines: false
+ enableTelemetry: true
+ jobs:
+ - job: MacOS_Debug
+ displayName: macOS Debug Tests
timeoutInMinutes: 90
pool:
name: Azure Pipelines
vmImage: macos-latest
os: macOS
- strategy:
- matrix:
- Release:
- _BuildConfig: Release
- Debug:
- _BuildConfig: Debug
steps:
+ - task: DownloadBuildArtifacts@0
+ displayName: 'Download NuGet packages'
+ inputs:
+ buildType: 'current'
+ downloadType: 'single'
+ artifactName: 'NuGetPackages'
+ downloadPath: '$(System.DefaultWorkingDirectory)'
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+
+ - task: CopyFiles@2
+ displayName: 'Copy packages to expected location'
+ inputs:
+ SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
+ Contents: '**'
+ TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+
+ # Build test projects only
- script: eng/common/cibuild.sh
- -configuration $(_BuildConfig)
+ -configuration Debug
-prepareMachine
/p:Test=false
/p:Publish=false
/p:NonWindowsBuild=true
/p:FastAcceptanceTest=true
- displayName: Build
+ displayName: Build Test Projects
- - task: PublishBuildArtifacts@1
- displayName: 'Publish NuGet packages'
+ - ${{ if eq(parameters.SkipTests, False) }}:
+ - script: dotnet test --solution NonWindowsTests.slnf -c Debug --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Debug\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Debug'
+ ArtifactName: TestResults_MacOS_Debug_Attempt$(System.JobAttempt)
+ condition: always()
+
+ - task: CopyFiles@2
+ displayName: 'Copy binlogs'
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Debug/testsuite'
+ Contents: |
+ **/*.binlog
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
+ condition: always()
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish integration tests binlogs'
+ inputs:
+ PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
+ ArtifactName: Integration_Tests_MacOS_Debug_Binlogs
+ condition: always()
+
+ - job: MacOS_Release
+ displayName: macOS Release Tests
+ timeoutInMinutes: 90
+ pool:
+ name: Azure Pipelines
+ vmImage: macos-latest
+ os: macOS
+ steps:
+ - task: DownloadBuildArtifacts@0
+ displayName: 'Download NuGet packages'
inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/packages/$(_BuildConfig)/Shipping'
- ArtifactName: '$(Agent.Os)_$(Agent.JobName)_Attempt$(System.JobAttempt)'
- condition: always()
+ buildType: 'current'
+ downloadType: 'single'
+ artifactName: 'NuGetPackages'
+ downloadPath: '$(System.DefaultWorkingDirectory)'
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+
+ - task: CopyFiles@2
+ displayName: 'Copy packages to expected location'
+ inputs:
+ SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
+ Contents: '**'
+ TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+
+ # Build test projects only
+ - script: eng/common/cibuild.sh
+ -configuration Release
+ -prepareMachine
+ /p:Test=false
+ /p:Publish=false
+ /p:NonWindowsBuild=true
+ /p:FastAcceptanceTest=true
+ displayName: Build Test Projects
- ${{ if eq(parameters.SkipTests, False) }}:
- # Because the build step is using -ci flag, restore is done in a local .packages directory.
- # We need to pass NUGET_PACKAGES so that when dotnet test is doing evaluation phase on the projects, it can resolve .props/.targets from packages and import them.
- # Otherwise, props/targets are not imported. It's important that they are imported so that IsTestingPlatformApplication ends up being set.
- - script: dotnet test --solution NonWindowsTests.slnf -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
+ - script: dotnet test --solution NonWindowsTests.slnf -c Release --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Release\TestStep.binlog --no-progress
name: Test
displayName: Test
env:
@@ -274,14 +611,14 @@ stages:
- task: PublishBuildArtifacts@1
displayName: 'Publish Test Results folders'
inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
- ArtifactName: TestResults_MacOs_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Release'
+ ArtifactName: TestResults_MacOS_Release_Attempt$(System.JobAttempt)
condition: always()
- task: CopyFiles@2
displayName: 'Copy binlogs'
inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/$(_BuildConfig)/testsuite'
+ SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Release/testsuite'
Contents: |
**/*.binlog
TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
@@ -291,5 +628,5 @@ stages:
displayName: 'Publish integration tests binlogs'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_MacOS_Binlogs_$(_BuildConfig)
+ ArtifactName: Integration_Tests_MacOS_Release_Binlogs
condition: always()
From 532d794efea496e9c0187036fc533aab1488b858 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 25 Jul 2025 15:00:49 +0000
Subject: [PATCH 4/9] Move SkipTests conditions to job level in CI pipeline
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
---
azure-pipelines.yml | 428 +++++++++++++++++++++-----------------------
1 file changed, 208 insertions(+), 220 deletions(-)
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 66730e6fd2..3794eec589 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -118,6 +118,7 @@ stages:
- job: Windows_Debug
displayName: Windows Debug Tests
timeoutInMinutes: 90
+ condition: ne('${{ parameters.SkipTests }}', 'True')
pool:
name: NetCore-Public
demands: ImageOverride -equals windows.vs2022preview.amd64.open
@@ -129,7 +130,6 @@ stages:
downloadType: 'single'
artifactName: 'NuGetPackages'
downloadPath: '$(System.DefaultWorkingDirectory)'
- condition: ne('${{ parameters.SkipTests }}', 'True')
- task: CopyFiles@2
displayName: 'Copy packages to expected location'
@@ -137,7 +137,6 @@ stages:
SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
Contents: '**'
TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
- condition: ne('${{ parameters.SkipTests }}', 'True')
- task: PowerShell@2
displayName: 'Install Windows SDK'
@@ -183,56 +182,56 @@ stages:
name: Build
displayName: Build Test Projects
- - ${{ if eq(parameters.SkipTests, False) }}:
- - script: dotnet test -c Debug --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Debug\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Debug'
- ArtifactName: TestResults_Windows_Debug_Attempt$(System.JobAttempt)
- condition: always()
-
- - task: CopyFiles@2
- displayName: 'Copy binlogs'
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Debug/testsuite'
- Contents: |
- **/*.binlog
- TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish integration tests binlogs'
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_Windows_Debug_Binlogs
- condition: always()
-
- # Upload code coverage to codecov.io
- - script: dotnet msbuild -restore
- eng/CodeCoverage.proj
- /p:Configuration=Debug
- /bl:$(BUILD.SOURCESDIRECTORY)\artifacts\log\Debug\CodeCoverage.binlog
- displayName: Upload coverage to codecov.io
- condition: succeeded()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish local dumps'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/CrashDumps'
- ArtifactName: TestResults_Windows_Debug
- condition: failed()
+ - script: dotnet test -c Debug --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Debug\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Debug'
+ ArtifactName: TestResults_Windows_Debug_Attempt$(System.JobAttempt)
+ condition: always()
+
+ - task: CopyFiles@2
+ displayName: 'Copy binlogs'
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Debug/testsuite'
+ Contents: |
+ **/*.binlog
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
+ condition: always()
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish integration tests binlogs'
+ inputs:
+ PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
+ ArtifactName: Integration_Tests_Windows_Debug_Binlogs
+ condition: always()
+
+ # Upload code coverage to codecov.io
+ - script: dotnet msbuild -restore
+ eng/CodeCoverage.proj
+ /p:Configuration=Debug
+ /bl:$(BUILD.SOURCESDIRECTORY)\artifacts\log\Debug\CodeCoverage.binlog
+ displayName: Upload coverage to codecov.io
+ condition: succeeded()
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish local dumps'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/CrashDumps'
+ ArtifactName: TestResults_Windows_Debug
+ condition: failed()
- job: Windows_Release
displayName: Windows Release Tests
timeoutInMinutes: 90
+ condition: ne('${{ parameters.SkipTests }}', 'True')
pool:
name: NetCore-Public
demands: ImageOverride -equals windows.vs2022preview.amd64.open
@@ -244,7 +243,6 @@ stages:
downloadType: 'single'
artifactName: 'NuGetPackages'
downloadPath: '$(System.DefaultWorkingDirectory)'
- condition: ne('${{ parameters.SkipTests }}', 'True')
- task: CopyFiles@2
displayName: 'Copy packages to expected location'
@@ -252,7 +250,6 @@ stages:
SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
Contents: '**'
TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
- condition: ne('${{ parameters.SkipTests }}', 'True')
- task: PowerShell@2
displayName: 'Install Windows SDK'
@@ -298,44 +295,43 @@ stages:
name: Build
displayName: Build Test Projects
- - ${{ if eq(parameters.SkipTests, False) }}:
- - script: dotnet test -c Release --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Release\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Release'
- ArtifactName: TestResults_Windows_Release_Attempt$(System.JobAttempt)
- condition: always()
-
- - task: CopyFiles@2
- displayName: 'Copy binlogs'
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Release/testsuite'
- Contents: |
- **/*.binlog
- TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish integration tests binlogs'
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_Windows_Release_Binlogs
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish local dumps'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/CrashDumps'
- ArtifactName: TestResults_Windows_Release
- condition: failed()
+ - script: dotnet test -c Release --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Release\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Release'
+ ArtifactName: TestResults_Windows_Release_Attempt$(System.JobAttempt)
+ condition: always()
+
+ - task: CopyFiles@2
+ displayName: 'Copy binlogs'
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Release/testsuite'
+ Contents: |
+ **/*.binlog
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
+ condition: always()
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish integration tests binlogs'
+ inputs:
+ PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
+ ArtifactName: Integration_Tests_Windows_Release_Binlogs
+ condition: always()
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish local dumps'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/CrashDumps'
+ ArtifactName: TestResults_Windows_Release
+ condition: failed()
- stage: TestLinux
displayName: Test Linux
@@ -354,6 +350,7 @@ stages:
- job: Linux_Debug
displayName: Linux Debug Tests
timeoutInMinutes: 90
+ condition: ne('${{ parameters.SkipTests }}', 'True')
pool:
name: NetCore-Public
demands: ImageOverride -equals build.ubuntu.2004.amd64.open
@@ -365,7 +362,6 @@ stages:
downloadType: 'single'
artifactName: 'NuGetPackages'
downloadPath: '$(System.DefaultWorkingDirectory)'
- condition: ne('${{ parameters.SkipTests }}', 'True')
- task: CopyFiles@2
displayName: 'Copy packages to expected location'
@@ -373,7 +369,6 @@ stages:
SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
Contents: '**'
TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
- condition: ne('${{ parameters.SkipTests }}', 'True')
# Build test projects only
- script: eng/common/cibuild.sh
@@ -385,41 +380,41 @@ stages:
/p:FastAcceptanceTest=true
displayName: Build Test Projects
- - ${{ if eq(parameters.SkipTests, False) }}:
- - script: dotnet test --solution NonWindowsTests.slnf -c Debug --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Debug\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Debug'
- ArtifactName: TestResults_Linux_Debug_Attempt$(System.JobAttempt)
- condition: always()
-
- - task: CopyFiles@2
- displayName: 'Copy binlogs'
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Debug/testsuite'
- Contents: |
- **/*.binlog
- TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish integration tests binlogs'
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_Linux_Debug_Binlogs
- condition: always()
+ - script: dotnet test --solution NonWindowsTests.slnf -c Debug --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Debug\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Debug'
+ ArtifactName: TestResults_Linux_Debug_Attempt$(System.JobAttempt)
+ condition: always()
+
+ - task: CopyFiles@2
+ displayName: 'Copy binlogs'
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Debug/testsuite'
+ Contents: |
+ **/*.binlog
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
+ condition: always()
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish integration tests binlogs'
+ inputs:
+ PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
+ ArtifactName: Integration_Tests_Linux_Debug_Binlogs
+ condition: always()
- job: Linux_Release
displayName: Linux Release Tests
timeoutInMinutes: 90
+ condition: ne('${{ parameters.SkipTests }}', 'True')
pool:
name: NetCore-Public
demands: ImageOverride -equals build.ubuntu.2004.amd64.open
@@ -431,7 +426,6 @@ stages:
downloadType: 'single'
artifactName: 'NuGetPackages'
downloadPath: '$(System.DefaultWorkingDirectory)'
- condition: ne('${{ parameters.SkipTests }}', 'True')
- task: CopyFiles@2
displayName: 'Copy packages to expected location'
@@ -439,7 +433,6 @@ stages:
SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
Contents: '**'
TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
- condition: ne('${{ parameters.SkipTests }}', 'True')
# Build test projects only
- script: eng/common/cibuild.sh
@@ -451,37 +444,36 @@ stages:
/p:FastAcceptanceTest=true
displayName: Build Test Projects
- - ${{ if eq(parameters.SkipTests, False) }}:
- - script: dotnet test --solution NonWindowsTests.slnf -c Release --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Release\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Release'
- ArtifactName: TestResults_Linux_Release_Attempt$(System.JobAttempt)
- condition: always()
-
- - task: CopyFiles@2
- displayName: 'Copy binlogs'
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Release/testsuite'
- Contents: |
- **/*.binlog
- TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish integration tests binlogs'
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_Linux_Release_Binlogs
- condition: always()
+ - script: dotnet test --solution NonWindowsTests.slnf -c Release --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Release\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Release'
+ ArtifactName: TestResults_Linux_Release_Attempt$(System.JobAttempt)
+ condition: always()
+
+ - task: CopyFiles@2
+ displayName: 'Copy binlogs'
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Release/testsuite'
+ Contents: |
+ **/*.binlog
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
+ condition: always()
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish integration tests binlogs'
+ inputs:
+ PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
+ ArtifactName: Integration_Tests_Linux_Release_Binlogs
+ condition: always()
- stage: TestMacOS
displayName: Test macOS
@@ -500,6 +492,7 @@ stages:
- job: MacOS_Debug
displayName: macOS Debug Tests
timeoutInMinutes: 90
+ condition: ne('${{ parameters.SkipTests }}', 'True')
pool:
name: Azure Pipelines
vmImage: macos-latest
@@ -512,7 +505,6 @@ stages:
downloadType: 'single'
artifactName: 'NuGetPackages'
downloadPath: '$(System.DefaultWorkingDirectory)'
- condition: ne('${{ parameters.SkipTests }}', 'True')
- task: CopyFiles@2
displayName: 'Copy packages to expected location'
@@ -520,7 +512,6 @@ stages:
SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
Contents: '**'
TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
- condition: ne('${{ parameters.SkipTests }}', 'True')
# Build test projects only
- script: eng/common/cibuild.sh
@@ -532,41 +523,41 @@ stages:
/p:FastAcceptanceTest=true
displayName: Build Test Projects
- - ${{ if eq(parameters.SkipTests, False) }}:
- - script: dotnet test --solution NonWindowsTests.slnf -c Debug --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Debug\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Debug'
- ArtifactName: TestResults_MacOS_Debug_Attempt$(System.JobAttempt)
- condition: always()
-
- - task: CopyFiles@2
- displayName: 'Copy binlogs'
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Debug/testsuite'
- Contents: |
- **/*.binlog
- TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish integration tests binlogs'
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_MacOS_Debug_Binlogs
- condition: always()
+ - script: dotnet test --solution NonWindowsTests.slnf -c Debug --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Debug\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Debug'
+ ArtifactName: TestResults_MacOS_Debug_Attempt$(System.JobAttempt)
+ condition: always()
+
+ - task: CopyFiles@2
+ displayName: 'Copy binlogs'
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Debug/testsuite'
+ Contents: |
+ **/*.binlog
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
+ condition: always()
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish integration tests binlogs'
+ inputs:
+ PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
+ ArtifactName: Integration_Tests_MacOS_Debug_Binlogs
+ condition: always()
- job: MacOS_Release
displayName: macOS Release Tests
timeoutInMinutes: 90
+ condition: ne('${{ parameters.SkipTests }}', 'True')
pool:
name: Azure Pipelines
vmImage: macos-latest
@@ -579,7 +570,6 @@ stages:
downloadType: 'single'
artifactName: 'NuGetPackages'
downloadPath: '$(System.DefaultWorkingDirectory)'
- condition: ne('${{ parameters.SkipTests }}', 'True')
- task: CopyFiles@2
displayName: 'Copy packages to expected location'
@@ -587,7 +577,6 @@ stages:
SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
Contents: '**'
TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
- condition: ne('${{ parameters.SkipTests }}', 'True')
# Build test projects only
- script: eng/common/cibuild.sh
@@ -599,34 +588,33 @@ stages:
/p:FastAcceptanceTest=true
displayName: Build Test Projects
- - ${{ if eq(parameters.SkipTests, False) }}:
- - script: dotnet test --solution NonWindowsTests.slnf -c Release --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Release\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Release'
- ArtifactName: TestResults_MacOS_Release_Attempt$(System.JobAttempt)
- condition: always()
-
- - task: CopyFiles@2
- displayName: 'Copy binlogs'
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Release/testsuite'
- Contents: |
- **/*.binlog
- TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish integration tests binlogs'
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_MacOS_Release_Binlogs
- condition: always()
+ - script: dotnet test --solution NonWindowsTests.slnf -c Release --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Release\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Release'
+ ArtifactName: TestResults_MacOS_Release_Attempt$(System.JobAttempt)
+ condition: always()
+
+ - task: CopyFiles@2
+ displayName: 'Copy binlogs'
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Release/testsuite'
+ Contents: |
+ **/*.binlog
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
+ condition: always()
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish integration tests binlogs'
+ inputs:
+ PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
+ ArtifactName: Integration_Tests_MacOS_Release_Binlogs
+ condition: always()
From 577cfd28ed224a3f4ac7d2850fb60f53aa555f50 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 25 Jul 2025 15:36:10 +0000
Subject: [PATCH 5/9] Create parameterized YAML templates and add
ProductsToBuild=tests support
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
---
azure-pipelines.yml | 540 ++----------------------------------
eng/Build.props | 18 ++
eng/test-job-template.yml | 131 +++++++++
eng/test-stage-template.yml | 100 +++++++
eng/windows-setup-steps.yml | 35 +++
5 files changed, 307 insertions(+), 517 deletions(-)
create mode 100644 eng/test-job-template.yml
create mode 100644 eng/test-stage-template.yml
create mode 100644 eng/windows-setup-steps.yml
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 3794eec589..834030bb2b 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -90,6 +90,7 @@ stages:
-configuration Release
-prepareMachine
/p:Publish=false
+ /p:ProductsToBuild=all
/p:Test=false
name: BuildAndPack
displayName: Build and Pack
@@ -101,520 +102,25 @@ stages:
ArtifactName: 'NuGetPackages'
condition: always()
-- stage: TestWindows
- displayName: Test Windows
- dependsOn: BuildAndPack
- jobs:
- - template: /eng/common/templates/jobs/jobs.yml
- parameters:
- enableMicrobuild: true
- enablePublishBuildArtifacts: true
- enablePublishTestResults: true
- testResultsFormat: 'vstest'
- enablePublishBuildAssets: false
- enablePublishUsingPipelines: false
- enableTelemetry: true
- jobs:
- - job: Windows_Debug
- displayName: Windows Debug Tests
- timeoutInMinutes: 90
- condition: ne('${{ parameters.SkipTests }}', 'True')
- pool:
- name: NetCore-Public
- demands: ImageOverride -equals windows.vs2022preview.amd64.open
- steps:
- - task: DownloadBuildArtifacts@0
- displayName: 'Download NuGet packages'
- inputs:
- buildType: 'current'
- downloadType: 'single'
- artifactName: 'NuGetPackages'
- downloadPath: '$(System.DefaultWorkingDirectory)'
-
- - task: CopyFiles@2
- displayName: 'Copy packages to expected location'
- inputs:
- SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
- Contents: '**'
- TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
-
- - task: PowerShell@2
- displayName: 'Install Windows SDK'
- inputs:
- targetType: filePath
- filePath: './eng/install-windows-sdk.ps1'
- failOnStderr: true
- showWarnings: true
-
- - task: PowerShell@2
- displayName: 'Install procdump'
- inputs:
- targetType: filePath
- filePath: ./eng/install-procdump.ps1
- failOnStderr: true
- showWarnings: true
-
- - task: PowerShell@2
- displayName: 'Enable local dumps'
- inputs:
- targetType: 'inline'
- script: |
- New-Item -Path $(Build.SourcesDirectory)\artifacts\CrashDumps -ItemType Directory -Force
- Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
- New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" -Name "DumpFolder" -Value "$(Build.SourcesDirectory)\artifacts\CrashDumps" -PropertyType ExpandString -Force
- New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" -Name "DumpCount" -Value 10 -PropertyType DWord -Force
-
- - task: PowerShell@2
- displayName: 'Install Access Database Engine'
- inputs:
- targetType: filePath
- filePath: ./eng/install-access-database-engine.ps1
- failOnStderr: true
- showWarnings: true
-
- # Build test projects only
- - script: eng\common\CIBuild.cmd
- -configuration Debug
- -prepareMachine
- /p:Publish=false
- /p:Test=false
- /p:FastAcceptanceTest=true
- name: Build
- displayName: Build Test Projects
-
- - script: dotnet test -c Debug --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Debug\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Debug'
- ArtifactName: TestResults_Windows_Debug_Attempt$(System.JobAttempt)
- condition: always()
-
- - task: CopyFiles@2
- displayName: 'Copy binlogs'
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Debug/testsuite'
- Contents: |
- **/*.binlog
- TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish integration tests binlogs'
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_Windows_Debug_Binlogs
- condition: always()
-
- # Upload code coverage to codecov.io
- - script: dotnet msbuild -restore
- eng/CodeCoverage.proj
- /p:Configuration=Debug
- /bl:$(BUILD.SOURCESDIRECTORY)\artifacts\log\Debug\CodeCoverage.binlog
- displayName: Upload coverage to codecov.io
- condition: succeeded()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish local dumps'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/CrashDumps'
- ArtifactName: TestResults_Windows_Debug
- condition: failed()
-
- - job: Windows_Release
- displayName: Windows Release Tests
- timeoutInMinutes: 90
- condition: ne('${{ parameters.SkipTests }}', 'True')
- pool:
- name: NetCore-Public
- demands: ImageOverride -equals windows.vs2022preview.amd64.open
- steps:
- - task: DownloadBuildArtifacts@0
- displayName: 'Download NuGet packages'
- inputs:
- buildType: 'current'
- downloadType: 'single'
- artifactName: 'NuGetPackages'
- downloadPath: '$(System.DefaultWorkingDirectory)'
-
- - task: CopyFiles@2
- displayName: 'Copy packages to expected location'
- inputs:
- SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
- Contents: '**'
- TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
-
- - task: PowerShell@2
- displayName: 'Install Windows SDK'
- inputs:
- targetType: filePath
- filePath: './eng/install-windows-sdk.ps1'
- failOnStderr: true
- showWarnings: true
-
- - task: PowerShell@2
- displayName: 'Install procdump'
- inputs:
- targetType: filePath
- filePath: ./eng/install-procdump.ps1
- failOnStderr: true
- showWarnings: true
-
- - task: PowerShell@2
- displayName: 'Enable local dumps'
- inputs:
- targetType: 'inline'
- script: |
- New-Item -Path $(Build.SourcesDirectory)\artifacts\CrashDumps -ItemType Directory -Force
- Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
- New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" -Name "DumpFolder" -Value "$(Build.SourcesDirectory)\artifacts\CrashDumps" -PropertyType ExpandString -Force
- New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" -Name "DumpCount" -Value 10 -PropertyType DWord -Force
-
- - task: PowerShell@2
- displayName: 'Install Access Database Engine'
- inputs:
- targetType: filePath
- filePath: ./eng/install-access-database-engine.ps1
- failOnStderr: true
- showWarnings: true
-
- # Build test projects only
- - script: eng\common\CIBuild.cmd
- -configuration Release
- -prepareMachine
- /p:Publish=false
- /p:Test=false
- /p:FastAcceptanceTest=true
- name: Build
- displayName: Build Test Projects
-
- - script: dotnet test -c Release --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Release\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Release'
- ArtifactName: TestResults_Windows_Release_Attempt$(System.JobAttempt)
- condition: always()
-
- - task: CopyFiles@2
- displayName: 'Copy binlogs'
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Release/testsuite'
- Contents: |
- **/*.binlog
- TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish integration tests binlogs'
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_Windows_Release_Binlogs
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish local dumps'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/CrashDumps'
- ArtifactName: TestResults_Windows_Release
- condition: failed()
-
-- stage: TestLinux
- displayName: Test Linux
- dependsOn: BuildAndPack
- jobs:
- - template: /eng/common/templates/jobs/jobs.yml
- parameters:
- enableMicrobuild: true
- enablePublishBuildArtifacts: true
- enablePublishTestResults: true
- testResultsFormat: 'vstest'
- enablePublishBuildAssets: false
- enablePublishUsingPipelines: false
- enableTelemetry: true
- jobs:
- - job: Linux_Debug
- displayName: Linux Debug Tests
- timeoutInMinutes: 90
- condition: ne('${{ parameters.SkipTests }}', 'True')
- pool:
- name: NetCore-Public
- demands: ImageOverride -equals build.ubuntu.2004.amd64.open
- steps:
- - task: DownloadBuildArtifacts@0
- displayName: 'Download NuGet packages'
- inputs:
- buildType: 'current'
- downloadType: 'single'
- artifactName: 'NuGetPackages'
- downloadPath: '$(System.DefaultWorkingDirectory)'
-
- - task: CopyFiles@2
- displayName: 'Copy packages to expected location'
- inputs:
- SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
- Contents: '**'
- TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
-
- # Build test projects only
- - script: eng/common/cibuild.sh
- -configuration Debug
- -prepareMachine
- /p:Test=false
- /p:Publish=false
- /p:NonWindowsBuild=true
- /p:FastAcceptanceTest=true
- displayName: Build Test Projects
-
- - script: dotnet test --solution NonWindowsTests.slnf -c Debug --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Debug\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Debug'
- ArtifactName: TestResults_Linux_Debug_Attempt$(System.JobAttempt)
- condition: always()
-
- - task: CopyFiles@2
- displayName: 'Copy binlogs'
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Debug/testsuite'
- Contents: |
- **/*.binlog
- TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish integration tests binlogs'
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_Linux_Debug_Binlogs
- condition: always()
-
- - job: Linux_Release
- displayName: Linux Release Tests
- timeoutInMinutes: 90
- condition: ne('${{ parameters.SkipTests }}', 'True')
- pool:
- name: NetCore-Public
- demands: ImageOverride -equals build.ubuntu.2004.amd64.open
- steps:
- - task: DownloadBuildArtifacts@0
- displayName: 'Download NuGet packages'
- inputs:
- buildType: 'current'
- downloadType: 'single'
- artifactName: 'NuGetPackages'
- downloadPath: '$(System.DefaultWorkingDirectory)'
-
- - task: CopyFiles@2
- displayName: 'Copy packages to expected location'
- inputs:
- SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
- Contents: '**'
- TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
-
- # Build test projects only
- - script: eng/common/cibuild.sh
- -configuration Release
- -prepareMachine
- /p:Test=false
- /p:Publish=false
- /p:NonWindowsBuild=true
- /p:FastAcceptanceTest=true
- displayName: Build Test Projects
-
- - script: dotnet test --solution NonWindowsTests.slnf -c Release --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Release\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Release'
- ArtifactName: TestResults_Linux_Release_Attempt$(System.JobAttempt)
- condition: always()
-
- - task: CopyFiles@2
- displayName: 'Copy binlogs'
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Release/testsuite'
- Contents: |
- **/*.binlog
- TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish integration tests binlogs'
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_Linux_Release_Binlogs
- condition: always()
-
-- stage: TestMacOS
- displayName: Test macOS
- dependsOn: BuildAndPack
- jobs:
- - template: /eng/common/templates/jobs/jobs.yml
- parameters:
- enableMicrobuild: true
- enablePublishBuildArtifacts: true
- enablePublishTestResults: true
- testResultsFormat: 'vstest'
- enablePublishBuildAssets: false
- enablePublishUsingPipelines: false
- enableTelemetry: true
- jobs:
- - job: MacOS_Debug
- displayName: macOS Debug Tests
- timeoutInMinutes: 90
- condition: ne('${{ parameters.SkipTests }}', 'True')
- pool:
- name: Azure Pipelines
- vmImage: macos-latest
- os: macOS
- steps:
- - task: DownloadBuildArtifacts@0
- displayName: 'Download NuGet packages'
- inputs:
- buildType: 'current'
- downloadType: 'single'
- artifactName: 'NuGetPackages'
- downloadPath: '$(System.DefaultWorkingDirectory)'
-
- - task: CopyFiles@2
- displayName: 'Copy packages to expected location'
- inputs:
- SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
- Contents: '**'
- TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
-
- # Build test projects only
- - script: eng/common/cibuild.sh
- -configuration Debug
- -prepareMachine
- /p:Test=false
- /p:Publish=false
- /p:NonWindowsBuild=true
- /p:FastAcceptanceTest=true
- displayName: Build Test Projects
-
- - script: dotnet test --solution NonWindowsTests.slnf -c Debug --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Debug\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Debug'
- ArtifactName: TestResults_MacOS_Debug_Attempt$(System.JobAttempt)
- condition: always()
-
- - task: CopyFiles@2
- displayName: 'Copy binlogs'
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Debug/testsuite'
- Contents: |
- **/*.binlog
- TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish integration tests binlogs'
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_MacOS_Debug_Binlogs
- condition: always()
-
- - job: MacOS_Release
- displayName: macOS Release Tests
- timeoutInMinutes: 90
- condition: ne('${{ parameters.SkipTests }}', 'True')
- pool:
- name: Azure Pipelines
- vmImage: macos-latest
- os: macOS
- steps:
- - task: DownloadBuildArtifacts@0
- displayName: 'Download NuGet packages'
- inputs:
- buildType: 'current'
- downloadType: 'single'
- artifactName: 'NuGetPackages'
- downloadPath: '$(System.DefaultWorkingDirectory)'
-
- - task: CopyFiles@2
- displayName: 'Copy packages to expected location'
- inputs:
- SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
- Contents: '**'
- TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
-
- # Build test projects only
- - script: eng/common/cibuild.sh
- -configuration Release
- -prepareMachine
- /p:Test=false
- /p:Publish=false
- /p:NonWindowsBuild=true
- /p:FastAcceptanceTest=true
- displayName: Build Test Projects
-
- - script: dotnet test --solution NonWindowsTests.slnf -c Release --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\Release\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/Release'
- ArtifactName: TestResults_MacOS_Release_Attempt$(System.JobAttempt)
- condition: always()
-
- - task: CopyFiles@2
- displayName: 'Copy binlogs'
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/Release/testsuite'
- Contents: |
- **/*.binlog
- TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish integration tests binlogs'
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_MacOS_Release_Binlogs
- condition: always()
+- template: /eng/test-stage-template.yml
+ parameters:
+ stageName: TestWindows
+ displayName: Test Windows
+ os: Windows
+ skipTests: ${{ parameters.SkipTests }}
+
+- template: /eng/test-stage-template.yml
+ parameters:
+ stageName: TestLinux
+ displayName: Test Linux
+ os: Linux
+ skipTests: ${{ parameters.SkipTests }}
+ solutionFile: NonWindowsTests.slnf
+
+- template: /eng/test-stage-template.yml
+ parameters:
+ stageName: TestMacOS
+ displayName: Test macOS
+ os: macOS
+ skipTests: ${{ parameters.SkipTests }}
+ solutionFile: NonWindowsTests.slnf
diff --git a/eng/Build.props b/eng/Build.props
index 559d7f3749..b683485b00 100644
--- a/eng/Build.props
+++ b/eng/Build.props
@@ -34,4 +34,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eng/test-job-template.yml b/eng/test-job-template.yml
new file mode 100644
index 0000000000..95e7209466
--- /dev/null
+++ b/eng/test-job-template.yml
@@ -0,0 +1,131 @@
+# Template for test jobs that can be parameterized by OS, configuration, and specific steps
+parameters:
+- name: os
+ type: string
+ values:
+ - Windows
+ - Linux
+ - macOS
+- name: configuration
+ type: string
+ values:
+ - Debug
+ - Release
+- name: pool
+ type: object
+- name: skipTests
+ type: boolean
+ default: false
+- name: solutionFile
+ type: string
+ default: ''
+- name: platformSpecificSteps
+ type: stepList
+ default: []
+
+jobs:
+- job: ${{ parameters.os }}_${{ parameters.configuration }}
+ displayName: ${{ parameters.os }} ${{ parameters.configuration }} Tests
+ timeoutInMinutes: 90
+ condition: ne('${{ parameters.skipTests }}', 'True')
+ pool: ${{ parameters.pool }}
+ steps:
+ - task: DownloadBuildArtifacts@0
+ displayName: 'Download NuGet packages'
+ inputs:
+ buildType: 'current'
+ downloadType: 'single'
+ artifactName: 'NuGetPackages'
+ downloadPath: '$(System.DefaultWorkingDirectory)'
+
+ - task: CopyFiles@2
+ displayName: 'Copy packages to expected location'
+ inputs:
+ SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
+ Contents: '**'
+ TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+
+ # Platform-specific setup steps
+ - ${{ each step in parameters.platformSpecificSteps }}:
+ - ${{ step }}
+
+ # Build test projects only
+ - ${{ if eq(parameters.os, 'Windows') }}:
+ - script: eng\common\CIBuild.cmd
+ -configuration ${{ parameters.configuration }}
+ -prepareMachine
+ /p:Publish=false
+ /p:ProductsToBuild=tests
+ /p:Test=false
+ /p:FastAcceptanceTest=true
+ name: Build
+ displayName: Build Test Projects
+ - ${{ else }}:
+ - script: eng/common/cibuild.sh
+ -configuration ${{ parameters.configuration }}
+ -prepareMachine
+ /p:ProductsToBuild=tests
+ /p:Test=false
+ /p:Publish=false
+ /p:NonWindowsBuild=true
+ /p:FastAcceptanceTest=true
+ displayName: Build Test Projects
+
+ # Run tests
+ - ${{ if eq(parameters.os, 'Windows') }}:
+ - script: dotnet test -c ${{ parameters.configuration }} --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\${{ parameters.configuration }}\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+ - ${{ else }}:
+ - script: dotnet test --solution ${{ parameters.solutionFile }} -c ${{ parameters.configuration }} --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\${{ parameters.configuration }}\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/${{ parameters.configuration }}'
+ ArtifactName: TestResults_${{ parameters.os }}_${{ parameters.configuration }}_Attempt$(System.JobAttempt)
+ condition: always()
+
+ - task: CopyFiles@2
+ displayName: 'Copy binlogs'
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/${{ parameters.configuration }}/testsuite'
+ Contents: |
+ **/*.binlog
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
+ condition: always()
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish integration tests binlogs'
+ inputs:
+ PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
+ ArtifactName: Integration_Tests_${{ parameters.os }}_${{ parameters.configuration }}_Binlogs
+ condition: always()
+
+ # Windows-specific additional steps
+ - ${{ if eq(parameters.os, 'Windows') }}:
+ - ${{ if eq(parameters.configuration, 'Debug') }}:
+ # Upload code coverage to codecov.io
+ - script: dotnet msbuild -restore
+ eng/CodeCoverage.proj
+ /p:Configuration=Debug
+ /bl:$(BUILD.SOURCESDIRECTORY)\artifacts\log\Debug\CodeCoverage.binlog
+ displayName: Upload coverage to codecov.io
+ condition: succeeded()
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish local dumps'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/CrashDumps'
+ ArtifactName: TestResults_${{ parameters.os }}_${{ parameters.configuration }}
+ condition: failed()
\ No newline at end of file
diff --git a/eng/test-stage-template.yml b/eng/test-stage-template.yml
new file mode 100644
index 0000000000..6a8db89eab
--- /dev/null
+++ b/eng/test-stage-template.yml
@@ -0,0 +1,100 @@
+# Template for test stages
+parameters:
+- name: stageName
+ type: string
+- name: displayName
+ type: string
+- name: dependsOn
+ type: string
+ default: BuildAndPack
+- name: os
+ type: string
+ values:
+ - Windows
+ - Linux
+ - macOS
+- name: skipTests
+ type: boolean
+ default: false
+- name: windowsPool
+ type: object
+ default:
+ name: NetCore-Public
+ demands: ImageOverride -equals windows.vs2022preview.amd64.open
+- name: linuxPool
+ type: object
+ default:
+ name: NetCore-Public
+ demands: ImageOverride -equals build.ubuntu.2004.amd64.open
+- name: macOSPool
+ type: object
+ default:
+ name: Azure Pipelines
+ vmImage: macos-latest
+ os: macOS
+- name: solutionFile
+ type: string
+ default: ''
+
+stages:
+- stage: ${{ parameters.stageName }}
+ displayName: ${{ parameters.displayName }}
+ dependsOn: ${{ parameters.dependsOn }}
+ jobs:
+ - template: /eng/common/templates/jobs/jobs.yml
+ parameters:
+ enableMicrobuild: true
+ enablePublishBuildArtifacts: true
+ enablePublishTestResults: true
+ testResultsFormat: 'vstest'
+ enablePublishBuildAssets: false
+ enablePublishUsingPipelines: false
+ enableTelemetry: true
+ jobs:
+ - ${{ if eq(parameters.os, 'Windows') }}:
+ - template: /eng/test-job-template.yml
+ parameters:
+ os: Windows
+ configuration: Debug
+ skipTests: ${{ parameters.skipTests }}
+ pool: ${{ parameters.windowsPool }}
+ platformSpecificSteps:
+ - template: /eng/windows-setup-steps.yml
+ - template: /eng/test-job-template.yml
+ parameters:
+ os: Windows
+ configuration: Release
+ skipTests: ${{ parameters.skipTests }}
+ pool: ${{ parameters.windowsPool }}
+ platformSpecificSteps:
+ - template: /eng/windows-setup-steps.yml
+ - ${{ if eq(parameters.os, 'Linux') }}:
+ - template: /eng/test-job-template.yml
+ parameters:
+ os: Linux
+ configuration: Debug
+ skipTests: ${{ parameters.skipTests }}
+ pool: ${{ parameters.linuxPool }}
+ solutionFile: ${{ parameters.solutionFile }}
+ - template: /eng/test-job-template.yml
+ parameters:
+ os: Linux
+ configuration: Release
+ skipTests: ${{ parameters.skipTests }}
+ pool: ${{ parameters.linuxPool }}
+ solutionFile: ${{ parameters.solutionFile }}
+ - ${{ if eq(parameters.os, 'macOS') }}:
+ - template: /eng/test-job-template.yml
+ parameters:
+ os: macOS
+ configuration: Debug
+ skipTests: ${{ parameters.skipTests }}
+ pool: ${{ parameters.macOSPool }}
+ solutionFile: ${{ parameters.solutionFile }}
+ - template: /eng/test-job-template.yml
+ parameters:
+ os: macOS
+ configuration: Release
+ skipTests: ${{ parameters.skipTests }}
+ pool: ${{ parameters.macOSPool }}
+ solutionFile: ${{ parameters.solutionFile }}
\ No newline at end of file
diff --git a/eng/windows-setup-steps.yml b/eng/windows-setup-steps.yml
new file mode 100644
index 0000000000..167028199e
--- /dev/null
+++ b/eng/windows-setup-steps.yml
@@ -0,0 +1,35 @@
+# Template for Windows-specific setup steps
+steps:
+- task: PowerShell@2
+ displayName: 'Install Windows SDK'
+ inputs:
+ targetType: filePath
+ filePath: './eng/install-windows-sdk.ps1'
+ failOnStderr: true
+ showWarnings: true
+
+- task: PowerShell@2
+ displayName: 'Install procdump'
+ inputs:
+ targetType: filePath
+ filePath: ./eng/install-procdump.ps1
+ failOnStderr: true
+ showWarnings: true
+
+- task: PowerShell@2
+ displayName: 'Enable local dumps'
+ inputs:
+ targetType: 'inline'
+ script: |
+ New-Item -Path $(Build.SourcesDirectory)\artifacts\CrashDumps -ItemType Directory -Force
+ Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
+ New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" -Name "DumpFolder" -Value "$(Build.SourcesDirectory)\artifacts\CrashDumps" -PropertyType ExpandString -Force
+ New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" -Name "DumpCount" -Value 10 -PropertyType DWord -Force
+
+- task: PowerShell@2
+ displayName: 'Install Access Database Engine'
+ inputs:
+ targetType: filePath
+ filePath: ./eng/install-access-database-engine.ps1
+ failOnStderr: true
+ showWarnings: true
\ No newline at end of file
From f612e4aee6a13b09ef665eb765507e445ab3e8c8 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 25 Jul 2025 16:56:59 +0000
Subject: [PATCH 6/9] Simplify CI templates using matrix strategy and set
_BuildConfig variable
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
---
azure-pipelines.yml | 10 +++
eng/test-job-template.yml | 131 ---------------------------
eng/test-stage-template.yml | 174 +++++++++++++++++++++++-------------
3 files changed, 121 insertions(+), 194 deletions(-)
delete mode 100644 eng/test-job-template.yml
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 834030bb2b..ddc8ef33d9 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -108,6 +108,9 @@ stages:
displayName: Test Windows
os: Windows
skipTests: ${{ parameters.SkipTests }}
+ pool:
+ name: NetCore-Public
+ demands: ImageOverride -equals windows.vs2022preview.amd64.open
- template: /eng/test-stage-template.yml
parameters:
@@ -116,6 +119,9 @@ stages:
os: Linux
skipTests: ${{ parameters.SkipTests }}
solutionFile: NonWindowsTests.slnf
+ pool:
+ name: NetCore-Public
+ demands: ImageOverride -equals build.ubuntu.2004.amd64.open
- template: /eng/test-stage-template.yml
parameters:
@@ -124,3 +130,7 @@ stages:
os: macOS
skipTests: ${{ parameters.SkipTests }}
solutionFile: NonWindowsTests.slnf
+ pool:
+ name: Azure Pipelines
+ vmImage: macos-latest
+ os: macOS
diff --git a/eng/test-job-template.yml b/eng/test-job-template.yml
deleted file mode 100644
index 95e7209466..0000000000
--- a/eng/test-job-template.yml
+++ /dev/null
@@ -1,131 +0,0 @@
-# Template for test jobs that can be parameterized by OS, configuration, and specific steps
-parameters:
-- name: os
- type: string
- values:
- - Windows
- - Linux
- - macOS
-- name: configuration
- type: string
- values:
- - Debug
- - Release
-- name: pool
- type: object
-- name: skipTests
- type: boolean
- default: false
-- name: solutionFile
- type: string
- default: ''
-- name: platformSpecificSteps
- type: stepList
- default: []
-
-jobs:
-- job: ${{ parameters.os }}_${{ parameters.configuration }}
- displayName: ${{ parameters.os }} ${{ parameters.configuration }} Tests
- timeoutInMinutes: 90
- condition: ne('${{ parameters.skipTests }}', 'True')
- pool: ${{ parameters.pool }}
- steps:
- - task: DownloadBuildArtifacts@0
- displayName: 'Download NuGet packages'
- inputs:
- buildType: 'current'
- downloadType: 'single'
- artifactName: 'NuGetPackages'
- downloadPath: '$(System.DefaultWorkingDirectory)'
-
- - task: CopyFiles@2
- displayName: 'Copy packages to expected location'
- inputs:
- SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
- Contents: '**'
- TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
-
- # Platform-specific setup steps
- - ${{ each step in parameters.platformSpecificSteps }}:
- - ${{ step }}
-
- # Build test projects only
- - ${{ if eq(parameters.os, 'Windows') }}:
- - script: eng\common\CIBuild.cmd
- -configuration ${{ parameters.configuration }}
- -prepareMachine
- /p:Publish=false
- /p:ProductsToBuild=tests
- /p:Test=false
- /p:FastAcceptanceTest=true
- name: Build
- displayName: Build Test Projects
- - ${{ else }}:
- - script: eng/common/cibuild.sh
- -configuration ${{ parameters.configuration }}
- -prepareMachine
- /p:ProductsToBuild=tests
- /p:Test=false
- /p:Publish=false
- /p:NonWindowsBuild=true
- /p:FastAcceptanceTest=true
- displayName: Build Test Projects
-
- # Run tests
- - ${{ if eq(parameters.os, 'Windows') }}:
- - script: dotnet test -c ${{ parameters.configuration }} --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\${{ parameters.configuration }}\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
- - ${{ else }}:
- - script: dotnet test --solution ${{ parameters.solutionFile }} -c ${{ parameters.configuration }} --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\${{ parameters.configuration }}\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/${{ parameters.configuration }}'
- ArtifactName: TestResults_${{ parameters.os }}_${{ parameters.configuration }}_Attempt$(System.JobAttempt)
- condition: always()
-
- - task: CopyFiles@2
- displayName: 'Copy binlogs'
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/${{ parameters.configuration }}/testsuite'
- Contents: |
- **/*.binlog
- TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish integration tests binlogs'
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_${{ parameters.os }}_${{ parameters.configuration }}_Binlogs
- condition: always()
-
- # Windows-specific additional steps
- - ${{ if eq(parameters.os, 'Windows') }}:
- - ${{ if eq(parameters.configuration, 'Debug') }}:
- # Upload code coverage to codecov.io
- - script: dotnet msbuild -restore
- eng/CodeCoverage.proj
- /p:Configuration=Debug
- /bl:$(BUILD.SOURCESDIRECTORY)\artifacts\log\Debug\CodeCoverage.binlog
- displayName: Upload coverage to codecov.io
- condition: succeeded()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish local dumps'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/CrashDumps'
- ArtifactName: TestResults_${{ parameters.os }}_${{ parameters.configuration }}
- condition: failed()
\ No newline at end of file
diff --git a/eng/test-stage-template.yml b/eng/test-stage-template.yml
index 6a8db89eab..e3bda6c4c0 100644
--- a/eng/test-stage-template.yml
+++ b/eng/test-stage-template.yml
@@ -1,4 +1,4 @@
-# Template for test stages
+# Template for test stages using matrix strategy
parameters:
- name: stageName
type: string
@@ -16,22 +16,8 @@ parameters:
- name: skipTests
type: boolean
default: false
-- name: windowsPool
+- name: pool
type: object
- default:
- name: NetCore-Public
- demands: ImageOverride -equals windows.vs2022preview.amd64.open
-- name: linuxPool
- type: object
- default:
- name: NetCore-Public
- demands: ImageOverride -equals build.ubuntu.2004.amd64.open
-- name: macOSPool
- type: object
- default:
- name: Azure Pipelines
- vmImage: macos-latest
- os: macOS
- name: solutionFile
type: string
default: ''
@@ -51,50 +37,112 @@ stages:
enablePublishUsingPipelines: false
enableTelemetry: true
jobs:
- - ${{ if eq(parameters.os, 'Windows') }}:
- - template: /eng/test-job-template.yml
- parameters:
- os: Windows
- configuration: Debug
- skipTests: ${{ parameters.skipTests }}
- pool: ${{ parameters.windowsPool }}
- platformSpecificSteps:
- - template: /eng/windows-setup-steps.yml
- - template: /eng/test-job-template.yml
- parameters:
- os: Windows
- configuration: Release
- skipTests: ${{ parameters.skipTests }}
- pool: ${{ parameters.windowsPool }}
- platformSpecificSteps:
- - template: /eng/windows-setup-steps.yml
- - ${{ if eq(parameters.os, 'Linux') }}:
- - template: /eng/test-job-template.yml
- parameters:
- os: Linux
- configuration: Debug
- skipTests: ${{ parameters.skipTests }}
- pool: ${{ parameters.linuxPool }}
- solutionFile: ${{ parameters.solutionFile }}
- - template: /eng/test-job-template.yml
- parameters:
- os: Linux
- configuration: Release
- skipTests: ${{ parameters.skipTests }}
- pool: ${{ parameters.linuxPool }}
- solutionFile: ${{ parameters.solutionFile }}
- - ${{ if eq(parameters.os, 'macOS') }}:
- - template: /eng/test-job-template.yml
- parameters:
- os: macOS
- configuration: Debug
- skipTests: ${{ parameters.skipTests }}
- pool: ${{ parameters.macOSPool }}
- solutionFile: ${{ parameters.solutionFile }}
- - template: /eng/test-job-template.yml
- parameters:
- os: macOS
- configuration: Release
- skipTests: ${{ parameters.skipTests }}
- pool: ${{ parameters.macOSPool }}
- solutionFile: ${{ parameters.solutionFile }}
\ No newline at end of file
+ - job: ${{ parameters.os }}_Tests
+ displayName: ${{ parameters.os }} Tests
+ timeoutInMinutes: 90
+ condition: ne('${{ parameters.skipTests }}', 'True')
+ pool: ${{ parameters.pool }}
+ strategy:
+ matrix:
+ Debug:
+ _BuildConfig: Debug
+ Release:
+ _BuildConfig: Release
+ steps:
+ - task: DownloadBuildArtifacts@0
+ displayName: 'Download NuGet packages'
+ inputs:
+ buildType: 'current'
+ downloadType: 'single'
+ artifactName: 'NuGetPackages'
+ downloadPath: '$(System.DefaultWorkingDirectory)'
+
+ - task: CopyFiles@2
+ displayName: 'Copy packages to expected location'
+ inputs:
+ SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
+ Contents: '**'
+ TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+
+ # Platform-specific setup steps
+ - ${{ if eq(parameters.os, 'Windows') }}:
+ - template: /eng/windows-setup-steps.yml
+
+ # Build test projects only
+ - ${{ if eq(parameters.os, 'Windows') }}:
+ - script: eng\common\CIBuild.cmd
+ -configuration $(_BuildConfig)
+ -prepareMachine
+ /p:Publish=false
+ /p:ProductsToBuild=tests
+ /p:Test=false
+ /p:FastAcceptanceTest=true
+ name: Build
+ displayName: Build Test Projects
+ - ${{ else }}:
+ - script: eng/common/cibuild.sh
+ -configuration $(_BuildConfig)
+ -prepareMachine
+ /p:ProductsToBuild=tests
+ /p:Test=false
+ /p:Publish=false
+ /p:NonWindowsBuild=true
+ /p:FastAcceptanceTest=true
+ displayName: Build Test Projects
+
+ # Run tests
+ - ${{ if eq(parameters.os, 'Windows') }}:
+ - script: dotnet test -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+ - ${{ else }}:
+ - script: dotnet test --solution ${{ parameters.solutionFile }} -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
+ ArtifactName: TestResults_${{ parameters.os }}_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ condition: always()
+
+ - task: CopyFiles@2
+ displayName: 'Copy binlogs'
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/$(_BuildConfig)/testsuite'
+ Contents: |
+ **/*.binlog
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
+ condition: always()
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish integration tests binlogs'
+ inputs:
+ PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
+ ArtifactName: Integration_Tests_${{ parameters.os }}_$(_BuildConfig)_Binlogs
+ condition: always()
+
+ # Windows-specific additional steps
+ - ${{ if eq(parameters.os, 'Windows') }}:
+ - script: dotnet msbuild -restore
+ eng/CodeCoverage.proj
+ /p:Configuration=$(_BuildConfig)
+ /bl:$(BUILD.SOURCESDIRECTORY)\artifacts\log\$(_BuildConfig)\CodeCoverage.binlog
+ displayName: Upload coverage to codecov.io
+ condition: and(succeeded(), eq(variables._BuildConfig, 'Debug'))
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish local dumps'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/CrashDumps'
+ ArtifactName: TestResults_${{ parameters.os }}_$(_BuildConfig)
+ condition: failed()
\ No newline at end of file
From 4851214e106e9f41fb574cb44e64696769feacd4 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 28 Jul 2025 09:52:23 +0000
Subject: [PATCH 7/9] Restructure CI to separate unit tests from integration
tests with product filtering
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
---
azure-pipelines.yml | 184 ++++++++++++++----
eng/Build.props | 43 ++++
...ml => integration-test-stage-template.yml} | 28 +--
eng/unit-test-stage-template.yml | 85 ++++++++
4 files changed, 292 insertions(+), 48 deletions(-)
rename eng/{test-stage-template.yml => integration-test-stage-template.yml} (84%)
create mode 100644 eng/unit-test-stage-template.yml
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index ddc8ef33d9..c8dc667184 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -42,93 +42,203 @@ variables:
stages:
+# Stage 1: Windows builds all products, runs unit tests, and publishes packages
- stage: BuildAndPack
- displayName: Build and Pack
+ displayName: Build, Unit Tests, and Pack (Windows)
jobs:
- template: /eng/common/templates/jobs/jobs.yml
parameters:
enableMicrobuild: true
enablePublishBuildArtifacts: true
- enablePublishTestResults: false
+ enablePublishTestResults: true
+ testResultsFormat: 'vstest'
enablePublishBuildAssets: true
enablePublishUsingPipelines: true
enableTelemetry: true
jobs:
- job: Windows_BuildAndPack
- displayName: Windows Build and Pack
+ displayName: Windows Build, Unit Tests, and Pack
timeoutInMinutes: 90
+ condition: ne('${{ parameters.SkipTests }}', 'True')
pool:
name: NetCore-Public
demands: ImageOverride -equals windows.vs2022preview.amd64.open
+ strategy:
+ matrix:
+ Debug:
+ _BuildConfig: Debug
+ Release:
+ _BuildConfig: Release
steps:
- - task: PowerShell@2
- displayName: 'Install Windows SDK'
- inputs:
- targetType: filePath
- filePath: './eng/install-windows-sdk.ps1'
- failOnStderr: true
- showWarnings: true
+ - template: /eng/windows-setup-steps.yml
- - task: PowerShell@2
- displayName: 'Install procdump'
- inputs:
- targetType: filePath
- filePath: ./eng/install-procdump.ps1
- failOnStderr: true
- showWarnings: true
+ # Build all products and run unit tests
+ - script: eng\common\CIBuild.cmd
+ -configuration $(_BuildConfig)
+ -prepareMachine
+ /p:Publish=false
+ /p:ProductsToBuild=all
+ /p:Test=false
+ /p:FastAcceptanceTest=true
+ name: BuildAll
+ displayName: Build All Products
- - task: PowerShell@2
- displayName: 'Install Access Database Engine'
- inputs:
- targetType: filePath
- filePath: ./eng/install-access-database-engine.ps1
- failOnStderr: true
- showWarnings: true
+ # Run unit tests for both MSTest and Testing Platform
+ - script: dotnet test test/UnitTests -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\UnitTests.binlog --no-progress
+ name: UnitTests
+ displayName: Run Unit Tests
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
- # Build only production projects, no tests
+ # Pack only in Release configuration
- script: eng\common\CIBuild.cmd
-configuration Release
-prepareMachine
/p:Publish=false
/p:ProductsToBuild=all
/p:Test=false
- name: BuildAndPack
- displayName: Build and Pack
+ /p:Pack=true
+ name: Pack
+ displayName: Pack NuGet Packages
+ condition: eq(variables._BuildConfig, 'Release')
- task: PublishBuildArtifacts@1
- displayName: 'Publish NuGet packages for testing'
+ displayName: 'Publish NuGet packages for integration testing'
inputs:
PathtoPublish: '$(Build.SourcesDirectory)/artifacts/packages/Release'
ArtifactName: 'NuGetPackages'
+ condition: and(always(), eq(variables._BuildConfig, 'Release'))
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Unit Test Results'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
+ ArtifactName: UnitTestResults_Windows_$(_BuildConfig)_Attempt$(System.JobAttempt)
condition: always()
-- template: /eng/test-stage-template.yml
+# Stage 2: Linux Unit Tests (parallel, no dependency)
+- template: /eng/unit-test-stage-template.yml
+ parameters:
+ stageName: UnitTestsLinux
+ displayName: Unit Tests Linux (MSTest)
+ os: Linux
+ skipTests: ${{ parameters.SkipTests }}
+ productFilter: mstest-unit-tests
+ pool:
+ name: NetCore-Public
+ demands: ImageOverride -equals build.ubuntu.2004.amd64.open
+
+- template: /eng/unit-test-stage-template.yml
+ parameters:
+ stageName: UnitTestsLinuxMTP
+ displayName: Unit Tests Linux (Testing Platform)
+ os: Linux
+ skipTests: ${{ parameters.SkipTests }}
+ productFilter: testing-platform-unit-tests
+ pool:
+ name: NetCore-Public
+ demands: ImageOverride -equals build.ubuntu.2004.amd64.open
+
+# Stage 3: macOS Unit Tests (parallel, no dependency)
+- template: /eng/unit-test-stage-template.yml
+ parameters:
+ stageName: UnitTestsMacOS
+ displayName: Unit Tests macOS (MSTest)
+ os: macOS
+ skipTests: ${{ parameters.SkipTests }}
+ productFilter: mstest-unit-tests
+ pool:
+ name: Azure Pipelines
+ vmImage: macos-latest
+ os: macOS
+
+- template: /eng/unit-test-stage-template.yml
parameters:
- stageName: TestWindows
- displayName: Test Windows
+ stageName: UnitTestsMacOSMTP
+ displayName: Unit Tests macOS (Testing Platform)
+ os: macOS
+ skipTests: ${{ parameters.SkipTests }}
+ productFilter: testing-platform-unit-tests
+ pool:
+ name: Azure Pipelines
+ vmImage: macos-latest
+ os: macOS
+
+# Stage 4: Integration Tests on all platforms (depends on Windows build)
+- template: /eng/integration-test-stage-template.yml
+ parameters:
+ stageName: IntegrationTestsWindows
+ displayName: Integration Tests Windows (MSTest)
+ dependsOn: BuildAndPack
os: Windows
skipTests: ${{ parameters.SkipTests }}
+ productFilter: mstest-integration-tests
pool:
name: NetCore-Public
demands: ImageOverride -equals windows.vs2022preview.amd64.open
-- template: /eng/test-stage-template.yml
+- template: /eng/integration-test-stage-template.yml
+ parameters:
+ stageName: IntegrationTestsWindowsMTP
+ displayName: Integration Tests Windows (Testing Platform)
+ dependsOn: BuildAndPack
+ os: Windows
+ skipTests: ${{ parameters.SkipTests }}
+ productFilter: testing-platform-integration-tests
+ pool:
+ name: NetCore-Public
+ demands: ImageOverride -equals windows.vs2022preview.amd64.open
+
+- template: /eng/integration-test-stage-template.yml
+ parameters:
+ stageName: IntegrationTestsLinux
+ displayName: Integration Tests Linux (MSTest)
+ dependsOn: BuildAndPack
+ os: Linux
+ skipTests: ${{ parameters.SkipTests }}
+ productFilter: mstest-integration-tests
+ solutionFile: NonWindowsTests.slnf
+ pool:
+ name: NetCore-Public
+ demands: ImageOverride -equals build.ubuntu.2004.amd64.open
+
+- template: /eng/integration-test-stage-template.yml
parameters:
- stageName: TestLinux
- displayName: Test Linux
+ stageName: IntegrationTestsLinuxMTP
+ displayName: Integration Tests Linux (Testing Platform)
+ dependsOn: BuildAndPack
os: Linux
skipTests: ${{ parameters.SkipTests }}
+ productFilter: testing-platform-integration-tests
solutionFile: NonWindowsTests.slnf
pool:
name: NetCore-Public
demands: ImageOverride -equals build.ubuntu.2004.amd64.open
-- template: /eng/test-stage-template.yml
+- template: /eng/integration-test-stage-template.yml
+ parameters:
+ stageName: IntegrationTestsMacOS
+ displayName: Integration Tests macOS (MSTest)
+ dependsOn: BuildAndPack
+ os: macOS
+ skipTests: ${{ parameters.SkipTests }}
+ productFilter: mstest-integration-tests
+ solutionFile: NonWindowsTests.slnf
+ pool:
+ name: Azure Pipelines
+ vmImage: macos-latest
+ os: macOS
+
+- template: /eng/integration-test-stage-template.yml
parameters:
- stageName: TestMacOS
- displayName: Test macOS
+ stageName: IntegrationTestsMacOSMTP
+ displayName: Integration Tests macOS (Testing Platform)
+ dependsOn: BuildAndPack
os: macOS
skipTests: ${{ parameters.SkipTests }}
+ productFilter: testing-platform-integration-tests
solutionFile: NonWindowsTests.slnf
pool:
name: Azure Pipelines
diff --git a/eng/Build.props b/eng/Build.props
index b683485b00..a6089cd1a8 100644
--- a/eng/Build.props
+++ b/eng/Build.props
@@ -52,4 +52,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eng/test-stage-template.yml b/eng/integration-test-stage-template.yml
similarity index 84%
rename from eng/test-stage-template.yml
rename to eng/integration-test-stage-template.yml
index e3bda6c4c0..cb063ca443 100644
--- a/eng/test-stage-template.yml
+++ b/eng/integration-test-stage-template.yml
@@ -1,4 +1,4 @@
-# Template for test stages using matrix strategy
+# Template for integration test stages that use official packages
parameters:
- name: stageName
type: string
@@ -21,6 +21,12 @@ parameters:
- name: solutionFile
type: string
default: ''
+- name: productFilter
+ type: string
+ values:
+ - mstest-integration-tests
+ - testing-platform-integration-tests
+ default: mstest-integration-tests
stages:
- stage: ${{ parameters.stageName }}
@@ -37,8 +43,8 @@ stages:
enablePublishUsingPipelines: false
enableTelemetry: true
jobs:
- - job: ${{ parameters.os }}_Tests
- displayName: ${{ parameters.os }} Tests
+ - job: ${{ parameters.os }}_IntegrationTests
+ displayName: ${{ parameters.os }} Integration Tests
timeoutInMinutes: 90
condition: ne('${{ parameters.skipTests }}', 'True')
pool: ${{ parameters.pool }}
@@ -68,29 +74,29 @@ stages:
- ${{ if eq(parameters.os, 'Windows') }}:
- template: /eng/windows-setup-steps.yml
- # Build test projects only
+ # Build integration test projects only
- ${{ if eq(parameters.os, 'Windows') }}:
- script: eng\common\CIBuild.cmd
-configuration $(_BuildConfig)
-prepareMachine
/p:Publish=false
- /p:ProductsToBuild=tests
+ /p:ProductsToBuild=${{ parameters.productFilter }}
/p:Test=false
/p:FastAcceptanceTest=true
name: Build
- displayName: Build Test Projects
+ displayName: Build Integration Test Projects
- ${{ else }}:
- script: eng/common/cibuild.sh
-configuration $(_BuildConfig)
-prepareMachine
- /p:ProductsToBuild=tests
+ /p:ProductsToBuild=${{ parameters.productFilter }}
/p:Test=false
/p:Publish=false
/p:NonWindowsBuild=true
/p:FastAcceptanceTest=true
- displayName: Build Test Projects
+ displayName: Build Integration Test Projects
- # Run tests
+ # Run integration tests
- ${{ if eq(parameters.os, 'Windows') }}:
- script: dotnet test -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
name: Test
@@ -112,7 +118,7 @@ stages:
displayName: 'Publish Test Results folders'
inputs:
PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
- ArtifactName: TestResults_${{ parameters.os }}_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ ArtifactName: IntegrationTestResults_${{ parameters.os }}_$(_BuildConfig)_Attempt$(System.JobAttempt)
condition: always()
- task: CopyFiles@2
@@ -144,5 +150,5 @@ stages:
displayName: 'Publish local dumps'
inputs:
PathtoPublish: '$(Build.SourcesDirectory)/artifacts/CrashDumps'
- ArtifactName: TestResults_${{ parameters.os }}_$(_BuildConfig)
+ ArtifactName: IntegrationTestResults_${{ parameters.os }}_$(_BuildConfig)
condition: failed()
\ No newline at end of file
diff --git a/eng/unit-test-stage-template.yml b/eng/unit-test-stage-template.yml
new file mode 100644
index 0000000000..7e3fed21f2
--- /dev/null
+++ b/eng/unit-test-stage-template.yml
@@ -0,0 +1,85 @@
+# Template for unit test stages that run independently per platform
+parameters:
+- name: stageName
+ type: string
+- name: displayName
+ type: string
+- name: os
+ type: string
+ values:
+ - Windows
+ - Linux
+ - macOS
+- name: skipTests
+ type: boolean
+ default: false
+- name: pool
+ type: object
+- name: solutionFile
+ type: string
+ default: ''
+- name: productFilter
+ type: string
+ values:
+ - mstest-unit-tests
+ - testing-platform-unit-tests
+ default: mstest-unit-tests
+
+stages:
+- stage: ${{ parameters.stageName }}
+ displayName: ${{ parameters.displayName }}
+ jobs:
+ - template: /eng/common/templates/jobs/jobs.yml
+ parameters:
+ enableMicrobuild: true
+ enablePublishBuildArtifacts: true
+ enablePublishTestResults: true
+ testResultsFormat: 'vstest'
+ enablePublishBuildAssets: false
+ enablePublishUsingPipelines: false
+ enableTelemetry: true
+ jobs:
+ - job: ${{ parameters.os }}_UnitTests
+ displayName: ${{ parameters.os }} Unit Tests
+ timeoutInMinutes: 90
+ condition: ne('${{ parameters.skipTests }}', 'True')
+ pool: ${{ parameters.pool }}
+ strategy:
+ matrix:
+ Debug:
+ _BuildConfig: Debug
+ Release:
+ _BuildConfig: Release
+ steps:
+ # Platform-specific setup steps
+ - ${{ if eq(parameters.os, 'Windows') }}:
+ - template: /eng/windows-setup-steps.yml
+
+ # Build and run unit tests (no dependency on packages)
+ - ${{ if eq(parameters.os, 'Windows') }}:
+ - script: eng\common\CIBuild.cmd
+ -configuration $(_BuildConfig)
+ -prepareMachine
+ /p:Publish=false
+ /p:ProductsToBuild=${{ parameters.productFilter }}
+ /p:Test=true
+ /p:FastAcceptanceTest=true
+ name: BuildAndTest
+ displayName: Build and Test Unit Tests
+ - ${{ else }}:
+ - script: eng/common/cibuild.sh
+ -configuration $(_BuildConfig)
+ -prepareMachine
+ /p:ProductsToBuild=${{ parameters.productFilter }}
+ /p:Test=true
+ /p:Publish=false
+ /p:NonWindowsBuild=true
+ /p:FastAcceptanceTest=true
+ displayName: Build and Test Unit Tests
+
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
+ ArtifactName: UnitTestResults_${{ parameters.os }}_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ condition: always()
\ No newline at end of file
From 6a0efe8453349a302a06c1150b1afbc03ecca62e Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 28 Jul 2025 11:39:19 +0000
Subject: [PATCH 8/9] Restructure CI pipeline to match requested workflow with
Windows build + pack leading integration tests
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
---
azure-pipelines.yml | 398 +++++++++++++++++++-----
eng/integration-test-stage-template.yml | 154 ---------
2 files changed, 316 insertions(+), 236 deletions(-)
delete mode 100644 eng/integration-test-stage-template.yml
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index c8dc667184..2a2685549f 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -42,9 +42,9 @@ variables:
stages:
-# Stage 1: Windows builds all products, runs unit tests, and publishes packages
-- stage: BuildAndPack
- displayName: Build, Unit Tests, and Pack (Windows)
+# Stage 1: Windows builds all products, runs unit tests, publishes packages, and runs integration tests
+- stage: BuildPackAndIntegrationTests
+ displayName: Windows Build, Unit Tests, Pack, and Integration Tests
jobs:
- template: /eng/common/templates/jobs/jobs.yml
parameters:
@@ -118,6 +118,319 @@ stages:
ArtifactName: UnitTestResults_Windows_$(_BuildConfig)_Attempt$(System.JobAttempt)
condition: always()
+ # Integration tests on Windows (depends on Windows build)
+ - job: Windows_IntegrationTests_MSTest
+ displayName: Windows Integration Tests (MSTest)
+ dependsOn: Windows_BuildAndPack
+ timeoutInMinutes: 90
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+ pool:
+ name: NetCore-Public
+ demands: ImageOverride -equals windows.vs2022preview.amd64.open
+ strategy:
+ matrix:
+ Debug:
+ _BuildConfig: Debug
+ Release:
+ _BuildConfig: Release
+ steps:
+ - task: DownloadBuildArtifacts@0
+ displayName: 'Download NuGet packages'
+ inputs:
+ buildType: 'current'
+ downloadType: 'single'
+ artifactName: 'NuGetPackages'
+ downloadPath: '$(System.DefaultWorkingDirectory)'
+ - task: CopyFiles@2
+ displayName: 'Copy packages to expected location'
+ inputs:
+ SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
+ Contents: '**'
+ TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+ - template: /eng/windows-setup-steps.yml
+ - script: eng\common\CIBuild.cmd
+ -configuration $(_BuildConfig)
+ -prepareMachine
+ /p:Publish=false
+ /p:ProductsToBuild=mstest-integration-tests
+ /p:Test=false
+ /p:FastAcceptanceTest=true
+ name: Build
+ displayName: Build Integration Test Projects
+ - script: dotnet test -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
+ ArtifactName: IntegrationTestResults_Windows_MSTest_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ condition: always()
+
+ - job: Windows_IntegrationTests_MTP
+ displayName: Windows Integration Tests (Testing Platform)
+ dependsOn: Windows_BuildAndPack
+ timeoutInMinutes: 90
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+ pool:
+ name: NetCore-Public
+ demands: ImageOverride -equals windows.vs2022preview.amd64.open
+ strategy:
+ matrix:
+ Debug:
+ _BuildConfig: Debug
+ Release:
+ _BuildConfig: Release
+ steps:
+ - task: DownloadBuildArtifacts@0
+ displayName: 'Download NuGet packages'
+ inputs:
+ buildType: 'current'
+ downloadType: 'single'
+ artifactName: 'NuGetPackages'
+ downloadPath: '$(System.DefaultWorkingDirectory)'
+ - task: CopyFiles@2
+ displayName: 'Copy packages to expected location'
+ inputs:
+ SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
+ Contents: '**'
+ TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+ - template: /eng/windows-setup-steps.yml
+ - script: eng\common\CIBuild.cmd
+ -configuration $(_BuildConfig)
+ -prepareMachine
+ /p:Publish=false
+ /p:ProductsToBuild=testing-platform-integration-tests
+ /p:Test=false
+ /p:FastAcceptanceTest=true
+ name: Build
+ displayName: Build Integration Test Projects
+ - script: dotnet test -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
+ ArtifactName: IntegrationTestResults_Windows_MTP_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ condition: always()
+
+ # Integration tests on Linux (depends on Windows build)
+ - job: Linux_IntegrationTests_MSTest
+ displayName: Linux Integration Tests (MSTest)
+ dependsOn: Windows_BuildAndPack
+ timeoutInMinutes: 90
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+ pool:
+ name: NetCore-Public
+ demands: ImageOverride -equals build.ubuntu.2004.amd64.open
+ strategy:
+ matrix:
+ Debug:
+ _BuildConfig: Debug
+ Release:
+ _BuildConfig: Release
+ steps:
+ - task: DownloadBuildArtifacts@0
+ displayName: 'Download NuGet packages'
+ inputs:
+ buildType: 'current'
+ downloadType: 'single'
+ artifactName: 'NuGetPackages'
+ downloadPath: '$(System.DefaultWorkingDirectory)'
+ - task: CopyFiles@2
+ displayName: 'Copy packages to expected location'
+ inputs:
+ SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
+ Contents: '**'
+ TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+ - script: eng/common/cibuild.sh
+ -configuration $(_BuildConfig)
+ -prepareMachine
+ /p:ProductsToBuild=mstest-integration-tests
+ /p:Test=false
+ /p:Publish=false
+ /p:NonWindowsBuild=true
+ /p:FastAcceptanceTest=true
+ displayName: Build Integration Test Projects
+ - script: dotnet test --solution NonWindowsTests.slnf -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
+ ArtifactName: IntegrationTestResults_Linux_MSTest_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ condition: always()
+
+ - job: Linux_IntegrationTests_MTP
+ displayName: Linux Integration Tests (Testing Platform)
+ dependsOn: Windows_BuildAndPack
+ timeoutInMinutes: 90
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+ pool:
+ name: NetCore-Public
+ demands: ImageOverride -equals build.ubuntu.2004.amd64.open
+ strategy:
+ matrix:
+ Debug:
+ _BuildConfig: Debug
+ Release:
+ _BuildConfig: Release
+ steps:
+ - task: DownloadBuildArtifacts@0
+ displayName: 'Download NuGet packages'
+ inputs:
+ buildType: 'current'
+ downloadType: 'single'
+ artifactName: 'NuGetPackages'
+ downloadPath: '$(System.DefaultWorkingDirectory)'
+ - task: CopyFiles@2
+ displayName: 'Copy packages to expected location'
+ inputs:
+ SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
+ Contents: '**'
+ TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+ - script: eng/common/cibuild.sh
+ -configuration $(_BuildConfig)
+ -prepareMachine
+ /p:ProductsToBuild=testing-platform-integration-tests
+ /p:Test=false
+ /p:Publish=false
+ /p:NonWindowsBuild=true
+ /p:FastAcceptanceTest=true
+ displayName: Build Integration Test Projects
+ - script: dotnet test --solution NonWindowsTests.slnf -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
+ ArtifactName: IntegrationTestResults_Linux_MTP_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ condition: always()
+
+ # Integration tests on macOS (depends on Windows build)
+ - job: MacOS_IntegrationTests_MSTest
+ displayName: macOS Integration Tests (MSTest)
+ dependsOn: Windows_BuildAndPack
+ timeoutInMinutes: 90
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+ pool:
+ name: Azure Pipelines
+ vmImage: macos-latest
+ os: macOS
+ strategy:
+ matrix:
+ Debug:
+ _BuildConfig: Debug
+ Release:
+ _BuildConfig: Release
+ steps:
+ - task: DownloadBuildArtifacts@0
+ displayName: 'Download NuGet packages'
+ inputs:
+ buildType: 'current'
+ downloadType: 'single'
+ artifactName: 'NuGetPackages'
+ downloadPath: '$(System.DefaultWorkingDirectory)'
+ - task: CopyFiles@2
+ displayName: 'Copy packages to expected location'
+ inputs:
+ SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
+ Contents: '**'
+ TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+ - script: eng/common/cibuild.sh
+ -configuration $(_BuildConfig)
+ -prepareMachine
+ /p:ProductsToBuild=mstest-integration-tests
+ /p:Test=false
+ /p:Publish=false
+ /p:NonWindowsBuild=true
+ /p:FastAcceptanceTest=true
+ displayName: Build Integration Test Projects
+ - script: dotnet test --solution NonWindowsTests.slnf -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
+ ArtifactName: IntegrationTestResults_macOS_MSTest_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ condition: always()
+
+ - job: MacOS_IntegrationTests_MTP
+ displayName: macOS Integration Tests (Testing Platform)
+ dependsOn: Windows_BuildAndPack
+ timeoutInMinutes: 90
+ condition: ne('${{ parameters.SkipTests }}', 'True')
+ pool:
+ name: Azure Pipelines
+ vmImage: macos-latest
+ os: macOS
+ strategy:
+ matrix:
+ Debug:
+ _BuildConfig: Debug
+ Release:
+ _BuildConfig: Release
+ steps:
+ - task: DownloadBuildArtifacts@0
+ displayName: 'Download NuGet packages'
+ inputs:
+ buildType: 'current'
+ downloadType: 'single'
+ artifactName: 'NuGetPackages'
+ downloadPath: '$(System.DefaultWorkingDirectory)'
+ - task: CopyFiles@2
+ displayName: 'Copy packages to expected location'
+ inputs:
+ SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
+ Contents: '**'
+ TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+ - script: eng/common/cibuild.sh
+ -configuration $(_BuildConfig)
+ -prepareMachine
+ /p:ProductsToBuild=testing-platform-integration-tests
+ /p:Test=false
+ /p:Publish=false
+ /p:NonWindowsBuild=true
+ /p:FastAcceptanceTest=true
+ displayName: Build Integration Test Projects
+ - script: dotnet test --solution NonWindowsTests.slnf -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
+ name: Test
+ displayName: Test
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Test Results folders'
+ inputs:
+ PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
+ ArtifactName: IntegrationTestResults_macOS_MTP_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ condition: always()
+
# Stage 2: Linux Unit Tests (parallel, no dependency)
- template: /eng/unit-test-stage-template.yml
parameters:
@@ -165,82 +478,3 @@ stages:
name: Azure Pipelines
vmImage: macos-latest
os: macOS
-
-# Stage 4: Integration Tests on all platforms (depends on Windows build)
-- template: /eng/integration-test-stage-template.yml
- parameters:
- stageName: IntegrationTestsWindows
- displayName: Integration Tests Windows (MSTest)
- dependsOn: BuildAndPack
- os: Windows
- skipTests: ${{ parameters.SkipTests }}
- productFilter: mstest-integration-tests
- pool:
- name: NetCore-Public
- demands: ImageOverride -equals windows.vs2022preview.amd64.open
-
-- template: /eng/integration-test-stage-template.yml
- parameters:
- stageName: IntegrationTestsWindowsMTP
- displayName: Integration Tests Windows (Testing Platform)
- dependsOn: BuildAndPack
- os: Windows
- skipTests: ${{ parameters.SkipTests }}
- productFilter: testing-platform-integration-tests
- pool:
- name: NetCore-Public
- demands: ImageOverride -equals windows.vs2022preview.amd64.open
-
-- template: /eng/integration-test-stage-template.yml
- parameters:
- stageName: IntegrationTestsLinux
- displayName: Integration Tests Linux (MSTest)
- dependsOn: BuildAndPack
- os: Linux
- skipTests: ${{ parameters.SkipTests }}
- productFilter: mstest-integration-tests
- solutionFile: NonWindowsTests.slnf
- pool:
- name: NetCore-Public
- demands: ImageOverride -equals build.ubuntu.2004.amd64.open
-
-- template: /eng/integration-test-stage-template.yml
- parameters:
- stageName: IntegrationTestsLinuxMTP
- displayName: Integration Tests Linux (Testing Platform)
- dependsOn: BuildAndPack
- os: Linux
- skipTests: ${{ parameters.SkipTests }}
- productFilter: testing-platform-integration-tests
- solutionFile: NonWindowsTests.slnf
- pool:
- name: NetCore-Public
- demands: ImageOverride -equals build.ubuntu.2004.amd64.open
-
-- template: /eng/integration-test-stage-template.yml
- parameters:
- stageName: IntegrationTestsMacOS
- displayName: Integration Tests macOS (MSTest)
- dependsOn: BuildAndPack
- os: macOS
- skipTests: ${{ parameters.SkipTests }}
- productFilter: mstest-integration-tests
- solutionFile: NonWindowsTests.slnf
- pool:
- name: Azure Pipelines
- vmImage: macos-latest
- os: macOS
-
-- template: /eng/integration-test-stage-template.yml
- parameters:
- stageName: IntegrationTestsMacOSMTP
- displayName: Integration Tests macOS (Testing Platform)
- dependsOn: BuildAndPack
- os: macOS
- skipTests: ${{ parameters.SkipTests }}
- productFilter: testing-platform-integration-tests
- solutionFile: NonWindowsTests.slnf
- pool:
- name: Azure Pipelines
- vmImage: macos-latest
- os: macOS
diff --git a/eng/integration-test-stage-template.yml b/eng/integration-test-stage-template.yml
deleted file mode 100644
index cb063ca443..0000000000
--- a/eng/integration-test-stage-template.yml
+++ /dev/null
@@ -1,154 +0,0 @@
-# Template for integration test stages that use official packages
-parameters:
-- name: stageName
- type: string
-- name: displayName
- type: string
-- name: dependsOn
- type: string
- default: BuildAndPack
-- name: os
- type: string
- values:
- - Windows
- - Linux
- - macOS
-- name: skipTests
- type: boolean
- default: false
-- name: pool
- type: object
-- name: solutionFile
- type: string
- default: ''
-- name: productFilter
- type: string
- values:
- - mstest-integration-tests
- - testing-platform-integration-tests
- default: mstest-integration-tests
-
-stages:
-- stage: ${{ parameters.stageName }}
- displayName: ${{ parameters.displayName }}
- dependsOn: ${{ parameters.dependsOn }}
- jobs:
- - template: /eng/common/templates/jobs/jobs.yml
- parameters:
- enableMicrobuild: true
- enablePublishBuildArtifacts: true
- enablePublishTestResults: true
- testResultsFormat: 'vstest'
- enablePublishBuildAssets: false
- enablePublishUsingPipelines: false
- enableTelemetry: true
- jobs:
- - job: ${{ parameters.os }}_IntegrationTests
- displayName: ${{ parameters.os }} Integration Tests
- timeoutInMinutes: 90
- condition: ne('${{ parameters.skipTests }}', 'True')
- pool: ${{ parameters.pool }}
- strategy:
- matrix:
- Debug:
- _BuildConfig: Debug
- Release:
- _BuildConfig: Release
- steps:
- - task: DownloadBuildArtifacts@0
- displayName: 'Download NuGet packages'
- inputs:
- buildType: 'current'
- downloadType: 'single'
- artifactName: 'NuGetPackages'
- downloadPath: '$(System.DefaultWorkingDirectory)'
-
- - task: CopyFiles@2
- displayName: 'Copy packages to expected location'
- inputs:
- SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
- Contents: '**'
- TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
-
- # Platform-specific setup steps
- - ${{ if eq(parameters.os, 'Windows') }}:
- - template: /eng/windows-setup-steps.yml
-
- # Build integration test projects only
- - ${{ if eq(parameters.os, 'Windows') }}:
- - script: eng\common\CIBuild.cmd
- -configuration $(_BuildConfig)
- -prepareMachine
- /p:Publish=false
- /p:ProductsToBuild=${{ parameters.productFilter }}
- /p:Test=false
- /p:FastAcceptanceTest=true
- name: Build
- displayName: Build Integration Test Projects
- - ${{ else }}:
- - script: eng/common/cibuild.sh
- -configuration $(_BuildConfig)
- -prepareMachine
- /p:ProductsToBuild=${{ parameters.productFilter }}
- /p:Test=false
- /p:Publish=false
- /p:NonWindowsBuild=true
- /p:FastAcceptanceTest=true
- displayName: Build Integration Test Projects
-
- # Run integration tests
- - ${{ if eq(parameters.os, 'Windows') }}:
- - script: dotnet test -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
- - ${{ else }}:
- - script: dotnet test --solution ${{ parameters.solutionFile }} -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
- ArtifactName: IntegrationTestResults_${{ parameters.os }}_$(_BuildConfig)_Attempt$(System.JobAttempt)
- condition: always()
-
- - task: CopyFiles@2
- displayName: 'Copy binlogs'
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)/artifacts/tmp/$(_BuildConfig)/testsuite'
- Contents: |
- **/*.binlog
- TargetFolder: '$(Build.ArtifactStagingDirectory)/binlogs'
- condition: always()
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish integration tests binlogs'
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/binlogs'
- ArtifactName: Integration_Tests_${{ parameters.os }}_$(_BuildConfig)_Binlogs
- condition: always()
-
- # Windows-specific additional steps
- - ${{ if eq(parameters.os, 'Windows') }}:
- - script: dotnet msbuild -restore
- eng/CodeCoverage.proj
- /p:Configuration=$(_BuildConfig)
- /bl:$(BUILD.SOURCESDIRECTORY)\artifacts\log\$(_BuildConfig)\CodeCoverage.binlog
- displayName: Upload coverage to codecov.io
- condition: and(succeeded(), eq(variables._BuildConfig, 'Debug'))
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish local dumps'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/CrashDumps'
- ArtifactName: IntegrationTestResults_${{ parameters.os }}_$(_BuildConfig)
- condition: failed()
\ No newline at end of file
From ca20a54ee36920e5d5b30c720c26f8fbd211d0d6 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 28 Jul 2025 11:54:35 +0000
Subject: [PATCH 9/9] Restructure CI pipeline to match exact requested
workflow: 3 parallel jobs followed by 3 integration test jobs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
---
azure-pipelines.yml | 334 +++++++++++++------------------
eng/unit-test-stage-template.yml | 85 --------
2 files changed, 144 insertions(+), 275 deletions(-)
delete mode 100644 eng/unit-test-stage-template.yml
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 2a2685549f..0448bcdc0e 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -42,9 +42,9 @@ variables:
stages:
-# Stage 1: Windows builds all products, runs unit tests, publishes packages, and runs integration tests
-- stage: BuildPackAndIntegrationTests
- displayName: Windows Build, Unit Tests, Pack, and Integration Tests
+# Stage 1: Build and Unit Tests (3 parallel jobs)
+- stage: BuildAndUnitTests
+ displayName: Build and Unit Tests
jobs:
- template: /eng/common/templates/jobs/jobs.yml
parameters:
@@ -56,8 +56,9 @@ stages:
enablePublishUsingPipelines: true
enableTelemetry: true
jobs:
- - job: Windows_BuildAndPack
- displayName: Windows Build, Unit Tests, and Pack
+ # Windows: Full build + unit tests + pack and stage artifacts
+ - job: Windows_BuildPackAndUnitTests
+ displayName: Windows Build, Pack, and Unit Tests
timeoutInMinutes: 90
condition: ne('${{ parameters.SkipTests }}', 'True')
pool:
@@ -118,15 +119,14 @@ stages:
ArtifactName: UnitTestResults_Windows_$(_BuildConfig)_Attempt$(System.JobAttempt)
condition: always()
- # Integration tests on Windows (depends on Windows build)
- - job: Windows_IntegrationTests_MSTest
- displayName: Windows Integration Tests (MSTest)
- dependsOn: Windows_BuildAndPack
+ # Linux: Unit tests only (parallel)
+ - job: Linux_UnitTests
+ displayName: Linux Unit Tests
timeoutInMinutes: 90
condition: ne('${{ parameters.SkipTests }}', 'True')
pool:
name: NetCore-Public
- demands: ImageOverride -equals windows.vs2022preview.amd64.open
+ demands: ImageOverride -equals build.ubuntu.2004.amd64.open
strategy:
matrix:
Debug:
@@ -134,51 +134,44 @@ stages:
Release:
_BuildConfig: Release
steps:
- - task: DownloadBuildArtifacts@0
- displayName: 'Download NuGet packages'
- inputs:
- buildType: 'current'
- downloadType: 'single'
- artifactName: 'NuGetPackages'
- downloadPath: '$(System.DefaultWorkingDirectory)'
- - task: CopyFiles@2
- displayName: 'Copy packages to expected location'
- inputs:
- SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
- Contents: '**'
- TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
- - template: /eng/windows-setup-steps.yml
- - script: eng\common\CIBuild.cmd
+ # Build and run MSTest unit tests
+ - script: eng/common/cibuild.sh
-configuration $(_BuildConfig)
-prepareMachine
+ /p:ProductsToBuild=mstest-unit-tests
+ /p:Test=true
/p:Publish=false
- /p:ProductsToBuild=mstest-integration-tests
- /p:Test=false
+ /p:NonWindowsBuild=true
/p:FastAcceptanceTest=true
- name: Build
- displayName: Build Integration Test Projects
- - script: dotnet test -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
+ displayName: Build and Test MSTest Unit Tests
+
+ # Build and run Testing Platform unit tests
+ - script: eng/common/cibuild.sh
+ -configuration $(_BuildConfig)
+ -prepareMachine
+ /p:ProductsToBuild=testing-platform-unit-tests
+ /p:Test=true
+ /p:Publish=false
+ /p:NonWindowsBuild=true
+ /p:FastAcceptanceTest=true
+ displayName: Build and Test Testing Platform Unit Tests
+
- task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
+ displayName: 'Publish Unit Test Results'
inputs:
PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
- ArtifactName: IntegrationTestResults_Windows_MSTest_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ ArtifactName: UnitTestResults_Linux_$(_BuildConfig)_Attempt$(System.JobAttempt)
condition: always()
- - job: Windows_IntegrationTests_MTP
- displayName: Windows Integration Tests (Testing Platform)
- dependsOn: Windows_BuildAndPack
+ # macOS: Unit tests only (parallel)
+ - job: MacOS_UnitTests
+ displayName: macOS Unit Tests
timeoutInMinutes: 90
condition: ne('${{ parameters.SkipTests }}', 'True')
pool:
- name: NetCore-Public
- demands: ImageOverride -equals windows.vs2022preview.amd64.open
+ name: Azure Pipelines
+ vmImage: macos-latest
+ os: macOS
strategy:
matrix:
Debug:
@@ -186,52 +179,58 @@ stages:
Release:
_BuildConfig: Release
steps:
- - task: DownloadBuildArtifacts@0
- displayName: 'Download NuGet packages'
- inputs:
- buildType: 'current'
- downloadType: 'single'
- artifactName: 'NuGetPackages'
- downloadPath: '$(System.DefaultWorkingDirectory)'
- - task: CopyFiles@2
- displayName: 'Copy packages to expected location'
- inputs:
- SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
- Contents: '**'
- TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
- - template: /eng/windows-setup-steps.yml
- - script: eng\common\CIBuild.cmd
+ # Build and run MSTest unit tests
+ - script: eng/common/cibuild.sh
-configuration $(_BuildConfig)
-prepareMachine
+ /p:ProductsToBuild=mstest-unit-tests
+ /p:Test=true
/p:Publish=false
- /p:ProductsToBuild=testing-platform-integration-tests
- /p:Test=false
+ /p:NonWindowsBuild=true
/p:FastAcceptanceTest=true
- name: Build
- displayName: Build Integration Test Projects
- - script: dotnet test -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
- name: Test
- displayName: Test
- env:
- DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
- NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
- DOTNET_CLI_CONTEXT_VERBOSE: 1
+ displayName: Build and Test MSTest Unit Tests
+
+ # Build and run Testing Platform unit tests
+ - script: eng/common/cibuild.sh
+ -configuration $(_BuildConfig)
+ -prepareMachine
+ /p:ProductsToBuild=testing-platform-unit-tests
+ /p:Test=true
+ /p:Publish=false
+ /p:NonWindowsBuild=true
+ /p:FastAcceptanceTest=true
+ displayName: Build and Test Testing Platform Unit Tests
+
- task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
+ displayName: 'Publish Unit Test Results'
inputs:
PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
- ArtifactName: IntegrationTestResults_Windows_MTP_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ ArtifactName: UnitTestResults_macOS_$(_BuildConfig)_Attempt$(System.JobAttempt)
condition: always()
- # Integration tests on Linux (depends on Windows build)
- - job: Linux_IntegrationTests_MSTest
- displayName: Linux Integration Tests (MSTest)
- dependsOn: Windows_BuildAndPack
+# Stage 2: Integration Tests (depends on Stage 1 completion)
+- stage: IntegrationTests
+ displayName: Integration Tests
+ dependsOn: BuildAndUnitTests
+ jobs:
+ - template: /eng/common/templates/jobs/jobs.yml
+ parameters:
+ enableMicrobuild: true
+ enablePublishBuildArtifacts: true
+ enablePublishTestResults: true
+ testResultsFormat: 'vstest'
+ enablePublishBuildAssets: false
+ enablePublishUsingPipelines: false
+ enableTelemetry: true
+ jobs:
+ # Windows Integration Tests
+ - job: Windows_IntegrationTests
+ displayName: Windows Integration Tests
timeoutInMinutes: 90
condition: ne('${{ parameters.SkipTests }}', 'True')
pool:
name: NetCore-Public
- demands: ImageOverride -equals build.ubuntu.2004.amd64.open
+ demands: ImageOverride -equals windows.vs2022preview.amd64.open
strategy:
matrix:
Debug:
@@ -252,32 +251,50 @@ stages:
SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
Contents: '**'
TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
- - script: eng/common/cibuild.sh
+ - template: /eng/windows-setup-steps.yml
+
+ # Build and run MSTest integration tests
+ - script: eng\common\CIBuild.cmd
-configuration $(_BuildConfig)
-prepareMachine
+ /p:Publish=false
/p:ProductsToBuild=mstest-integration-tests
/p:Test=false
+ /p:FastAcceptanceTest=true
+ displayName: Build MSTest Integration Tests
+ - script: dotnet test test/IntegrationTests/MSTest.Acceptance.IntegrationTests test/IntegrationTests/MSTest.IntegrationTests test/IntegrationTests/PlatformServices.Desktop.IntegrationTests test/IntegrationTests/MSTest.VstestConsoleWrapper.IntegrationTests -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\MSTestIntegrationTests.binlog --no-progress
+ displayName: Run MSTest Integration Tests
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+
+ # Build and run Testing Platform integration tests
+ - script: eng\common\CIBuild.cmd
+ -configuration $(_BuildConfig)
+ -prepareMachine
/p:Publish=false
- /p:NonWindowsBuild=true
+ /p:ProductsToBuild=testing-platform-integration-tests
+ /p:Test=false
/p:FastAcceptanceTest=true
- displayName: Build Integration Test Projects
- - script: dotnet test --solution NonWindowsTests.slnf -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
- name: Test
- displayName: Test
+ displayName: Build Testing Platform Integration Tests
+ - script: dotnet test test/IntegrationTests/Microsoft.Testing.Platform.Acceptance.IntegrationTests -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\MTPIntegrationTests.binlog --no-progress
+ displayName: Run Testing Platform Integration Tests
env:
DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
DOTNET_CLI_CONTEXT_VERBOSE: 1
+
- task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
+ displayName: 'Publish Integration Test Results'
inputs:
PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
- ArtifactName: IntegrationTestResults_Linux_MSTest_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ ArtifactName: IntegrationTestResults_Windows_$(_BuildConfig)_Attempt$(System.JobAttempt)
condition: always()
- - job: Linux_IntegrationTests_MTP
- displayName: Linux Integration Tests (Testing Platform)
- dependsOn: Windows_BuildAndPack
+ # Linux Integration Tests
+ - job: Linux_IntegrationTests
+ displayName: Linux Integration Tests
timeoutInMinutes: 90
condition: ne('${{ parameters.SkipTests }}', 'True')
pool:
@@ -303,6 +320,25 @@ stages:
SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
Contents: '**'
TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+
+ # Build and run MSTest integration tests
+ - script: eng/common/cibuild.sh
+ -configuration $(_BuildConfig)
+ -prepareMachine
+ /p:ProductsToBuild=mstest-integration-tests
+ /p:Test=false
+ /p:Publish=false
+ /p:NonWindowsBuild=true
+ /p:FastAcceptanceTest=true
+ displayName: Build MSTest Integration Tests
+ - script: dotnet test test/IntegrationTests/MSTest.Acceptance.IntegrationTests test/IntegrationTests/MSTest.IntegrationTests test/IntegrationTests/PlatformServices.Desktop.IntegrationTests test/IntegrationTests/MSTest.VstestConsoleWrapper.IntegrationTests -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\MSTestIntegrationTests.binlog --no-progress
+ displayName: Run MSTest Integration Tests
+ env:
+ DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
+ NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
+ DOTNET_CLI_CONTEXT_VERBOSE: 1
+
+ # Build and run Testing Platform integration tests
- script: eng/common/cibuild.sh
-configuration $(_BuildConfig)
-prepareMachine
@@ -311,25 +347,24 @@ stages:
/p:Publish=false
/p:NonWindowsBuild=true
/p:FastAcceptanceTest=true
- displayName: Build Integration Test Projects
- - script: dotnet test --solution NonWindowsTests.slnf -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
- name: Test
- displayName: Test
+ displayName: Build Testing Platform Integration Tests
+ - script: dotnet test test/IntegrationTests/Microsoft.Testing.Platform.Acceptance.IntegrationTests -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\MTPIntegrationTests.binlog --no-progress
+ displayName: Run Testing Platform Integration Tests
env:
DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
DOTNET_CLI_CONTEXT_VERBOSE: 1
+
- task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
+ displayName: 'Publish Integration Test Results'
inputs:
PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
- ArtifactName: IntegrationTestResults_Linux_MTP_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ ArtifactName: IntegrationTestResults_Linux_$(_BuildConfig)_Attempt$(System.JobAttempt)
condition: always()
- # Integration tests on macOS (depends on Windows build)
- - job: MacOS_IntegrationTests_MSTest
- displayName: macOS Integration Tests (MSTest)
- dependsOn: Windows_BuildAndPack
+ # macOS Integration Tests
+ - job: MacOS_IntegrationTests
+ displayName: macOS Integration Tests
timeoutInMinutes: 90
condition: ne('${{ parameters.SkipTests }}', 'True')
pool:
@@ -356,6 +391,8 @@ stages:
SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
Contents: '**'
TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+
+ # Build and run MSTest integration tests
- script: eng/common/cibuild.sh
-configuration $(_BuildConfig)
-prepareMachine
@@ -364,50 +401,15 @@ stages:
/p:Publish=false
/p:NonWindowsBuild=true
/p:FastAcceptanceTest=true
- displayName: Build Integration Test Projects
- - script: dotnet test --solution NonWindowsTests.slnf -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
- name: Test
- displayName: Test
+ displayName: Build MSTest Integration Tests
+ - script: dotnet test test/IntegrationTests/MSTest.Acceptance.IntegrationTests test/IntegrationTests/MSTest.IntegrationTests test/IntegrationTests/PlatformServices.Desktop.IntegrationTests test/IntegrationTests/MSTest.VstestConsoleWrapper.IntegrationTests -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\MSTestIntegrationTests.binlog --no-progress
+ displayName: Run MSTest Integration Tests
env:
DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
DOTNET_CLI_CONTEXT_VERBOSE: 1
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
- ArtifactName: IntegrationTestResults_macOS_MSTest_$(_BuildConfig)_Attempt$(System.JobAttempt)
- condition: always()
- - job: MacOS_IntegrationTests_MTP
- displayName: macOS Integration Tests (Testing Platform)
- dependsOn: Windows_BuildAndPack
- timeoutInMinutes: 90
- condition: ne('${{ parameters.SkipTests }}', 'True')
- pool:
- name: Azure Pipelines
- vmImage: macos-latest
- os: macOS
- strategy:
- matrix:
- Debug:
- _BuildConfig: Debug
- Release:
- _BuildConfig: Release
- steps:
- - task: DownloadBuildArtifacts@0
- displayName: 'Download NuGet packages'
- inputs:
- buildType: 'current'
- downloadType: 'single'
- artifactName: 'NuGetPackages'
- downloadPath: '$(System.DefaultWorkingDirectory)'
- - task: CopyFiles@2
- displayName: 'Copy packages to expected location'
- inputs:
- SourceFolder: '$(System.DefaultWorkingDirectory)/NuGetPackages'
- Contents: '**'
- TargetFolder: '$(Build.SourcesDirectory)/artifacts/packages/Release'
+ # Build and run Testing Platform integration tests
- script: eng/common/cibuild.sh
-configuration $(_BuildConfig)
-prepareMachine
@@ -416,65 +418,17 @@ stages:
/p:Publish=false
/p:NonWindowsBuild=true
/p:FastAcceptanceTest=true
- displayName: Build Integration Test Projects
- - script: dotnet test --solution NonWindowsTests.slnf -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\TestStep.binlog --no-progress
- name: Test
- displayName: Test
+ displayName: Build Testing Platform Integration Tests
+ - script: dotnet test test/IntegrationTests/Microsoft.Testing.Platform.Acceptance.IntegrationTests -c $(_BuildConfig) --no-build -bl:$(BUILD.SOURCESDIRECTORY)\artifacts\TestResults\$(_BuildConfig)\MTPIntegrationTests.binlog --no-progress
+ displayName: Run Testing Platform Integration Tests
env:
DOTNET_ROOT: $(Build.SourcesDirectory)/.dotnet
NUGET_PACKAGES: $(Build.SourcesDirectory)/.packages
DOTNET_CLI_CONTEXT_VERBOSE: 1
+
- task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
+ displayName: 'Publish Integration Test Results'
inputs:
PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
- ArtifactName: IntegrationTestResults_macOS_MTP_$(_BuildConfig)_Attempt$(System.JobAttempt)
+ ArtifactName: IntegrationTestResults_macOS_$(_BuildConfig)_Attempt$(System.JobAttempt)
condition: always()
-
-# Stage 2: Linux Unit Tests (parallel, no dependency)
-- template: /eng/unit-test-stage-template.yml
- parameters:
- stageName: UnitTestsLinux
- displayName: Unit Tests Linux (MSTest)
- os: Linux
- skipTests: ${{ parameters.SkipTests }}
- productFilter: mstest-unit-tests
- pool:
- name: NetCore-Public
- demands: ImageOverride -equals build.ubuntu.2004.amd64.open
-
-- template: /eng/unit-test-stage-template.yml
- parameters:
- stageName: UnitTestsLinuxMTP
- displayName: Unit Tests Linux (Testing Platform)
- os: Linux
- skipTests: ${{ parameters.SkipTests }}
- productFilter: testing-platform-unit-tests
- pool:
- name: NetCore-Public
- demands: ImageOverride -equals build.ubuntu.2004.amd64.open
-
-# Stage 3: macOS Unit Tests (parallel, no dependency)
-- template: /eng/unit-test-stage-template.yml
- parameters:
- stageName: UnitTestsMacOS
- displayName: Unit Tests macOS (MSTest)
- os: macOS
- skipTests: ${{ parameters.SkipTests }}
- productFilter: mstest-unit-tests
- pool:
- name: Azure Pipelines
- vmImage: macos-latest
- os: macOS
-
-- template: /eng/unit-test-stage-template.yml
- parameters:
- stageName: UnitTestsMacOSMTP
- displayName: Unit Tests macOS (Testing Platform)
- os: macOS
- skipTests: ${{ parameters.SkipTests }}
- productFilter: testing-platform-unit-tests
- pool:
- name: Azure Pipelines
- vmImage: macos-latest
- os: macOS
diff --git a/eng/unit-test-stage-template.yml b/eng/unit-test-stage-template.yml
deleted file mode 100644
index 7e3fed21f2..0000000000
--- a/eng/unit-test-stage-template.yml
+++ /dev/null
@@ -1,85 +0,0 @@
-# Template for unit test stages that run independently per platform
-parameters:
-- name: stageName
- type: string
-- name: displayName
- type: string
-- name: os
- type: string
- values:
- - Windows
- - Linux
- - macOS
-- name: skipTests
- type: boolean
- default: false
-- name: pool
- type: object
-- name: solutionFile
- type: string
- default: ''
-- name: productFilter
- type: string
- values:
- - mstest-unit-tests
- - testing-platform-unit-tests
- default: mstest-unit-tests
-
-stages:
-- stage: ${{ parameters.stageName }}
- displayName: ${{ parameters.displayName }}
- jobs:
- - template: /eng/common/templates/jobs/jobs.yml
- parameters:
- enableMicrobuild: true
- enablePublishBuildArtifacts: true
- enablePublishTestResults: true
- testResultsFormat: 'vstest'
- enablePublishBuildAssets: false
- enablePublishUsingPipelines: false
- enableTelemetry: true
- jobs:
- - job: ${{ parameters.os }}_UnitTests
- displayName: ${{ parameters.os }} Unit Tests
- timeoutInMinutes: 90
- condition: ne('${{ parameters.skipTests }}', 'True')
- pool: ${{ parameters.pool }}
- strategy:
- matrix:
- Debug:
- _BuildConfig: Debug
- Release:
- _BuildConfig: Release
- steps:
- # Platform-specific setup steps
- - ${{ if eq(parameters.os, 'Windows') }}:
- - template: /eng/windows-setup-steps.yml
-
- # Build and run unit tests (no dependency on packages)
- - ${{ if eq(parameters.os, 'Windows') }}:
- - script: eng\common\CIBuild.cmd
- -configuration $(_BuildConfig)
- -prepareMachine
- /p:Publish=false
- /p:ProductsToBuild=${{ parameters.productFilter }}
- /p:Test=true
- /p:FastAcceptanceTest=true
- name: BuildAndTest
- displayName: Build and Test Unit Tests
- - ${{ else }}:
- - script: eng/common/cibuild.sh
- -configuration $(_BuildConfig)
- -prepareMachine
- /p:ProductsToBuild=${{ parameters.productFilter }}
- /p:Test=true
- /p:Publish=false
- /p:NonWindowsBuild=true
- /p:FastAcceptanceTest=true
- displayName: Build and Test Unit Tests
-
- - task: PublishBuildArtifacts@1
- displayName: 'Publish Test Results folders'
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
- ArtifactName: UnitTestResults_${{ parameters.os }}_$(_BuildConfig)_Attempt$(System.JobAttempt)
- condition: always()
\ No newline at end of file