Skip to content

fix: resolve pool validation errors breaking device-tests and ui-tests on SR3#34690

Merged
PureWeen merged 1 commit intorelease/10.0.1xx-sr3from
fix/sr3-ci-pools
Mar 27, 2026
Merged

fix: resolve pool validation errors breaking device-tests and ui-tests on SR3#34690
PureWeen merged 1 commit intorelease/10.0.1xx-sr3from
fix/sr3-ci-pools

Conversation

@PureWeen
Copy link
Copy Markdown
Member

Note

Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!

Description

Follow-up to #34685. The device-tests and ui-tests pipelines have been failing with instant YAML validation errors since January 2026:

Could not find a pool with name NetCore-Public. The pool does not exist or has not been authorized for use.

Root Cause

Azure DevOps validates ALL pool name references in YAML at parse time, including parameter defaults. The NetCore-Public pool only exists in dnceng-public, not in dnceng/internal where these pipelines run. The pool names were hardcoded in parameters rather than using conditional internal/public selection.

Changes (aligned with release/10.0.1xx-sr5)

  1. ci-device-tests.yml — Split pools into Internal/Public variants with System.TeamProject conditional; added darc-* trigger; added Helix variable group; removed old common/device-tests.yml Windows section
  2. ci-uitests.yml — Same internal/public pool split and conditional selection; added darc-* trigger
  3. stage-device-tests.yml — Added HelixAccessToken/HelixInternal parameters forwarded to all send-to-helix invocations; increased timeouts
  4. Typo fixes_BuildOfficalId_BuildOfficialId across 5 files

Supersedes

This PR supersedes #34685 which addressed the triggers and Helix plumbing but missed the pool validation root cause.

Copilot AI review requested due to automatic review settings March 26, 2026 21:57
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 26, 2026

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 34690

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 34690"

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes Azure DevOps YAML pool validation failures in the SR3 device-tests and ui-tests pipelines by avoiding invalid pool references in internal builds, while also aligning CI triggers/Helix wiring with SR5.

Changes:

  • Split agent pool parameters into internal/public variants and select them via System.TeamProject (device-tests + ui-tests), plus add darc-* branch triggers.
  • Add internal Helix variable group usage and forward Helix access token into Helix submission steps; increase device-test stage timeouts.
  • Fix _BuildOfficalId typo to _BuildOfficialId across pipeline YAML files.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
eng/pipelines/handlers.yml Renames build ID variable usage to _BuildOfficialId.
eng/pipelines/common/variables.yml Renames _BuildOfficalId to _BuildOfficialId in shared variables.
eng/pipelines/common/sdk-insertion.yml Updates OfficialBuildId MSBuild property to use _BuildOfficialId.
eng/pipelines/ci-uitests.yml Adds darc-* trigger; introduces internal/public pool split and conditional selection.
eng/pipelines/ci-official.yml Updates source indexing command to use _BuildOfficialId.
eng/pipelines/ci-device-tests.yml Adds darc-* trigger; conditional internal/public pools; internal Helix variable group; removes old Windows device-tests section.
eng/pipelines/arcade/variables.yml Renames _BuildOfficalId to _BuildOfficialId for Arcade templates.
eng/pipelines/arcade/stage-device-tests.yml Adds Helix parameters, forwards token to send-to-helix, adjusts timeouts, and adds HelixInternal-related arguments.

Comment on lines +261 to +263
HelixProjectArguments: /p:TargetOS=android /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsAndroid_ /p:HelixInternal=False
${{ else }}:
HelixProjectArguments: /p:TargetOS=android /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsAndroid_ /p:HelixInternal=True
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The added /p:HelixInternal=... MSBuild property appears to be ineffective for this pipeline because eng/helix_xharness.proj (the default helixProject) does not reference HelixInternal. If the intent is to switch between internal vs public Helix queues/endpoints, that logic needs to be implemented in helix_xharness.proj (or a different property should be used); otherwise consider removing this property to avoid confusion.

Suggested change
HelixProjectArguments: /p:TargetOS=android /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsAndroid_ /p:HelixInternal=False
${{ else }}:
HelixProjectArguments: /p:TargetOS=android /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsAndroid_ /p:HelixInternal=True
HelixProjectArguments: /p:TargetOS=android /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsAndroid_
${{ else }}:
HelixProjectArguments: /p:TargetOS=android /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsAndroid_

Copilot uses AI. Check for mistakes.
Comment on lines +368 to +370
HelixProjectArguments: /p:TargetOS=android /p:TestRunNameSuffix=_$(_BuildConfig)_CoreCLR /p:TestRunNamePrefix=DeviceTestsAndroid_CoreCLR_ /p:HelixInternal=False
${{ else }}:
HelixProjectArguments: /p:TargetOS=android /p:TestRunNameSuffix=_$(_BuildConfig)_CoreCLR /p:TestRunNamePrefix=DeviceTestsAndroid_CoreCLR_ /p:HelixInternal=True
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The added /p:HelixInternal=... MSBuild property appears to be ineffective for this pipeline because eng/helix_xharness.proj (the default helixProject) does not reference HelixInternal. If the intent is to switch between internal vs public Helix queues/endpoints, that logic needs to be implemented in helix_xharness.proj (or a different property should be used); otherwise consider removing this property to avoid confusion.

