Skip to content

Commit a9a4f7e

Browse files
committed
Introduce CI redundancy groups
1 parent e87c07b commit a9a4f7e

4 files changed

Lines changed: 454 additions & 15 deletions

File tree

azure-pipelines-internal-tests.yml

Lines changed: 220 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,32 @@ 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)
138+
Test__SqlServer__DefaultConnection: "Data Source="
139139
displayName: Build
140+
141+
- job: Windows_SqlServer
142+
displayName: 'Windows SQL Server'
143+
pool:
144+
name: $(DncEngInternalBuildPool)
145+
demands: ImageOverride -equals 1es-windows-2022
146+
os: windows
147+
timeoutInMinutes: 120
148+
variables:
149+
- skipComponentGovernanceDetection: true
150+
steps:
151+
- powershell: SqlLocalDB start
152+
displayName: Start LocalDB
153+
- template: /eng/common/templates-official/steps/enable-internal-sources.yml
154+
- template: /eng/common/templates-official/steps/enable-internal-runtimes.yml
155+
- script: eng\common\build.cmd -restore -build -test -ci -configuration $(_BuildConfig) -prepareMachine $(_InternalRuntimeDownloadArgs)
156+
/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"
157+
displayName: Test SQL Server
158+
140159
- job: macOS
141160
pool:
142161
name: Azure Pipelines
@@ -174,6 +193,7 @@ extends:
174193
sdl:
175194
binskim:
176195
preReleaseVersion: ''
196+
177197
- job: Linux_Cosmos
178198
displayName: 'Linux Cosmos'
179199
condition: notin(variables['Build.Reason'], 'PullRequest', 'Schedule')
@@ -218,6 +238,7 @@ extends:
218238
sdl:
219239
binskim:
220240
preReleaseVersion: ''
241+
221242
- job: Helix_Windows
222243
displayName: 'Helix Windows'
223244
timeoutInMinutes: 180
@@ -260,6 +281,132 @@ extends:
260281
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
261282
DotNetBuildsInternalReadSasToken: $(dotnetbuilds-internal-container-read-token)
262283

