Skip to content

Commit 5fc76df

Browse files
committed
Introduce CI redundancy groups
1 parent e87c07b commit 5fc76df

4 files changed

Lines changed: 452 additions & 13 deletions

File tree

azure-pipelines-internal-tests.yml

Lines changed: 219 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)