@@ -97,6 +97,7 @@ extends:
9797 jobs :
9898 - template : /eng/common/templates-official/jobs/jobs.yml@self
9999 parameters :
100+ continueOnError : true
100101 enableMicrobuild : true
101102 enablePublishBuildArtifacts : true
102103 enablePublishBuildAssets : false
@@ -129,14 +130,31 @@ extends:
129130 - script : " echo ##vso[build.addbuildtag]release-candidate"
130131 condition : and(notin(variables['Build.Reason'], 'PullRequest'), eq(variables['IsFinalBuild'], 'true'))
131132 displayName : ' Set CI tags'
132- - powershell : SqlLocalDB start
133- displayName : Start LocalDB
134133 - template : /eng/common/templates-official/steps/enable-internal-sources.yml
135134 - template : /eng/common/templates-official/steps/enable-internal-runtimes.yml
136135 - script : eng\common\cibuild.cmd -configuration $(_BuildConfig) -prepareMachine $(_InternalBuildArgs) $(_InternalRuntimeDownloadArgs)
137136 env :
138137 Test__Cosmos__DefaultConnection : $(_CosmosConnectionUrl)
139138 displayName : Build
139+
140+ - job : Windows_SqlServer
141+ displayName : ' Windows SQL Server'
142+ pool :
143+ name : $(DncEngInternalBuildPool)
144+ demands : ImageOverride -equals 1es-windows-2022
145+ os : windows
146+ timeoutInMinutes : 120
147+ variables :
148+ - skipComponentGovernanceDetection : true
149+ steps :
150+ - powershell : SqlLocalDB start
151+ displayName : Start LocalDB
152+ - template : /eng/common/templates-official/steps/enable-internal-sources.yml
153+ - template : /eng/common/templates-official/steps/enable-internal-runtimes.yml
154+ - script : eng\common\build.cmd -restore -build -test -ci -configuration $(_BuildConfig) -prepareMachine $(_InternalRuntimeDownloadArgs)
155+ /p:Projects="$(Build.SourcesDirectory)/test/EFCore.SqlServer.FunctionalTests/EFCore.SqlServer.FunctionalTests.csproj;$(Build.SourcesDirectory)/test/EFCore.SqlServer.HierarchyId.Tests/EFCore.SqlServer.HierarchyId.Tests.csproj;$(Build.SourcesDirectory)/test/EFCore.CrossStore.FunctionalTests/EFCore.CrossStore.FunctionalTests.csproj;$(Build.SourcesDirectory)/test/EFCore.OData.FunctionalTests/EFCore.OData.FunctionalTests.csproj;$(Build.SourcesDirectory)/test/EFCore.AspNet.SqlServer.FunctionalTests/EFCore.AspNet.SqlServer.FunctionalTests.csproj;$(Build.SourcesDirectory)/test/EFCore.VisualBasic.FunctionalTests/EFCore.VisualBasic.FunctionalTests.vbproj;$(Build.SourcesDirectory)/test/EFCore.FSharp.FunctionalTests/EFCore.FSharp.FunctionalTests.fsproj"
156+ displayName : Test SQL Server
157+
140158 - job : macOS
141159 pool :
142160 name : Azure Pipelines
@@ -174,6 +192,7 @@ extends:
174192 sdl :
175193 binskim :
176194 preReleaseVersion : ' '
195+
177196 - job : Linux_Cosmos
178197 displayName : ' Linux Cosmos'
179198 condition : notin(variables['Build.Reason'], 'PullRequest', 'Schedule')
@@ -218,6 +237,7 @@ extends:
218237 sdl :
219238 binskim :
220239 preReleaseVersion : ' '
240+
221241 - job : Helix_Windows
222242 displayName : ' Helix Windows'
223243 timeoutInMinutes : 180
@@ -260,6 +280,132 @@ extends:
260280 SYSTEM_ACCESSTOKEN : $(System.AccessToken)
261281 DotNetBuildsInternalReadSasToken : $(dotnetbuilds-internal-container-read-token)
262282
283+ - job : Helix_Windows_SqlServer
284+ displayName : ' Helix Windows SQL Server'
285+ timeoutInMinutes : 180
286+ pool :
287+ name : $(DncEngInternalBuildPool)
288+ demands : ImageOverride -equals 1es-windows-2022
289+ os : windows
290+ variables :
291+ - skipComponentGovernanceDetection : true
292+ - name : _HelixBuildConfig
293+ value : $(_BuildConfig)
294+ - name : HelixTargetQueues
295+ value : Windows.11.Amd64.Client
296+ - name : _HelixAccessToken
297+ value : $(HelixApiAccessToken)
298+ steps :
299+ - task : NuGetCommand@2
300+ displayName : ' Clear NuGet caches'
301+ condition : succeeded()
302+ inputs :
303+ command : custom
304+ arguments : ' locals all -clear'
305+ - template : /eng/common/templates-official/steps/enable-internal-sources.yml
306+ - template : /eng/common/templates-official/steps/enable-internal-runtimes.yml
307+ - template : /eng/common/core-templates/steps/get-delegation-sas.yml
308+ parameters :
309+ federatedServiceConnection : ' dotnetbuilds-internal-read'
310+ outputVariableName : ' dotnetbuilds-internal-container-read-token'
311+ expiryInHours : 3
312+ base64Encode : false
313+ storageAccount : dotnetbuilds
314+ container : internal
315+ permissions : rl
316+ - script : restore.cmd -ci /p:configuration=$(_BuildConfig) $(_InternalRuntimeDownloadArgs)
317+ displayName : Restore packages
318+ - script : .dotnet\dotnet build eng\helix.proj /restore /t:Test /p:configuration=$(_BuildConfig) /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog $(_InternalRuntimeDownloadArgs)
319+ displayName : Send tests to helix
320+ env :
321+ HelixAccessToken : $(_HelixAccessToken)
322+ SYSTEM_ACCESSTOKEN : $(System.AccessToken)
323+ DotNetBuildsInternalReadSasToken : $(dotnetbuilds-internal-container-read-token)
324+
325+ - job : Helix_Windows_Arm64
326+ displayName : ' Helix Windows ARM64'
327+ timeoutInMinutes : 180
328+ pool :
329+ name : $(DncEngInternalBuildPool)
330+ demands : ImageOverride -equals 1es-windows-2022
331+ os : windows
332+ variables :
333+ - skipComponentGovernanceDetection : true
334+ - name : _HelixBuildConfig
335+ value : $(_BuildConfig)
336+ - name : HelixTargetQueues
337+ value : Windows.11.Arm64
338+ - name : _HelixAccessToken
339+ value : $(HelixApiAccessToken)
340+ steps :
341+ - task : NuGetCommand@2
342+ displayName : ' Clear NuGet caches'
343+ condition : succeeded()
344+ inputs :
345+ command : custom
346+ arguments : ' locals all -clear'
347+ - template : /eng/common/templates-official/steps/enable-internal-sources.yml
348+ - template : /eng/common/templates-official/steps/enable-internal-runtimes.yml
349+ - template : /eng/common/core-templates/steps/get-delegation-sas.yml
350+ parameters :
351+ federatedServiceConnection : ' dotnetbuilds-internal-read'
352+ outputVariableName : ' dotnetbuilds-internal-container-read-token'
353+ expiryInHours : 3
354+ base64Encode : false
355+ storageAccount : dotnetbuilds
356+ container : internal
357+ permissions : rl
358+ - script : restore.cmd -ci /p:configuration=$(_BuildConfig) $(_InternalRuntimeDownloadArgs)
359+ displayName : Restore packages
360+ - script : .dotnet\dotnet build eng\helix.proj /restore /t:Test /p:configuration=$(_BuildConfig) /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog $(_InternalRuntimeDownloadArgs)
361+ displayName : Send tests to helix
362+ env :
363+ HelixAccessToken : $(_HelixAccessToken)
364+ SYSTEM_ACCESSTOKEN : $(System.AccessToken)
365+ DotNetBuildsInternalReadSasToken : $(dotnetbuilds-internal-container-read-token)
366+
367+ - job : Helix_Windows_Cosmos
368+ displayName : ' Helix Windows Cosmos'
369+ timeoutInMinutes : 180
370+ pool :
371+ name : $(DncEngInternalBuildPool)
372+ demands : ImageOverride -equals 1es-windows-2022
373+ os : windows
374+ variables :
375+ - skipComponentGovernanceDetection : true
376+ - name : _HelixBuildConfig
377+ value : $(_BuildConfig)
378+ - name : HelixTargetQueues
379+ value : Windows.Server2025.Amd64
380+ - name : _HelixAccessToken
381+ value : $(HelixApiAccessToken)
382+ steps :
383+ - task : NuGetCommand@2
384+ displayName : ' Clear NuGet caches'
385+ condition : succeeded()
386+ inputs :
387+ command : custom
388+ arguments : ' locals all -clear'
389+ - template : /eng/common/templates-official/steps/enable-internal-sources.yml
390+ - template : /eng/common/templates-official/steps/enable-internal-runtimes.yml
391+ - template : /eng/common/core-templates/steps/get-delegation-sas.yml
392+ parameters :
393+ federatedServiceConnection : ' dotnetbuilds-internal-read'
394+ outputVariableName : ' dotnetbuilds-internal-container-read-token'
395+ expiryInHours : 3
396+ base64Encode : false
397+ storageAccount : dotnetbuilds
398+ container : internal
399+ permissions : rl
400+ - script : restore.cmd -ci /p:configuration=$(_BuildConfig) $(_InternalRuntimeDownloadArgs)
401+ displayName : Restore packages
402+ - script : .dotnet\dotnet build eng\helix.proj /restore /t:Test /p:configuration=$(_BuildConfig) /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog $(_InternalRuntimeDownloadArgs)
403+ displayName : Send tests to helix
404+ env :
405+ HelixAccessToken : $(_HelixAccessToken)
406+ SYSTEM_ACCESSTOKEN : $(System.AccessToken)
407+ DotNetBuildsInternalReadSasToken : $(dotnetbuilds-internal-container-read-token)
408+
263409 - job : Helix_macOS_x64
264410 displayName : ' Helix macOS x64'
265411 timeoutInMinutes : 180
@@ -470,3 +616,74 @@ extends:
470616 HelixAccessToken : $(_HelixAccessToken)
471617 SYSTEM_ACCESSTOKEN : $(System.AccessToken)
472618 DotNetBuildsInternalReadSasToken : $(dotnetbuilds-internal-container-read-token)
619+ - stage : validate
620+ displayName : Validate
621+ dependsOn : build
622+ condition : always()
623+ jobs :
624+ - job : Validate_Job_Results
625+ displayName : Validate Job Results
626+ pool :
627+ name : $(DncEngInternalBuildPool)
628+ demands : ImageOverride -equals 1es-windows-2022
629+ os : windows
630+ variables :
631+ WindowsResult : $[ stageDependencies.build.Windows.result ]
632+ HelixWindowsResult : $[ stageDependencies.build.Helix_Windows.result ]
633+ WindowsSqlServerResult : $[ stageDependencies.build.Windows_SqlServer.result ]
634+ HelixWindowsSqlServerResult : $[ stageDependencies.build.Helix_Windows_SqlServer.result ]
635+ HelixWindowsCosmosResult : $[ stageDependencies.build.Helix_Windows_Cosmos.result ]
636+ LinuxResult : $[ stageDependencies.build.Linux.result ]
637+ HelixUbuntuResult : $[ stageDependencies.build.Helix_Ubuntu.result ]
638+ HelixUbuntuSqlServerResult : $[ stageDependencies.build.Helix_Ubuntu_SqlServer.result ]
639+ MacOsResult : $[ stageDependencies.build.macOS.result ]
640+ HelixMacOsX64Result : $[ stageDependencies.build.Helix_macOS_x64.result ]
641+ HelixMacOsArm64Result : $[ stageDependencies.build.Helix_macOS_ARM64.result ]
642+ HelixWindowsArm64Result : $[ stageDependencies.build.Helix_Windows_Arm64.result ]
643+ LinuxCosmosResult : $[ stageDependencies.build.Linux_Cosmos.result ]
644+ HelixUbuntuCosmosResult : $[ stageDependencies.build.Helix_Ubuntu_Cosmos.result ]
645+ steps :
646+ - pwsh : |
647+ $groupResults = @{
648+ Windows = @("$(WindowsResult)", "$(HelixWindowsResult)")
649+ Linux = @("$(LinuxResult)", "$(HelixUbuntuResult)")
650+ MacOS = @("$(MacOsResult)", "$(HelixMacOsX64Result)")
651+ Arm64 = @("$(HelixWindowsArm64Result)", "$(HelixMacOsArm64Result)")
652+ Cosmos = @("$(HelixWindowsCosmosResult), $(LinuxCosmosResult)", "$(HelixUbuntuCosmosResult)")
653+ SqlServer = @("$(WindowsSqlServerResult)", "$(HelixWindowsSqlServerResult)", "$(HelixUbuntuSqlServerResult)")
654+ }
655+
656+ $failedGroups = @()
657+
658+ foreach ($groupName in $groupResults.Keys)
659+ {
660+ $results = $groupResults[$groupName]
661+ Write-Host "$groupName results: $($results -join ', ')"
662+
663+ # Ignore jobs that were skipped (e.g. condition-gated)
664+ $ran = $results | Where-Object { $_ -ne 'Skipped' }
665+ if (-not $ran)
666+ {
667+ Write-Host " -> all jobs skipped, treating group as successful"
668+ continue
669+ }
670+
671+ # Only 'Succeeded' counts as success. 'SucceededWithIssues' is treated as failure
672+ # because the jobs run with continueOnError: true, which maps task failures to warnings.
673+ $hasSuccess = $ran | Where-Object { $_ -eq 'Succeeded' }
674+ if ($hasSuccess)
675+ {
676+ continue
677+ }
678+
679+ $failedGroups += $groupName
680+ }
681+
682+ if ($failedGroups.Count -gt 0)
683+ {
684+ Write-Error "No jobs succeeded for group(s): $($failedGroups -join ', ')."
685+ exit 1
686+ }
687+
688+ Write-Host 'Group validation passed.'
689+ displayName: Evaluate grouped job outcomes
0 commit comments