Suggested change
HelixProjectArguments: /p:TargetOS=android /p:TestRunNameSuffix=_$(_BuildConfig)_CoreCLR /p:TestRunNamePrefix=DeviceTestsAndroid_CoreCLR_ /p:HelixInternal=False
${{ else }}:
HelixProjectArguments: /p:TargetOS=android /p:TestRunNameSuffix=_$(_BuildConfig)_CoreCLR /p:TestRunNamePrefix=DeviceTestsAndroid_CoreCLR_ /p:HelixInternal=True
HelixProjectArguments: /p:TargetOS=android /p:TestRunNameSuffix=_$(_BuildConfig)_CoreCLR /p:TestRunNamePrefix=DeviceTestsAndroid_CoreCLR_
${{ else }}:
HelixProjectArguments: /p:TargetOS=android /p:TestRunNameSuffix=_$(_BuildConfig)_CoreCLR /p:TestRunNamePrefix=DeviceTestsAndroid_CoreCLR_

Copilot uses AI. Check for mistakes.
Comment on lines 364 to 365
- template: ${{ iif(eq(parameters.runAsPublic, 'true'), '/eng/common/templates/steps/send-to-helix.yml', '/eng/common/templates-official/steps/send-to-helix.yml@self') }}
parameters:
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

runAsPublic is declared as a boolean parameter in this template, but this iif/eq compares it to the string 'true'. This is inconsistent with the other new boolean comparisons in the file and can lead to selecting the wrong send-to-helix template. Use a boolean comparison (eq(parameters.runAsPublic, true/false)) or change runAsPublic to a string consistently.

Copilot uses AI. Check for mistakes.
Comment on lines +49 to +51
- name: HelixInternal
type: string
default: ''
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

HelixInternal is added as a template parameter but is not referenced anywhere in this template. This makes the API misleading and encourages callers to pass values that have no effect. Either remove HelixInternal entirely, or wire it into the Helix submission arguments/logic (and keep the parameter type consistent with how it’s consumed).

Suggested change
- name: HelixInternal
type: string
default: ''

Copilot uses AI. Check for mistakes.
Comment on lines +155 to +157
HelixProjectArguments: /p:TargetOS=ios /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsIOS_ /p:HelixInternal=False
${{ else }}:
HelixProjectArguments: /p:TargetOS=ios /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsIOS_ /p:HelixInternal=True
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The added /p:HelixInternal=... MSBuild property appears to be ineffective for this pipeline because eng/helix_xharness.proj (the default helixProject) does not reference HelixInternal. If the intent is to switch between internal vs public Helix queues/endpoints, that logic needs to be implemented in helix_xharness.proj (or a different property should be used); otherwise consider removing this property to avoid confusion.

Suggested change
HelixProjectArguments: /p:TargetOS=ios /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsIOS_ /p:HelixInternal=False
${{ else }}:
HelixProjectArguments: /p:TargetOS=ios /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsIOS_ /p:HelixInternal=True
HelixProjectArguments: /p:TargetOS=ios /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsIOS_
${{ else }}:
HelixProjectArguments: /p:TargetOS=ios /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsIOS_

Copilot uses AI. Check for mistakes.
Comment on lines +209 to +211
HelixProjectArguments: /p:TargetOS=maccatalyst /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsMacCatalyst_ /p:HelixInternal=False
${{ else }}:
HelixProjectArguments: /p:TargetOS=maccatalyst /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsMacCatalyst_ /p:HelixInternal=True
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The added /p:HelixInternal=... MSBuild property appears to be ineffective for this pipeline because eng/helix_xharness.proj (the default helixProject) does not reference HelixInternal. If the intent is to switch between internal vs public Helix queues/endpoints, that logic needs to be implemented in helix_xharness.proj (or a different property should be used); otherwise consider removing this property to avoid confusion.

Suggested change
HelixProjectArguments: /p:TargetOS=maccatalyst /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsMacCatalyst_ /p:HelixInternal=False
${{ else }}:
HelixProjectArguments: /p:TargetOS=maccatalyst /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsMacCatalyst_ /p:HelixInternal=True
HelixProjectArguments: /p:TargetOS=maccatalyst /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsMacCatalyst_
${{ else }}:
HelixProjectArguments: /p:TargetOS=maccatalyst /p:TestRunNameSuffix=_$(_BuildConfig) /p:TestRunNamePrefix=DeviceTestsMacCatalyst_

Copilot uses AI. Check for mistakes.
Root cause: Azure DevOps validates ALL pool name references in YAML,
including those in parameter defaults. The 'NetCore-Public' pool doesn't
exist in the dnceng/internal project, causing instant YAML validation
failures for both device-tests and ui-tests pipelines since January 2026.

Changes (aligned with release/10.0.1xx-sr5):

1. ci-device-tests.yml:
   - Added darc-* branch trigger for Maestro dependency updates
   - Split pool parameters into Internal/Public variants
   - Added conditional pool selection based on System.TeamProject
   - Added Helix variable group for internal builds
   - Removed old common/device-tests.yml Windows section (now via Helix)

2. ci-uitests.yml:
   - Added darc-* branch trigger
   - Split pool parameters into Internal/Public variants
   - Added conditional pool selection (internal uses NetCore1ESPool-Internal
     and Azure Pipelines; public uses NetCore-Public and AcesShared)

3. stage-device-tests.yml:
   - Added HelixAccessToken and HelixInternal parameters
   - Forwarded tokens to all 5 send-to-helix invocations
   - Increased timeouts: build 60→120min, MacCatalyst 60→240min

4. Typo fixes across 5 files:
   - _BuildOfficalId → _BuildOfficialId (missing 'i')

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants