From d7f6e58b642b9594462670c71a60cc5985181d45 Mon Sep 17 00:00:00 2001 From: aaron burtle Date: Thu, 12 Mar 2026 16:09:06 -0700 Subject: [PATCH 1/9] use parallel jobs to speed up MSSQL pipeline --- .pipelines/mssql-pipelines.yml | 181 +++++++----------- .pipelines/templates/mssql-test-steps.yml | 130 +++++++++++++ .../EntitySourceNamesParserUnitTests.cs | 2 +- .../UnitTests/RequestContextUnitTests.cs | 2 +- .../UnitTests/RequestValidatorUnitTests.cs | 2 +- .../UnitTests/RestServiceUnitTests.cs | 2 +- ...untimeConfigLoaderJsonDeserializerTests.cs | 2 +- 7 files changed, 200 insertions(+), 121 deletions(-) create mode 100644 .pipelines/templates/mssql-test-steps.yml diff --git a/.pipelines/mssql-pipelines.yml b/.pipelines/mssql-pipelines.yml index d2d2d8c7fa..d52fb1d74b 100644 --- a/.pipelines/mssql-pipelines.yml +++ b/.pipelines/mssql-pipelines.yml @@ -1,9 +1,11 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. -# MsSql Integration Testing Pipeline config is split into two jobs: -# 1) LinuxTests -> Run SQL Server 2019 in Linux Docker Image -# 2) WindowsTests -> Run LocalDB preinstalled on machine +# MsSql Integration Testing Pipeline config is split into parallel jobs: +# 1) linux (disabled) -> Run SQL Server 2019 in Linux Docker Image +# 2) windows_graphql -> GraphQL integration tests on LocalDB +# 3) windows_rest_and_other -> REST API, Config, Auth, Unit tests on LocalDB +# 4) windows_hotreload -> Hot-Reload tests on LocalDB (long timeouts) trigger: batch: true @@ -151,7 +153,15 @@ jobs: summaryFileLocation: '$(Agent.TempDirectory)/**/*cobertura.xml' -- job: windows +# MsSql Integration Testing is split into three parallel jobs: +# 1) windows_graphql -> GraphQL integration tests (SqlTests.GraphQL*) +# 2) windows_rest_and_other -> REST API, Configuration, Authorization, Unit, and other tests +# 3) windows_hotreload -> ConfigurationHotReloadTests (long timeouts, isolated) +# +# All three jobs run in parallel on separate VMs with their own LocalDB instance. + +- job: windows_graphql + displayName: 'Windows - GraphQL Integration Tests' pool: vmImage: 'windows-latest' variables: @@ -167,117 +177,56 @@ jobs: SqlVersionCode: '15.0' steps: - - task: CmdLine@2 - displayName: 'Set flag to publish received files when previous step fails' - condition: failed() - inputs: - script: 'echo ##vso[task.setvariable variable=publishverify]Yes' - - - task: NuGetAuthenticate@1 - displayName: 'NuGet Authenticate' - - # The .NET CLI commands in proceeding tasks use the .NET SDK version specified ("selected") here. - # Per Microsoft Learn Docs, "Selecting the .NET SDK version is independent from - # specifying the runtime version a project targets." - - task: UseDotNet@2 - displayName: Setup .NET SDK v8.0.x - inputs: - packageType: sdk - version: 8.0.x - - - task: NuGetToolInstaller@1 - - - task: DotNetCoreCLI@2 - displayName: Restore NuGet packages - inputs: - command: restore - projects: '$(solution)' - feedsToUse: config - nugetConfigPath: Nuget.config - restoreArguments: '/p:RuntimeIdentifiers=""' - - - task: PowerShell@2 - displayName: Install SQL LocalDB - inputs: - targetType: 'inline' - script: | - SqlLocalDb.exe start - SqlLocalDB.exe info "MSSQLLocalDB" - Write-Host "Downloading" - Import-Module BitsTransfer - Start-BitsTransfer -Source $(InstallerUrl) -Destination SqlLocalDB.msi - Write-Host "Installing" - Start-Process -FilePath "SqlLocalDB.msi" -Wait -ArgumentList "/qn", "/norestart", "/l*v SqlLocalDBInstall.log", "IACCEPTSQLLOCALDBLICENSETERMS=YES"; - SqlLocalDB.exe stop MSSQLLocalDB -k - SqlLocalDB.exe delete MSSQLLocalDB - - - task: PowerShell@2 - displayName: 'Start MSSQLLocalDB' - inputs: - targetType: 'inline' - script: | - SqlLocalDb.exe start MSSQLLocalDB - SqlLocalDb.exe info "MSSQLLocalDB" - - - task: DotNetCoreCLI@2 - displayName: Build - inputs: - command: build - projects: | - **/*.csproj - !**/*Tests*.csproj - arguments: '-p:generateConfigFileForDbType=MsSql --configuration $(buildConfiguration)' # Update this to match your need - - - task: DotNetCoreCLI@2 - displayName: Build Test Projects - inputs: - command: build - projects: '**/*Tests/*.csproj' - arguments: '--configuration $(buildConfiguration)' - - - task: FileTransform@1.206.0 - displayName: 'Generate dab-config.MsSql.json' - inputs: - folderPath: '$(System.DefaultWorkingDirectory)' - fileType: 'json' - targetFiles: 'src/out/tests/*/dab-config.MsSql.json' - - - task: DotNetCoreCLI@2 - displayName: 'MsSql Integration Tests' - inputs: - command: test - arguments: '--filter "TestCategory=MsSql&FullyQualifiedName!~ConfigurationHotReloadTests" --no-build --configuration $(buildConfiguration) --collect "XPlat Code coverage"' - projects: '**/*Tests/*.csproj' - - - - task: DotNetCoreCLI@2 - displayName: 'Hot-Reload Tests' - inputs: - command: test - arguments: '--filter "TestCategory=MsSql&FullyQualifiedName~ConfigurationHotReloadTests" --no-build --configuration $(buildConfiguration) --collect "XPlat Code coverage" --logger "console;verbosity=detailed"' - projects: '**/*Tests/*.csproj' - timeoutInMinutes: 45 - - - task: PublishCodeCoverageResults@1 - displayName: 'Publish code coverage' - inputs: - codeCoverageTool: Cobertura - summaryFileLocation: '$(Agent.TempDirectory)/**/*cobertura.xml' + - template: templates/mssql-test-steps.yml + parameters: + testFilter: 'TestCategory=MsSql&FullyQualifiedName~SqlTests.GraphQL' + testDisplayName: 'MsSql GraphQL Integration Tests' + artifactSuffix: '-GraphQL' + +- job: windows_rest_and_other + displayName: 'Windows - REST & Other Integration Tests' + pool: + vmImage: 'windows-latest' + variables: + solution: '**/*.sln' + buildPlatform: 'Any CPU' + buildConfiguration: 'Release' + # Need to override the connection string set on the pipeline UI + # since windows needs a different string. + # The variable setting on the pipeline UI sets the connection string + # for the linux job above. + data-source.connection-string: Server=(localdb)\MSSQLLocalDB;Persist Security Info=False;Integrated Security=True;MultipleActiveResultSets=False;Connection Timeout=30;TrustServerCertificate=True; + InstallerUrl: https://download.microsoft.com/download/7/c/1/7c14e92e-bdcb-4f89-b7cf-93543e7112d1/SqlLocalDB.msi + SqlVersionCode: '15.0' - - task: CopyFiles@2 - condition: eq(variables['publishverify'], 'Yes') - displayName: 'Copy received files to Artifact Staging' - inputs: - contents: '**\*.received.*' - targetFolder: '$(Build.ArtifactStagingDirectory)\Verify' - cleanTargetFolder: true - overWrite: true + steps: + - template: templates/mssql-test-steps.yml + parameters: + testFilter: 'TestCategory=MsSql&FullyQualifiedName!~SqlTests.GraphQL&FullyQualifiedName!~ConfigurationHotReloadTests' + testDisplayName: 'MsSql REST & Other Integration Tests' + artifactSuffix: '-RestAndOther' + +- job: windows_hotreload + displayName: 'Windows - Hot-Reload Tests' + pool: + vmImage: 'windows-latest' + variables: + solution: '**/*.sln' + buildPlatform: 'Any CPU' + buildConfiguration: 'Release' + # Need to override the connection string set on the pipeline UI + # since windows needs a different string. + # The variable setting on the pipeline UI sets the connection string + # for the linux job above. + data-source.connection-string: Server=(localdb)\MSSQLLocalDB;Persist Security Info=False;Integrated Security=True;MultipleActiveResultSets=False;Connection Timeout=30;TrustServerCertificate=True; + InstallerUrl: https://download.microsoft.com/download/7/c/1/7c14e92e-bdcb-4f89-b7cf-93543e7112d1/SqlLocalDB.msi + SqlVersionCode: '15.0' - - task: PublishBuildArtifacts@1 - displayName: 'Publish received files as Artifacts' - name: 'verifypublish' - condition: eq(variables['publishverify'], 'Yes') - inputs: - PathtoPublish: '$(Build.ArtifactStagingDirectory)\Verify' - ArtifactName: 'Verify' - publishLocation: 'Container' + steps: + - template: templates/mssql-test-steps.yml + parameters: + testFilter: 'TestCategory=MsSql&FullyQualifiedName~ConfigurationHotReloadTests' + testDisplayName: 'MsSql Hot-Reload Tests' + testTimeout: 45 + additionalTestArgs: '--logger "console;verbosity=detailed"' + artifactSuffix: '-HotReload' diff --git a/.pipelines/templates/mssql-test-steps.yml b/.pipelines/templates/mssql-test-steps.yml new file mode 100644 index 0000000000..e949b3802e --- /dev/null +++ b/.pipelines/templates/mssql-test-steps.yml @@ -0,0 +1,130 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# Common setup and test execution steps for MSSQL integration test jobs. +# Used by mssql-pipelines.yml to run parallel test jobs. + +parameters: + - name: testFilter + type: string + - name: testDisplayName + type: string + default: 'MsSql Integration Tests' + - name: testTimeout + type: number + default: 0 + - name: additionalTestArgs + type: string + default: '' + - name: artifactSuffix + type: string + default: '' + +steps: +- task: CmdLine@2 + displayName: 'Set flag to publish received files when previous step fails' + condition: failed() + inputs: + script: 'echo ##vso[task.setvariable variable=publishverify]Yes' + +- task: NuGetAuthenticate@1 + displayName: 'NuGet Authenticate' + +# The .NET CLI commands in proceeding tasks use the .NET SDK version specified ("selected") here. +# Per Microsoft Learn Docs, "Selecting the .NET SDK version is independent from +# specifying the runtime version a project targets." +- task: UseDotNet@2 + displayName: Setup .NET SDK v8.0.x + inputs: + packageType: sdk + version: 8.0.x + +- task: NuGetToolInstaller@1 + +- task: DotNetCoreCLI@2 + displayName: Restore NuGet packages + inputs: + command: restore + projects: '$(solution)' + feedsToUse: config + nugetConfigPath: Nuget.config + restoreArguments: '/p:RuntimeIdentifiers=""' + +- task: PowerShell@2 + displayName: Install SQL LocalDB + inputs: + targetType: 'inline' + script: | + SqlLocalDb.exe start + SqlLocalDB.exe info "MSSQLLocalDB" + Write-Host "Downloading" + Import-Module BitsTransfer + Start-BitsTransfer -Source $(InstallerUrl) -Destination SqlLocalDB.msi + Write-Host "Installing" + Start-Process -FilePath "SqlLocalDB.msi" -Wait -ArgumentList "/qn", "/norestart", "/l*v SqlLocalDBInstall.log", "IACCEPTSQLLOCALDBLICENSETERMS=YES"; + SqlLocalDB.exe stop MSSQLLocalDB -k + SqlLocalDB.exe delete MSSQLLocalDB + +- task: PowerShell@2 + displayName: 'Start MSSQLLocalDB' + inputs: + targetType: 'inline' + script: | + SqlLocalDb.exe start MSSQLLocalDB + SqlLocalDb.exe info "MSSQLLocalDB" + +- task: DotNetCoreCLI@2 + displayName: Build + inputs: + command: build + projects: | + **/*.csproj + !**/*Tests*.csproj + arguments: '-p:generateConfigFileForDbType=MsSql --configuration $(buildConfiguration)' # Update this to match your need + +- task: DotNetCoreCLI@2 + displayName: Build Test Projects + inputs: + command: build + projects: '**/*Tests/*.csproj' + arguments: '--configuration $(buildConfiguration)' + +- task: FileTransform@1.206.0 + displayName: 'Generate dab-config.MsSql.json' + inputs: + folderPath: '$(System.DefaultWorkingDirectory)' + fileType: 'json' + targetFiles: 'src/out/tests/*/dab-config.MsSql.json' + +- task: DotNetCoreCLI@2 + displayName: '${{ parameters.testDisplayName }}' + inputs: + command: test + arguments: '--filter "${{ parameters.testFilter }}" --no-build --configuration $(buildConfiguration) --collect "XPlat Code coverage" ${{ parameters.additionalTestArgs }}' + projects: '**/*Tests/*.csproj' + ${{ if ne(parameters.testTimeout, 0) }}: + timeoutInMinutes: ${{ parameters.testTimeout }} + +- task: PublishCodeCoverageResults@1 + displayName: 'Publish code coverage' + inputs: + codeCoverageTool: Cobertura + summaryFileLocation: '$(Agent.TempDirectory)/**/*cobertura.xml' + +- task: CopyFiles@2 + condition: eq(variables['publishverify'], 'Yes') + displayName: 'Copy received files to Artifact Staging' + inputs: + contents: '**\*.received.*' + targetFolder: '$(Build.ArtifactStagingDirectory)\Verify' + cleanTargetFolder: true + overWrite: true + +- task: PublishBuildArtifacts@1 + displayName: 'Publish received files as Artifacts' + name: 'verifypublish' + condition: eq(variables['publishverify'], 'Yes') + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\Verify' + ArtifactName: 'Verify${{ parameters.artifactSuffix }}' + publishLocation: 'Container' diff --git a/src/Service.Tests/UnitTests/EntitySourceNamesParserUnitTests.cs b/src/Service.Tests/UnitTests/EntitySourceNamesParserUnitTests.cs index 3acf94b946..3e04e4353b 100644 --- a/src/Service.Tests/UnitTests/EntitySourceNamesParserUnitTests.cs +++ b/src/Service.Tests/UnitTests/EntitySourceNamesParserUnitTests.cs @@ -13,7 +13,7 @@ namespace Azure.DataApiBuilder.Service.Tests.UnitTests /// can handle a wide range of valid formats correctly, /// and throws exceptions for invalid formats as expected. /// - [TestClass, TestCategory(TestCategory.MSSQL)] + [TestClass] public class EntitySourceNamesParserUnitTests { diff --git a/src/Service.Tests/UnitTests/RequestContextUnitTests.cs b/src/Service.Tests/UnitTests/RequestContextUnitTests.cs index afbd812628..d6ab84d838 100644 --- a/src/Service.Tests/UnitTests/RequestContextUnitTests.cs +++ b/src/Service.Tests/UnitTests/RequestContextUnitTests.cs @@ -16,7 +16,7 @@ namespace Azure.DataApiBuilder.Service.Tests.UnitTests /// Context classes that are not easily tested through /// integration testing. /// - [TestClass, TestCategory(TestCategory.MSSQL)] + [TestClass] public class RequestContextUnitTests { private static DatabaseObject _defaultDbObject = new DatabaseTable() diff --git a/src/Service.Tests/UnitTests/RequestValidatorUnitTests.cs b/src/Service.Tests/UnitTests/RequestValidatorUnitTests.cs index 5be1375c0f..35c86abc82 100644 --- a/src/Service.Tests/UnitTests/RequestValidatorUnitTests.cs +++ b/src/Service.Tests/UnitTests/RequestValidatorUnitTests.cs @@ -25,7 +25,7 @@ namespace Azure.DataApiBuilder.Service.Tests.UnitTests /// Unit tests for RequestValidator.cs. Makes sure the proper primary key validation /// occurs for REST requests for FindOne(). /// - [TestClass, TestCategory(TestCategory.MSSQL)] + [TestClass] public class RequestValidatorUnitTests { private static Mock _mockMetadataStore; diff --git a/src/Service.Tests/UnitTests/RestServiceUnitTests.cs b/src/Service.Tests/UnitTests/RestServiceUnitTests.cs index 3f296b4403..ac7b3667e6 100644 --- a/src/Service.Tests/UnitTests/RestServiceUnitTests.cs +++ b/src/Service.Tests/UnitTests/RestServiceUnitTests.cs @@ -25,7 +25,7 @@ namespace Azure.DataApiBuilder.Service.Tests.UnitTests { - [TestClass, TestCategory(TestCategory.MSSQL)] + [TestClass] public class RestServiceUnitTests { private static RestService _restService; diff --git a/src/Service.Tests/UnitTests/RuntimeConfigLoaderJsonDeserializerTests.cs b/src/Service.Tests/UnitTests/RuntimeConfigLoaderJsonDeserializerTests.cs index c34290999a..347bf5e328 100644 --- a/src/Service.Tests/UnitTests/RuntimeConfigLoaderJsonDeserializerTests.cs +++ b/src/Service.Tests/UnitTests/RuntimeConfigLoaderJsonDeserializerTests.cs @@ -27,7 +27,7 @@ namespace Azure.DataApiBuilder.Service.Tests.UnitTests /// we throw the right exception when environment /// variable names are not found. /// - [TestClass, TestCategory(TestCategory.MSSQL)] + [TestClass] public class RuntimeConfigLoaderJsonDeserializerTests { #region Positive Tests From 91d1eefc880417d28078767e4a45f3657964f528 Mon Sep 17 00:00:00 2001 From: aaron burtle Date: Thu, 12 Mar 2026 19:28:41 -0700 Subject: [PATCH 2/9] hot reload test fix and split more --- .pipelines/mssql-pipelines.yml | 48 +++++++++++++++++------ .pipelines/templates/mssql-test-steps.yml | 14 +++++++ 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/.pipelines/mssql-pipelines.yml b/.pipelines/mssql-pipelines.yml index d52fb1d74b..234a35a996 100644 --- a/.pipelines/mssql-pipelines.yml +++ b/.pipelines/mssql-pipelines.yml @@ -4,8 +4,9 @@ # MsSql Integration Testing Pipeline config is split into parallel jobs: # 1) linux (disabled) -> Run SQL Server 2019 in Linux Docker Image # 2) windows_graphql -> GraphQL integration tests on LocalDB -# 3) windows_rest_and_other -> REST API, Config, Auth, Unit tests on LocalDB -# 4) windows_hotreload -> Hot-Reload tests on LocalDB (long timeouts) +# 3) windows_rest -> REST API tests on LocalDB +# 4) windows_config_and_other -> Config, Auth, Unit tests on LocalDB +# 5) windows_hotreload -> Hot-Reload tests on LocalDB (long timeouts) trigger: batch: true @@ -153,12 +154,13 @@ jobs: summaryFileLocation: '$(Agent.TempDirectory)/**/*cobertura.xml' -# MsSql Integration Testing is split into three parallel jobs: +# MsSql Integration Testing is split into four parallel jobs: # 1) windows_graphql -> GraphQL integration tests (SqlTests.GraphQL*) -# 2) windows_rest_and_other -> REST API, Configuration, Authorization, Unit, and other tests -# 3) windows_hotreload -> ConfigurationHotReloadTests (long timeouts, isolated) +# 2) windows_rest -> REST API tests (SqlTests.Rest*) +# 3) windows_config_and_other -> Configuration, Authorization, Unit, and other tests +# 4) windows_hotreload -> ConfigurationHotReloadTests (long timeouts, isolated) # -# All three jobs run in parallel on separate VMs with their own LocalDB instance. +# All four jobs run in parallel on separate VMs with their own LocalDB instance. - job: windows_graphql displayName: 'Windows - GraphQL Integration Tests' @@ -183,8 +185,8 @@ jobs: testDisplayName: 'MsSql GraphQL Integration Tests' artifactSuffix: '-GraphQL' -- job: windows_rest_and_other - displayName: 'Windows - REST & Other Integration Tests' +- job: windows_rest + displayName: 'Windows - REST Integration Tests' pool: vmImage: 'windows-latest' variables: @@ -202,9 +204,32 @@ jobs: steps: - template: templates/mssql-test-steps.yml parameters: - testFilter: 'TestCategory=MsSql&FullyQualifiedName!~SqlTests.GraphQL&FullyQualifiedName!~ConfigurationHotReloadTests' - testDisplayName: 'MsSql REST & Other Integration Tests' - artifactSuffix: '-RestAndOther' + testFilter: 'TestCategory=MsSql&FullyQualifiedName~SqlTests.Rest' + testDisplayName: 'MsSql REST Integration Tests' + artifactSuffix: '-REST' + +- job: windows_config_and_other + displayName: 'Windows - Config & Other Integration Tests' + pool: + vmImage: 'windows-latest' + variables: + solution: '**/*.sln' + buildPlatform: 'Any CPU' + buildConfiguration: 'Release' + # Need to override the connection string set on the pipeline UI + # since windows needs a different string. + # The variable setting on the pipeline UI sets the connection string + # for the linux job above. + data-source.connection-string: Server=(localdb)\MSSQLLocalDB;Persist Security Info=False;Integrated Security=True;MultipleActiveResultSets=False;Connection Timeout=30;TrustServerCertificate=True; + InstallerUrl: https://download.microsoft.com/download/7/c/1/7c14e92e-bdcb-4f89-b7cf-93543e7112d1/SqlLocalDB.msi + SqlVersionCode: '15.0' + + steps: + - template: templates/mssql-test-steps.yml + parameters: + testFilter: 'TestCategory=MsSql&FullyQualifiedName!~SqlTests.GraphQL&FullyQualifiedName!~SqlTests.Rest&FullyQualifiedName!~ConfigurationHotReloadTests' + testDisplayName: 'MsSql Config & Other Integration Tests' + artifactSuffix: '-ConfigAndOther' - job: windows_hotreload displayName: 'Windows - Hot-Reload Tests' @@ -230,3 +255,4 @@ jobs: testTimeout: 45 additionalTestArgs: '--logger "console;verbosity=detailed"' artifactSuffix: '-HotReload' + initDbSchema: true diff --git a/.pipelines/templates/mssql-test-steps.yml b/.pipelines/templates/mssql-test-steps.yml index e949b3802e..1df5172b07 100644 --- a/.pipelines/templates/mssql-test-steps.yml +++ b/.pipelines/templates/mssql-test-steps.yml @@ -19,6 +19,9 @@ parameters: - name: artifactSuffix type: string default: '' + - name: initDbSchema + type: boolean + default: false steps: - task: CmdLine@2 @@ -73,6 +76,17 @@ steps: SqlLocalDb.exe start MSSQLLocalDB SqlLocalDb.exe info "MSSQLLocalDB" +- ${{ if eq(parameters.initDbSchema, true) }}: + - task: PowerShell@2 + displayName: 'Initialize database schema' + inputs: + targetType: 'inline' + script: | + Write-Host "Running DatabaseSchema-MsSql.sql against LocalDB..." + sqlcmd -S "(localdb)\MSSQLLocalDB" -i "$(System.DefaultWorkingDirectory)\src\Service.Tests\DatabaseSchema-MsSql.sql" + if ($LASTEXITCODE -ne 0) { throw "Schema initialization failed with exit code $LASTEXITCODE" } + Write-Host "Database schema initialized successfully." + - task: DotNetCoreCLI@2 displayName: Build inputs: From e4f7762c6c77e132b8066c1392a93d73bb0572a5 Mon Sep 17 00:00:00 2001 From: aaron burtle Date: Thu, 12 Mar 2026 22:04:12 -0700 Subject: [PATCH 3/9] balance tests --- .pipelines/mssql-pipelines.yml | 47 ++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/.pipelines/mssql-pipelines.yml b/.pipelines/mssql-pipelines.yml index 234a35a996..e7e7b0d6a6 100644 --- a/.pipelines/mssql-pipelines.yml +++ b/.pipelines/mssql-pipelines.yml @@ -5,8 +5,9 @@ # 1) linux (disabled) -> Run SQL Server 2019 in Linux Docker Image # 2) windows_graphql -> GraphQL integration tests on LocalDB # 3) windows_rest -> REST API tests on LocalDB -# 4) windows_config_and_other -> Config, Auth, Unit tests on LocalDB -# 5) windows_hotreload -> Hot-Reload tests on LocalDB (long timeouts) +# 4) windows_config_and_integration -> Config, Auth, OpenApi, Telemetry tests on LocalDB +# 5) windows_unittests -> MsSql unit tests on LocalDB +# 6) windows_hotreload -> Hot-Reload tests on LocalDB (long timeouts) trigger: batch: true @@ -154,13 +155,14 @@ jobs: summaryFileLocation: '$(Agent.TempDirectory)/**/*cobertura.xml' -# MsSql Integration Testing is split into four parallel jobs: +# MsSql Integration Testing is split into five parallel jobs: # 1) windows_graphql -> GraphQL integration tests (SqlTests.GraphQL*) # 2) windows_rest -> REST API tests (SqlTests.Rest*) -# 3) windows_config_and_other -> Configuration, Authorization, Unit, and other tests -# 4) windows_hotreload -> ConfigurationHotReloadTests (long timeouts, isolated) +# 3) windows_config_and_integration -> Configuration, Authorization, OpenApi, Telemetry tests +# 4) windows_unittests -> MsSql unit tests (UnitTests.*) +# 5) windows_hotreload -> ConfigurationHotReloadTests (long timeouts, isolated) # -# All four jobs run in parallel on separate VMs with their own LocalDB instance. +# All five jobs run in parallel on separate VMs with their own LocalDB instance. - job: windows_graphql displayName: 'Windows - GraphQL Integration Tests' @@ -208,8 +210,8 @@ jobs: testDisplayName: 'MsSql REST Integration Tests' artifactSuffix: '-REST' -- job: windows_config_and_other - displayName: 'Windows - Config & Other Integration Tests' +- job: windows_config_and_integration + displayName: 'Windows - Config & Integration Tests' pool: vmImage: 'windows-latest' variables: @@ -227,9 +229,32 @@ jobs: steps: - template: templates/mssql-test-steps.yml parameters: - testFilter: 'TestCategory=MsSql&FullyQualifiedName!~SqlTests.GraphQL&FullyQualifiedName!~SqlTests.Rest&FullyQualifiedName!~ConfigurationHotReloadTests' - testDisplayName: 'MsSql Config & Other Integration Tests' - artifactSuffix: '-ConfigAndOther' + testFilter: 'TestCategory=MsSql&FullyQualifiedName!~SqlTests.GraphQL&FullyQualifiedName!~SqlTests.Rest&FullyQualifiedName!~ConfigurationHotReloadTests&FullyQualifiedName!~UnitTests' + testDisplayName: 'MsSql Config & Integration Tests' + artifactSuffix: '-ConfigAndIntegration' + +- job: windows_unittests + displayName: 'Windows - MsSql Unit Tests' + pool: + vmImage: 'windows-latest' + variables: + solution: '**/*.sln' + buildPlatform: 'Any CPU' + buildConfiguration: 'Release' + # Need to override the connection string set on the pipeline UI + # since windows needs a different string. + # The variable setting on the pipeline UI sets the connection string + # for the linux job above. + data-source.connection-string: Server=(localdb)\MSSQLLocalDB;Persist Security Info=False;Integrated Security=True;MultipleActiveResultSets=False;Connection Timeout=30;TrustServerCertificate=True; + InstallerUrl: https://download.microsoft.com/download/7/c/1/7c14e92e-bdcb-4f89-b7cf-93543e7112d1/SqlLocalDB.msi + SqlVersionCode: '15.0' + + steps: + - template: templates/mssql-test-steps.yml + parameters: + testFilter: 'TestCategory=MsSql&FullyQualifiedName~UnitTests' + testDisplayName: 'MsSql Unit Tests' + artifactSuffix: '-UnitTests' - job: windows_hotreload displayName: 'Windows - Hot-Reload Tests' From f16c11cd2eabc304a07c54c3baacca23f89f2258 Mon Sep 17 00:00:00 2001 From: aaron burtle Date: Thu, 12 Mar 2026 23:17:59 -0700 Subject: [PATCH 4/9] fix broken tests --- .pipelines/mssql-pipelines.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.pipelines/mssql-pipelines.yml b/.pipelines/mssql-pipelines.yml index e7e7b0d6a6..eadd9d453f 100644 --- a/.pipelines/mssql-pipelines.yml +++ b/.pipelines/mssql-pipelines.yml @@ -232,6 +232,7 @@ jobs: testFilter: 'TestCategory=MsSql&FullyQualifiedName!~SqlTests.GraphQL&FullyQualifiedName!~SqlTests.Rest&FullyQualifiedName!~ConfigurationHotReloadTests&FullyQualifiedName!~UnitTests' testDisplayName: 'MsSql Config & Integration Tests' artifactSuffix: '-ConfigAndIntegration' + initDbSchema: true - job: windows_unittests displayName: 'Windows - MsSql Unit Tests' @@ -255,6 +256,7 @@ jobs: testFilter: 'TestCategory=MsSql&FullyQualifiedName~UnitTests' testDisplayName: 'MsSql Unit Tests' artifactSuffix: '-UnitTests' + initDbSchema: true - job: windows_hotreload displayName: 'Windows - Hot-Reload Tests' From 0569e28c714f37cf2c37ec2415609d2453f6adbf Mon Sep 17 00:00:00 2001 From: aaron burtle Date: Fri, 13 Mar 2026 01:11:42 -0700 Subject: [PATCH 5/9] balance tests and fix failures --- .pipelines/mssql-pipelines.yml | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/.pipelines/mssql-pipelines.yml b/.pipelines/mssql-pipelines.yml index eadd9d453f..a88500d21a 100644 --- a/.pipelines/mssql-pipelines.yml +++ b/.pipelines/mssql-pipelines.yml @@ -6,8 +6,8 @@ # 2) windows_graphql -> GraphQL integration tests on LocalDB # 3) windows_rest -> REST API tests on LocalDB # 4) windows_config_and_integration -> Config, Auth, OpenApi, Telemetry tests on LocalDB -# 5) windows_unittests -> MsSql unit tests on LocalDB -# 6) windows_hotreload -> Hot-Reload tests on LocalDB (long timeouts) +# 5) windows_unittests -> MsSql unit tests on LocalDB (starts after GraphQL) +# 6) windows_hotreload -> Hot-Reload tests on LocalDB (starts after GraphQL) trigger: batch: true @@ -155,14 +155,19 @@ jobs: summaryFileLocation: '$(Agent.TempDirectory)/**/*cobertura.xml' -# MsSql Integration Testing is split into five parallel jobs: +# MsSql Integration Testing is split into five jobs across two phases: +# Phase 1 (immediate, 3 agents): GraphQL, REST, Config & Integration +# Phase 2 (after GraphQL, 2 agents): Unit Tests, Hot-Reload +# +# This staggering keeps peak agent usage at 3-4 instead of 5, reducing +# contention with the org-wide Microsoft-Hosted parallelism limit (10), +# while maintaining the same ~30 min wall-clock time. +# # 1) windows_graphql -> GraphQL integration tests (SqlTests.GraphQL*) # 2) windows_rest -> REST API tests (SqlTests.Rest*) # 3) windows_config_and_integration -> Configuration, Authorization, OpenApi, Telemetry tests -# 4) windows_unittests -> MsSql unit tests (UnitTests.*) -# 5) windows_hotreload -> ConfigurationHotReloadTests (long timeouts, isolated) -# -# All five jobs run in parallel on separate VMs with their own LocalDB instance. +# 4) windows_unittests -> MsSql unit tests (dependsOn: graphql) +# 5) windows_hotreload -> ConfigurationHotReloadTests (dependsOn: graphql) - job: windows_graphql displayName: 'Windows - GraphQL Integration Tests' @@ -236,6 +241,7 @@ jobs: - job: windows_unittests displayName: 'Windows - MsSql Unit Tests' + dependsOn: windows_graphql pool: vmImage: 'windows-latest' variables: @@ -260,6 +266,7 @@ jobs: - job: windows_hotreload displayName: 'Windows - Hot-Reload Tests' + dependsOn: windows_graphql pool: vmImage: 'windows-latest' variables: From 8fc69e906a87f2fcef766a20e1e2ba28baed9890 Mon Sep 17 00:00:00 2001 From: aaron burtle Date: Fri, 13 Mar 2026 02:45:21 -0700 Subject: [PATCH 6/9] set to the jobs and balance --- .pipelines/mssql-pipelines.yml | 103 +++++----------------- .pipelines/templates/mssql-test-steps.yml | 25 +++++- 2 files changed, 44 insertions(+), 84 deletions(-) diff --git a/.pipelines/mssql-pipelines.yml b/.pipelines/mssql-pipelines.yml index a88500d21a..53a42de102 100644 --- a/.pipelines/mssql-pipelines.yml +++ b/.pipelines/mssql-pipelines.yml @@ -3,11 +3,9 @@ # MsSql Integration Testing Pipeline config is split into parallel jobs: # 1) linux (disabled) -> Run SQL Server 2019 in Linux Docker Image -# 2) windows_graphql -> GraphQL integration tests on LocalDB -# 3) windows_rest -> REST API tests on LocalDB -# 4) windows_config_and_integration -> Config, Auth, OpenApi, Telemetry tests on LocalDB -# 5) windows_unittests -> MsSql unit tests on LocalDB (starts after GraphQL) -# 6) windows_hotreload -> Hot-Reload tests on LocalDB (starts after GraphQL) +# 2) windows_graphql_and_hotreload -> GraphQL + HotReload tests on LocalDB +# 3) windows_rest_and_unit -> REST + Unit tests on LocalDB +# 4) windows_config_and_integration -> Config, Auth, OpenApi, Telemetry on LocalDB (with schema init) trigger: batch: true @@ -155,22 +153,19 @@ jobs: summaryFileLocation: '$(Agent.TempDirectory)/**/*cobertura.xml' -# MsSql Integration Testing is split into five jobs across two phases: -# Phase 1 (immediate, 3 agents): GraphQL, REST, Config & Integration -# Phase 2 (after GraphQL, 2 agents): Unit Tests, Hot-Reload -# -# This staggering keeps peak agent usage at 3-4 instead of 5, reducing -# contention with the org-wide Microsoft-Hosted parallelism limit (10), -# while maintaining the same ~30 min wall-clock time. -# -# 1) windows_graphql -> GraphQL integration tests (SqlTests.GraphQL*) -# 2) windows_rest -> REST API tests (SqlTests.Rest*) -# 3) windows_config_and_integration -> Configuration, Authorization, OpenApi, Telemetry tests -# 4) windows_unittests -> MsSql unit tests (dependsOn: graphql) -# 5) windows_hotreload -> ConfigurationHotReloadTests (dependsOn: graphql) +# MsSql Integration Testing is split into three parallel jobs (~30 min each): +# 1) windows_graphql_and_hotreload -> GraphQL + HotReload tests (597 tests) +# GraphQL tests inherit SqlTestBase which creates the DB schema; +# HotReload tests then find the schema already in place. +# 2) windows_rest_and_unit -> REST + Unit tests (541 tests) +# REST tests inherit SqlTestBase which creates the DB schema; +# Unit tests then find the schema already in place. +# 3) windows_config_and_integration -> Config, Auth, OpenApi, Telemetry (315 tests) +# No SqlTestBase tests in this bucket, so initDbSchema creates the +# schema via SqlClient before tests run. -- job: windows_graphql - displayName: 'Windows - GraphQL Integration Tests' +- job: windows_graphql_and_hotreload + displayName: 'Windows - GraphQL & Hot-Reload Tests' pool: vmImage: 'windows-latest' variables: @@ -188,12 +183,12 @@ jobs: steps: - template: templates/mssql-test-steps.yml parameters: - testFilter: 'TestCategory=MsSql&FullyQualifiedName~SqlTests.GraphQL' - testDisplayName: 'MsSql GraphQL Integration Tests' - artifactSuffix: '-GraphQL' + testFilter: 'TestCategory=MsSql&(FullyQualifiedName~SqlTests.GraphQL|FullyQualifiedName~ConfigurationHotReloadTests)' + testDisplayName: 'MsSql GraphQL & Hot-Reload Tests' + artifactSuffix: '-GraphQLAndHotReload' -- job: windows_rest - displayName: 'Windows - REST Integration Tests' +- job: windows_rest_and_unit + displayName: 'Windows - REST & Unit Tests' pool: vmImage: 'windows-latest' variables: @@ -211,9 +206,9 @@ jobs: steps: - template: templates/mssql-test-steps.yml parameters: - testFilter: 'TestCategory=MsSql&FullyQualifiedName~SqlTests.Rest' - testDisplayName: 'MsSql REST Integration Tests' - artifactSuffix: '-REST' + testFilter: 'TestCategory=MsSql&(FullyQualifiedName~SqlTests.Rest|FullyQualifiedName~UnitTests)' + testDisplayName: 'MsSql REST & Unit Tests' + artifactSuffix: '-RestAndUnit' - job: windows_config_and_integration displayName: 'Windows - Config & Integration Tests' @@ -238,55 +233,3 @@ jobs: testDisplayName: 'MsSql Config & Integration Tests' artifactSuffix: '-ConfigAndIntegration' initDbSchema: true - -- job: windows_unittests - displayName: 'Windows - MsSql Unit Tests' - dependsOn: windows_graphql - pool: - vmImage: 'windows-latest' - variables: - solution: '**/*.sln' - buildPlatform: 'Any CPU' - buildConfiguration: 'Release' - # Need to override the connection string set on the pipeline UI - # since windows needs a different string. - # The variable setting on the pipeline UI sets the connection string - # for the linux job above. - data-source.connection-string: Server=(localdb)\MSSQLLocalDB;Persist Security Info=False;Integrated Security=True;MultipleActiveResultSets=False;Connection Timeout=30;TrustServerCertificate=True; - InstallerUrl: https://download.microsoft.com/download/7/c/1/7c14e92e-bdcb-4f89-b7cf-93543e7112d1/SqlLocalDB.msi - SqlVersionCode: '15.0' - - steps: - - template: templates/mssql-test-steps.yml - parameters: - testFilter: 'TestCategory=MsSql&FullyQualifiedName~UnitTests' - testDisplayName: 'MsSql Unit Tests' - artifactSuffix: '-UnitTests' - initDbSchema: true - -- job: windows_hotreload - displayName: 'Windows - Hot-Reload Tests' - dependsOn: windows_graphql - pool: - vmImage: 'windows-latest' - variables: - solution: '**/*.sln' - buildPlatform: 'Any CPU' - buildConfiguration: 'Release' - # Need to override the connection string set on the pipeline UI - # since windows needs a different string. - # The variable setting on the pipeline UI sets the connection string - # for the linux job above. - data-source.connection-string: Server=(localdb)\MSSQLLocalDB;Persist Security Info=False;Integrated Security=True;MultipleActiveResultSets=False;Connection Timeout=30;TrustServerCertificate=True; - InstallerUrl: https://download.microsoft.com/download/7/c/1/7c14e92e-bdcb-4f89-b7cf-93543e7112d1/SqlLocalDB.msi - SqlVersionCode: '15.0' - - steps: - - template: templates/mssql-test-steps.yml - parameters: - testFilter: 'TestCategory=MsSql&FullyQualifiedName~ConfigurationHotReloadTests' - testDisplayName: 'MsSql Hot-Reload Tests' - testTimeout: 45 - additionalTestArgs: '--logger "console;verbosity=detailed"' - artifactSuffix: '-HotReload' - initDbSchema: true diff --git a/.pipelines/templates/mssql-test-steps.yml b/.pipelines/templates/mssql-test-steps.yml index 1df5172b07..d40eadc422 100644 --- a/.pipelines/templates/mssql-test-steps.yml +++ b/.pipelines/templates/mssql-test-steps.yml @@ -82,10 +82,27 @@ steps: inputs: targetType: 'inline' script: | - Write-Host "Running DatabaseSchema-MsSql.sql against LocalDB..." - sqlcmd -S "(localdb)\MSSQLLocalDB" -i "$(System.DefaultWorkingDirectory)\src\Service.Tests\DatabaseSchema-MsSql.sql" - if ($LASTEXITCODE -ne 0) { throw "Schema initialization failed with exit code $LASTEXITCODE" } - Write-Host "Database schema initialized successfully." + Write-Host "Running DatabaseSchema-MsSql.sql against LocalDB via SqlClient..." + $sqlFile = "$(System.DefaultWorkingDirectory)\src\Service.Tests\DatabaseSchema-MsSql.sql" + $sql = Get-Content $sqlFile -Raw + $connStr = "Server=(localdb)\MSSQLLocalDB;Integrated Security=True;TrustServerCertificate=True;Connection Timeout=30;" + $connection = New-Object System.Data.SqlClient.SqlConnection($connStr) + try { + $connection.Open() + Write-Host "Connected to LocalDB successfully." + $command = $connection.CreateCommand() + $command.CommandText = $sql + $command.CommandTimeout = 120 + $command.ExecuteNonQuery() | Out-Null + Write-Host "Database schema initialized successfully." + } + catch { + Write-Error "Schema initialization failed: $_" + throw + } + finally { + $connection.Close() + } - task: DotNetCoreCLI@2 displayName: Build From dc3929472fd831ceeb26e86a76fb94a92867bb3d Mon Sep 17 00:00:00 2001 From: aaron burtle Date: Fri, 13 Mar 2026 03:56:56 -0700 Subject: [PATCH 7/9] 2 agent and rebalance --- .pipelines/mssql-pipelines.yml | 64 +++++++++++----------------------- 1 file changed, 20 insertions(+), 44 deletions(-) diff --git a/.pipelines/mssql-pipelines.yml b/.pipelines/mssql-pipelines.yml index 53a42de102..125bd603ac 100644 --- a/.pipelines/mssql-pipelines.yml +++ b/.pipelines/mssql-pipelines.yml @@ -3,9 +3,8 @@ # MsSql Integration Testing Pipeline config is split into parallel jobs: # 1) linux (disabled) -> Run SQL Server 2019 in Linux Docker Image -# 2) windows_graphql_and_hotreload -> GraphQL + HotReload tests on LocalDB -# 3) windows_rest_and_unit -> REST + Unit tests on LocalDB -# 4) windows_config_and_integration -> Config, Auth, OpenApi, Telemetry on LocalDB (with schema init) +# 2) windows_combined -> GraphQL, REST, Unit, HotReload, OpenApi, Auth, Telemetry, Caching on LocalDB +# 3) windows_configuration -> Configuration tests on LocalDB (with schema init) trigger: batch: true @@ -153,19 +152,19 @@ jobs: summaryFileLocation: '$(Agent.TempDirectory)/**/*cobertura.xml' -# MsSql Integration Testing is split into three parallel jobs (~30 min each): -# 1) windows_graphql_and_hotreload -> GraphQL + HotReload tests (597 tests) -# GraphQL tests inherit SqlTestBase which creates the DB schema; -# HotReload tests then find the schema already in place. -# 2) windows_rest_and_unit -> REST + Unit tests (541 tests) -# REST tests inherit SqlTestBase which creates the DB schema; -# Unit tests then find the schema already in place. -# 3) windows_config_and_integration -> Config, Auth, OpenApi, Telemetry (315 tests) +# MsSql Integration Testing is split into two parallel jobs (~20 min each): +# +# 1) windows_combined -> GraphQL, HotReload, REST, Unit, OpenApi, Auth, +# Telemetry, and Caching tests (1246 tests). +# SqlTestBase-inheriting tests (GraphQL, REST) create the DB schema; +# the remaining tests find it already in place. +# +# 2) windows_configuration -> Pure ConfigurationTests (207 tests). # No SqlTestBase tests in this bucket, so initDbSchema creates the # schema via SqlClient before tests run. -- job: windows_graphql_and_hotreload - displayName: 'Windows - GraphQL & Hot-Reload Tests' +- job: windows_combined + displayName: 'Windows - Combined Integration Tests' pool: vmImage: 'windows-latest' variables: @@ -183,12 +182,12 @@ jobs: steps: - template: templates/mssql-test-steps.yml parameters: - testFilter: 'TestCategory=MsSql&(FullyQualifiedName~SqlTests.GraphQL|FullyQualifiedName~ConfigurationHotReloadTests)' - testDisplayName: 'MsSql GraphQL & Hot-Reload Tests' - artifactSuffix: '-GraphQLAndHotReload' + testFilter: 'TestCategory=MsSql&(FullyQualifiedName~SqlTests.GraphQL|FullyQualifiedName~ConfigurationHotReloadTests|FullyQualifiedName~SqlTests.Rest|FullyQualifiedName~UnitTests|FullyQualifiedName~OpenApi|FullyQualifiedName~Telemetry|FullyQualifiedName~Authorization|FullyQualifiedName~Caching)' + testDisplayName: 'MsSql Combined Integration Tests' + artifactSuffix: '-Combined' -- job: windows_rest_and_unit - displayName: 'Windows - REST & Unit Tests' +- job: windows_configuration + displayName: 'Windows - Configuration Tests' pool: vmImage: 'windows-latest' variables: @@ -206,30 +205,7 @@ jobs: steps: - template: templates/mssql-test-steps.yml parameters: - testFilter: 'TestCategory=MsSql&(FullyQualifiedName~SqlTests.Rest|FullyQualifiedName~UnitTests)' - testDisplayName: 'MsSql REST & Unit Tests' - artifactSuffix: '-RestAndUnit' - -- job: windows_config_and_integration - displayName: 'Windows - Config & Integration Tests' - pool: - vmImage: 'windows-latest' - variables: - solution: '**/*.sln' - buildPlatform: 'Any CPU' - buildConfiguration: 'Release' - # Need to override the connection string set on the pipeline UI - # since windows needs a different string. - # The variable setting on the pipeline UI sets the connection string - # for the linux job above. - data-source.connection-string: Server=(localdb)\MSSQLLocalDB;Persist Security Info=False;Integrated Security=True;MultipleActiveResultSets=False;Connection Timeout=30;TrustServerCertificate=True; - InstallerUrl: https://download.microsoft.com/download/7/c/1/7c14e92e-bdcb-4f89-b7cf-93543e7112d1/SqlLocalDB.msi - SqlVersionCode: '15.0' - - steps: - - template: templates/mssql-test-steps.yml - parameters: - testFilter: 'TestCategory=MsSql&FullyQualifiedName!~SqlTests.GraphQL&FullyQualifiedName!~SqlTests.Rest&FullyQualifiedName!~ConfigurationHotReloadTests&FullyQualifiedName!~UnitTests' - testDisplayName: 'MsSql Config & Integration Tests' - artifactSuffix: '-ConfigAndIntegration' + testFilter: 'TestCategory=MsSql&FullyQualifiedName!~SqlTests.GraphQL&FullyQualifiedName!~ConfigurationHotReloadTests&FullyQualifiedName!~SqlTests.Rest&FullyQualifiedName!~UnitTests&FullyQualifiedName!~OpenApi&FullyQualifiedName!~Telemetry&FullyQualifiedName!~Authorization&FullyQualifiedName!~Caching' + testDisplayName: 'MsSql Configuration Tests' + artifactSuffix: '-Configuration' initDbSchema: true From ddff451ed82e94271e5f21cfd01c1295ecefe0fc Mon Sep 17 00:00:00 2001 From: aaron burtle Date: Fri, 13 Mar 2026 16:59:10 -0700 Subject: [PATCH 8/9] remove test number since they could change --- .pipelines/mssql-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pipelines/mssql-pipelines.yml b/.pipelines/mssql-pipelines.yml index 125bd603ac..c11bfa133c 100644 --- a/.pipelines/mssql-pipelines.yml +++ b/.pipelines/mssql-pipelines.yml @@ -155,11 +155,11 @@ jobs: # MsSql Integration Testing is split into two parallel jobs (~20 min each): # # 1) windows_combined -> GraphQL, HotReload, REST, Unit, OpenApi, Auth, -# Telemetry, and Caching tests (1246 tests). +# Telemetry, and Caching tests. # SqlTestBase-inheriting tests (GraphQL, REST) create the DB schema; # the remaining tests find it already in place. # -# 2) windows_configuration -> Pure ConfigurationTests (207 tests). +# 2) windows_configuration -> Pure ConfigurationTests. # No SqlTestBase tests in this bucket, so initDbSchema creates the # schema via SqlClient before tests run. From 4b84faeec6f99f3a1cd385c10df9e81ffdf73ed7 Mon Sep 17 00:00:00 2001 From: aaronburtle <93220300+aaronburtle@users.noreply.github.com> Date: Fri, 13 Mar 2026 17:08:05 -0700 Subject: [PATCH 9/9] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .pipelines/templates/mssql-test-steps.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.pipelines/templates/mssql-test-steps.yml b/.pipelines/templates/mssql-test-steps.yml index d40eadc422..d39f5cf8e0 100644 --- a/.pipelines/templates/mssql-test-steps.yml +++ b/.pipelines/templates/mssql-test-steps.yml @@ -25,8 +25,7 @@ parameters: steps: - task: CmdLine@2 - displayName: 'Set flag to publish received files when previous step fails' - condition: failed() + displayName: 'Set flag to publish received files' inputs: script: 'echo ##vso[task.setvariable variable=publishverify]Yes'