284+
- job: Helix_Windows_SqlServer
285+
displayName: 'Helix Windows SQL Server'
286+
timeoutInMinutes: 180
287+
pool:
288+
name: $(DncEngInternalBuildPool)
289+
demands: ImageOverride -equals 1es-windows-2022
290+
os: windows
291+
variables:
292+
- skipComponentGovernanceDetection: true
293+
- name: _HelixBuildConfig
294+
value: $(_BuildConfig)
295+
- name: HelixTargetQueues
296+
value: Windows.11.Amd64.Client
297+
- name: _HelixAccessToken
298+
value: $(HelixApiAccessToken)
299+
steps:
300+
- task: NuGetCommand@2
301+
displayName: 'Clear NuGet caches'
302+
condition: succeeded()
303+
inputs:
304+
command: custom
305+
arguments: 'locals all -clear'
306+
- template: /eng/common/templates-official/steps/enable-internal-sources.yml
307+
- template: /eng/common/templates-official/steps/enable-internal-runtimes.yml
308+
- template: /eng/common/core-templates/steps/get-delegation-sas.yml
309+
parameters:
310+
federatedServiceConnection: 'dotnetbuilds-internal-read'
311+
outputVariableName: 'dotnetbuilds-internal-container-read-token'
312+
expiryInHours: 3
313+
base64Encode: false
314+
storageAccount: dotnetbuilds
315+
container: internal
316+
permissions: rl
317+
- script: restore.cmd -ci /p:configuration=$(_BuildConfig) $(_InternalRuntimeDownloadArgs)
318+
displayName: Restore packages
319+
- script: .dotnet\dotnet build eng\helix.proj /restore /t:Test /p:configuration=$(_BuildConfig) /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog $(_InternalRuntimeDownloadArgs)
320+
displayName: Send tests to helix
321+
env:
322+
HelixAccessToken: $(_HelixAccessToken)
323+
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
324+
DotNetBuildsInternalReadSasToken: $(dotnetbuilds-internal-container-read-token)
325+
326+
- job: Helix_Windows_Arm64
327+
displayName: 'Helix Windows ARM64'
328+
timeoutInMinutes: 180
329+
pool:
330+
name: $(DncEngInternalBuildPool)
331+
demands: ImageOverride -equals 1es-windows-2022
332+
os: windows
333+
variables:
334+
- skipComponentGovernanceDetection: true
335+
- name: _HelixBuildConfig
336+
value: $(_BuildConfig)
337+
- name: HelixTargetQueues
338+
value: Windows.11.Arm64
339+
- name: _HelixAccessToken
340+
value: $(HelixApiAccessToken)
341+
steps:
342+
- task: NuGetCommand@2
343+
displayName: 'Clear NuGet caches'
344+
condition: succeeded()
345+
inputs:
346+
command: custom
347+
arguments: 'locals all -clear'
348+
- template: /eng/common/templates-official/steps/enable-internal-sources.yml
349+
- template: /eng/common/templates-official/steps/enable-internal-runtimes.yml
350+
- template: /eng/common/core-templates/steps/get-delegation-sas.yml
351+
parameters:
352+
federatedServiceConnection: 'dotnetbuilds-internal-read'
353+
outputVariableName: 'dotnetbuilds-internal-container-read-token'
354+
expiryInHours: 3
355+
base64Encode: false
356+
storageAccount: dotnetbuilds
357+
container: internal
358+
permissions: rl
359+
- script: restore.cmd -ci /p:configuration=$(_BuildConfig) $(_InternalRuntimeDownloadArgs)
360+
displayName: Restore packages
361+
- script: .dotnet\dotnet build eng\helix.proj /restore /t:Test /p:configuration=$(_BuildConfig) /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog $(_InternalRuntimeDownloadArgs)
362+
displayName: Send tests to helix
363+
env:
364+
HelixAccessToken: $(_HelixAccessToken)
365+
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
366+
DotNetBuildsInternalReadSasToken: $(dotnetbuilds-internal-container-read-token)
367+
368+
- job: Helix_Windows_Cosmos
369+
displayName: 'Helix Windows Cosmos'
370+
timeoutInMinutes: 180
371+
pool:
372+
name: $(DncEngInternalBuildPool)
373+
demands: ImageOverride -equals 1es-windows-2022
374+
os: windows
375+
variables:
376+
- skipComponentGovernanceDetection: true
377+
- name: _HelixBuildConfig
378+
value: $(_BuildConfig)
379+
- name: HelixTargetQueues
380+
value: Windows.Server2025.Amd64
381+
- name: _HelixAccessToken
382+
value: $(HelixApiAccessToken)
383+
steps:
384+
- task: NuGetCommand@2
385+
displayName: 'Clear NuGet caches'
386+
condition: succeeded()
387+
inputs:
388+
command: custom
389+
arguments: 'locals all -clear'
390+
- template: /eng/common/templates-official/steps/enable-internal-sources.yml
391+
- template: /eng/common/templates-official/steps/enable-internal-runtimes.yml
392+
- template: /eng/common/core-templates/steps/get-delegation-sas.yml
393+
parameters:
394+
federatedServiceConnection: 'dotnetbuilds-internal-read'
395+
outputVariableName: 'dotnetbuilds-internal-container-read-token'
396+
expiryInHours: 3
397+
base64Encode: false
398+
storageAccount: dotnetbuilds
399+
container: internal
400+
permissions: rl
401+
- script: restore.cmd -ci /p:configuration=$(_BuildConfig) $(_InternalRuntimeDownloadArgs)
402+
displayName: Restore packages
403+
- script: .dotnet\dotnet build eng\helix.proj /restore /t:Test /p:configuration=$(_BuildConfig) /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog $(_InternalRuntimeDownloadArgs)
404+
displayName: Send tests to helix
405+
env:
406+
HelixAccessToken: $(_HelixAccessToken)
407+
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
408+
DotNetBuildsInternalReadSasToken: $(dotnetbuilds-internal-container-read-token)
409+
263410
- job: Helix_macOS_x64
264411
displayName: 'Helix macOS x64'
265412
timeoutInMinutes: 180
@@ -470,3 +617,74 @@ extends:
470617
HelixAccessToken: $(_HelixAccessToken)
471618
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
472619
DotNetBuildsInternalReadSasToken: $(dotnetbuilds-internal-container-read-token)
620+
- stage: validate
621+
displayName: Validate
622+
dependsOn: build
623+
condition: always()
624+
jobs:
625+
- job: Validate_Job_Results
626+
displayName: Validate Job Results
627+
pool:
628+
name: $(DncEngInternalBuildPool)
629+
demands: ImageOverride -equals 1es-windows-2022
630+
os: windows
631+
variables:
632+
WindowsResult: $[ stageDependencies.build.Windows.result ]
633+
HelixWindowsResult: $[ stageDependencies.build.Helix_Windows.result ]
634+
WindowsSqlServerResult: $[ stageDependencies.build.Windows_SqlServer.result ]
635+
HelixWindowsSqlServerResult: $[ stageDependencies.build.Helix_Windows_SqlServer.result ]
636+
HelixWindowsCosmosResult: $[ stageDependencies.build.Helix_Windows_Cosmos.result ]
637+
LinuxResult: $[ stageDependencies.build.Linux.result ]
638+
HelixUbuntuResult: $[ stageDependencies.build.Helix_Ubuntu.result ]
639+
HelixUbuntuSqlServerResult: $[ stageDependencies.build.Helix_Ubuntu_SqlServer.result ]
640+
MacOsResult: $[ stageDependencies.build.macOS.result ]
641+
HelixMacOsX64Result: $[ stageDependencies.build.Helix_macOS_x64.result ]
642+
HelixMacOsArm64Result: $[ stageDependencies.build.Helix_macOS_ARM64.result ]
643+
HelixWindowsArm64Result: $[ stageDependencies.build.Helix_Windows_Arm64.result ]
644+
LinuxCosmosResult: $[ stageDependencies.build.Linux_Cosmos.result ]
645+
HelixUbuntuCosmosResult: $[ stageDependencies.build.Helix_Ubuntu_Cosmos.result ]
646+
steps:
647+
- pwsh: |
648+
$groupResults = @{
649+
Windows = @("$(WindowsResult)", "$(HelixWindowsResult)")
650+
Linux = @("$(LinuxResult)", "$(HelixUbuntuResult)")
651+
MacOS = @("$(MacOsResult)", "$(HelixMacOsX64Result)")
652+
Arm64 = @("$(HelixWindowsArm64Result)", "$(HelixMacOsArm64Result)")
653+
Cosmos = @("$(HelixWindowsCosmosResult)", "$(LinuxCosmosResult)", "$(HelixUbuntuCosmosResult)")
654+
SqlServer = @("$(WindowsSqlServerResult)", "$(HelixWindowsSqlServerResult)", "$(HelixUbuntuSqlServerResult)")
655+
}
656+
657+
$failedGroups = @()
658+
659+
foreach ($groupName in $groupResults.Keys)
660+
{
661+
$results = $groupResults[$groupName]
662+
Write-Host "$groupName results: $($results -join ', ')"
663+
664+
# Ignore jobs that were skipped (e.g. condition-gated)
665+
$ran = $results | Where-Object { $_ -ne 'Skipped' }
666+
if (-not $ran)
667+
{
668+
Write-Host " -> all jobs skipped, treating group as successful"
669+
continue
670+
}
671+
672+
# Only 'Succeeded' counts as success. 'SucceededWithIssues' is treated as failure
673+
# because the jobs run with continueOnError: true, which maps task failures to warnings.
674+
$hasSuccess = $ran | Where-Object { $_ -eq 'Succeeded' }
675+
if ($hasSuccess)
676+
{
677+
continue
678+
}
679+
680+
$failedGroups += $groupName
681+
}
682+
683+
if ($failedGroups.Count -gt 0)
684+
{
685+
Write-Error "No jobs succeeded for group(s): $($failedGroups -join ', ')."
686+
exit 1
687+
}
688+
689+
Write-Host 'Group validation passed.'
690+
displayName: Evaluate grouped job outcomes

0 commit comments

Comments
 (0)