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