Skip to content

Pipelines | Read the general-purpose pool name from one shared variable group - #4627

Open
paulmedynski wants to merge 3 commits into
dev/paul/pool-imagefrom
dev/paul/pool-name
Open

Pipelines | Read the general-purpose pool name from one shared variable group#4627
paulmedynski wants to merge 3 commits into
dev/paul/pool-imagefrom
dev/paul/pool-name

Conversation

@paulmedynski

@paulmedynski paulmedynski commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Summary

One value - the general-purpose 1ES pool - was configured three different ways:

pipeline source
CI $(ci_var_defaultPoolName) from the ADO Build properties group
PR $(PoolNameDefault) from the sqlclient-testconfig-v1 group
CI package hardcoded ADO-1ES-Pool / ADO-CI-1ES-Pool, chosen by a System.TeamProject check

This consolidates them onto a single variable in a single group.

  • New variable group sqlclient-pipeline-config-v1, created in both the ADO.Net and Public projects and authorized for all pipelines, holding one variable:

    project general_purpose_pool_name
    ADO.Net ADO-1ES-Pool
    Public ADO-CI-1ES-Pool

    These are the values the two existing variables already carried in each project, so no pool assignment changes.

  • Read it at every pipeline root - CI core, PR, stress, GitHub sync and CI package. Templates below the root still receive the pool as a poolName parameter and never read a variable group directly.

  • Drop the project-name check in the CI package pipeline, which had its own copy of both pool names. isInternalBuild now serves only the signing key argument.

  • Remove a redundant job-scope import of ci-build-variables.yml from ci-build-nugets-job.yml, so no template below a pipeline root loads the group. See Review feedback.

How the variable reaches a job

Three supply paths, all rooted at a pipeline root:

path group declared in pipelines
A libraries/ci-build-variables.yml, imported at root CI core (4 roots), stress, GitHub sync
B pr/variables/pr-variables.yml pr/sqlclient-pr-pipeline.yml
C inline at the root ci/package/sqlclient-ci-package-pipeline.yml

Why "general-purpose"

We also run jobs on special-purpose pools - ADO-CI-AE-1ES-Pool (Always Encrypted), ADO-CI-PUBLIC-ARM64-1ES-EUS-POOL (ARM64), ADO-Trusted-*-WestUS2 (Kerberos), Managed-Instance-pool - plus the Microsoft-hosted Azure Pipelines pool for macOS. Those are still named directly at their point of use. The variable name leaves room for them to get their own entries in this group later.

No existing variable group is modified

ci_var_defaultPoolName and PoolNameDefault keep their current values in their current groups. They are simply no longer read by any pipeline, and can be retired separately once this has run clean.

Review feedback

ci-build-nugets-job.yml imported ci-build-variables.yml at job scope, which meant the new group was loaded below a pipeline root. The import was redundant: that job is reachable only via build-sqlclient-package-ci-stage.yml from dotnet-sqlclient-ci-core.yml, which already imports the same template at its root, so the only two variables the job consumes from it - localFeedPath and packagePath - were already in scope. It was also the only job template in the repo importing a shared variables file; every other job and stage template relies on root pipeline variables.

Removing it leaves ci-build-variables.yml with exactly three importers, all pipeline roots.

Also reworded the defaultPoolName parameter comment from "all CI jobs" to "most CI jobs", to agree with the special-purpose pools listed a few lines below it.

Validation

check result
YAML parses across eng/pipelines/** 90 files, 0 failures
References to ci_var_defaultPoolName / PoolNameDefault 0 (one comment remains, listing the older group's contents)
Pipeline roots reading general_purpose_pool_name 5
Importers of ci-build-variables.yml 3, all at pipeline root
Special-purpose pools still named directly unchanged
Variable group authorization allPipelines.authorized = true in both projects

Pipeline runs

All runs below are complete. Across all 8, 643 jobs ran with 0 failed and 0 cancelled.

A missing or unresolvable variable group is reported at queue time, before an agent is allocated, so a run that compiles already proves the group resolves in that project.

Public

Runs are on refs/pull/4627/merge (merge commit 0695d7bc).

pipeline path trigger run result jobs
PR-SqlClient-Project (2197) A automatic on PR push 173748 partially succeeded - 0 failed 141
sqlclient-pr (2281) B automatic on PR push 173749 succeeded 63
sqlclient-ci-package (2300) C queued manually 173752 succeeded 1

CI-SqlClient (1879) is path A on the same core template as PR-SqlClient-Project, and runs on main after merge. CI-SqlClient-Package (1917), PR-SqlClient-Package (2198) and sqlclient-ci-stress (2250) are affected but disabled, so there is nothing to run.

ADO.Net

These build the internal dotnet-sqlclient repo, so no GitHub PR can reach them. All runs are on refs/heads/dev/paul/pool-name at commit 5337d5c4.

pipeline path run result jobs
MDS Main CI (1825) A 173753 partially succeeded - 0 failed 218
MDS Main CI-Package (1933) A 173755 partially succeeded - 0 failed 199
sqlclient-ci-package (2277) C 173754 succeeded 1
sqlclient-ci-kerberos (2306) - 20260909.4 succeeded 10
sqlclient-ci-managed-instance (2308) - 173757 succeeded 10

sqlclient-ci-stress (2284) is affected but disabled. sqlclient-pr (2271) is path B, already covered by sqlclient-pr (2281) in Public.

sqlclient-ci-kerberos and sqlclient-ci-managed-instance carry no path, because they read no pool from a variable group - their stage templates name ADO-Trusted-*-WestUS2 and Managed-Instance-pool directly, which the pool data below confirms. They are included as regression evidence that the shared templates still expand for them, not as coverage of this change.

GitHub ADO mirror sync (2263) is affected - it is the only path A consumer that exists solely in ADO.Net - but running it pushes a sync branch and opens a PR in the internal repo, so it is left to its schedule rather than queued for validation.

Why "partially succeeded"

The three partiallySucceeded runs have no failed and no cancelled job. The result is downgraded solely by the quarantined flaky-test steps (Run Flaky Unit Tests, Run Flaky Manual Tests, Run Flaky Functional Tests), which report succeededWithIssues by design. That is the normal outcome for these pipelines.

run succeeded succeededWithIssues failed cancelled
173748 76 65 0 0
173753 112 106 0 0
173755 107 92 0 0

Pools actually used

Agent worker names were read from each run's timeline, covering all 643 jobs.

project pool jobs expected role
Public ADO-CI-1ES-Pool 182 general purpose - the value under test
ADO.Net ADO-1ES-Pool 356 general purpose - the value under test
ADO.Net ADO-CI-PUBLIC-ARM64-1ES-EUS-POOL 30 special purpose, named directly
Public ADO-CI-PUBLIC-ARM64-1ES-EUS-POOL 15 special purpose, named directly
ADO.Net ADO-CI-AE-1ES-Pool 14 special purpose, named directly
ADO.Net ADO-Trusted-Domain-Win-WestUS2 7 special purpose, named directly
ADO.Net ADO-Trusted-Linux-WestUS2 3 special purpose, named directly
ADO.Net Managed-Instance-pool 10 special purpose, named directly
ADO.Net Azure Pipelines 16 Microsoft-hosted, macOS
Public Azure Pipelines 8 Microsoft-hosted, macOS
ADO.Net (none - server job) 2 Finalize build

Every job landed on the pool its project expects. No Public job ran on ADO-1ES-Pool and no ADO.Net job ran on ADO-CI-1ES-Pool, so the group resolves to the correct per-project value with no leakage. The special-purpose pools appear exactly where they are named directly, unchanged by this PR.

build_mds_akv_packages_job - the job whose variables: block this PR removes - succeeded in every run that contains it, on the correct general-purpose pool each time:

run job pool
PR-SqlClient-Project 173748 Build MDS & AKV Packages ADO-CI-1ES-Pool
sqlclient-ci-package 173752 Build NuGet Packages ADO-CI-1ES-Pool
MDS Main CI 173753 Build MDS & AKV Packages ADO-1ES-Pool
sqlclient-ci-package 173754 Build NuGet Packages ADO-1ES-Pool
MDS Main CI-Package 173755 Build MDS & AKV Packages ADO-1ES-Pool

This is the direct evidence that localFeedPath and packagePath still resolve from pipeline-root scope after the job-scope import was dropped.

Note on the red checks in this PR

PR-SqlClient-Project 173781 and sqlclient-pr 173782 show as cancelled in the checks list. They are duplicate re-runs of the same merge commit 0695d7bc, re-triggered by an edit to this PR description rather than by any code change - triggerInfo reports the same pr.sourceSha as the clean pair above.

They were starved of agents: every cancelled job carries Remote machine provider issue: The agent did not connect within the alloted time of 45 minute(s), with no worker ever assigned. That is 1ES provisioning capacity, not a pipeline problem - 108 jobs in 173781 and 33 in 173782 did acquire agents on ADO-CI-1ES-Pool, the value this PR sets, and the earlier runs on the identical commit had zero agent issues.

The authoritative results for this change are 173748 and 173749.

Not affected

OneBranch (2240/2241), perf (2305/2311/2313), the sni and ctaip pipelines, and the docs pipelines.

Checklist

  • Tests added or updated - n/a, pipeline-only change
  • Public API changes documented - n/a
  • Verified against customer repro - n/a
  • Ensure no breaking changes introduced - no product code touched; pool values per project are unchanged

Copilot AI balanced review requested due to automatic review settings September 2, 2026 16:53
@github-project-automation github-project-automation Bot moved this to To triage in SqlClient Board Sep 2, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

The shared variables template is also imported below the pipeline root, violating the stated root-only variable-group design.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Centralizes general-purpose 1ES pool selection in the sqlclient_pipeline_config variable group.

Changes:

  • Replaces legacy and hardcoded pool names with general_purpose_pool_name.
  • Imports the new variable group across CI, PR, stress, sync, and package pipelines.
  • Retains project detection only for signing behavior.
File summaries
File Description
eng/pipelines/pr/variables/pr-variables.yml Imports the shared pool configuration.
eng/pipelines/pr/sqlclient-pr-pipeline.yml Passes the shared pool name to PR stages.
eng/pipelines/libraries/ci-build-variables.yml Adds the shared variable group import.
eng/pipelines/github-sync-pipeline.yml Uses the shared pool name.
eng/pipelines/dotnet-sqlclient-ci-core.yml Sets the default CI pool from the shared variable.
eng/pipelines/ci/stress/sqlclient-ci-stress-pipeline.yml Uses the shared pool for stress stages.
eng/pipelines/ci/package/sqlclient-ci-package-pipeline.yml Replaces project-based pool selection.
Review details
  • Files reviewed: 7/7 changed files
  • Comments generated: 2
  • Review effort level: Balanced

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread eng/pipelines/libraries/ci-build-variables.yml Outdated
Comment thread eng/pipelines/dotnet-sqlclient-ci-core.yml Outdated
Copilot AI review requested due to automatic review settings September 2, 2026 16:56
@paulmedynski paulmedynski added the Area\Engineering Use this for issues that are targeted for changes in the 'eng' folder or build systems. label Sep 2, 2026
@paulmedynski paulmedynski moved this from To triage to In progress in SqlClient Board Sep 2, 2026
@paulmedynski paulmedynski added this to the 7.1.0 milestone Sep 2, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

The pool references are consistently consolidated without changing stage structure or product behavior.

Review details
  • Files reviewed: 7/7 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

Copilot AI review requested due to automatic review settings September 3, 2026 19:54

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

It combines broad unrelated changes and has unresolved API-error handling and localization issues.

Review details
  • Files reviewed: 7/7 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

Copilot AI review requested due to automatic review settings September 3, 2026 19:59

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

Import the variable group explicitly at pipeline roots instead of through the shared job-variable template.

Review details

Suppressed comments (1)

eng/pipelines/libraries/ci-build-variables.yml:12

  • This shared template is also imported at job scope by common/templates/jobs/ci-build-nugets-job.yml:91, so adding the group here makes a nested template import the pipeline-level group despite the PR's root-only design. It also couples every consumer of these general build variables to this group. Import sqlclient-pipeline-config-v1 explicitly in the CI core, stress, and GitHub-sync roots instead, while keeping this shared job-variable template independent of the pool configuration.
  - group: sqlclient-pipeline-config-v1
  • Files reviewed: 7/7 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

The unrelated Kerberos behavior change and nested variable-group import must be addressed before approval.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Review details
  • Files reviewed: 8/8 changed files
  • Comments generated: 2
  • Review effort level: Balanced

Comment thread eng/pipelines/ci/kerberos/sqlclient-ci-kerberos-pipeline.yml
Comment thread eng/pipelines/libraries/ci-build-variables.yml
Copilot AI review requested due to automatic review settings September 8, 2026 12:49

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

The Azure DevOps variable-group integration has not yet been validated by executing the affected pipelines.

Review details
  • Files reviewed: 7/7 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

A moderate CI-pool comment inconsistency remains, and the pipeline-wide configuration requires human validation.

Review details

Suppressed comments (1)

eng/pipelines/dotnet-sqlclient-ci-core.yml:97

  • This says every CI job uses the general-purpose pool, but this file still routes ARM64, macOS, and enclave jobs to special-purpose pools (for example, lines 595, 728, and 753). Reword this as “most CI jobs” so the comment agrees with the exceptions documented below.
  # The name of the general-purpose 1ES pool that all CI jobs run in.
  • Files reviewed: 7/7 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

Copilot AI review requested due to automatic review settings September 9, 2026 10:23

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

Azure DevOps execution remains unverified, and a moderate documentation inconsistency remains unresolved.

Review details

Suppressed comments (1)

eng/pipelines/dotnet-sqlclient-ci-core.yml:97

  • This says every CI job uses the general-purpose pool, but the following comment correctly notes that Always Encrypted and ARM64 jobs use special-purpose pools. Saying “most CI jobs” would keep the documentation internally consistent with the actual routing.
  # The name of the general-purpose 1ES pool that all CI jobs run in.
  • Files reviewed: 7/7 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

paulmedynski added a commit that referenced this pull request Sep 9, 2026
Addresses review feedback on PR #4627.

ci-build-nugets-job.yml imported ci-build-variables.yml at job scope, which
meant the sqlclient-pipeline-config-v1 group was loaded below the pipeline
root. The import was redundant: that job is only reachable from
dotnet-sqlclient-ci-core.yml, which already imports the same template at its
root, so localFeedPath and packagePath were already in scope. It was also the
only job template in the repo importing a shared variables file. Remove it so
ci-build-variables.yml is imported at pipeline root only.

Also reword the defaultPoolName parameter comment to "most CI jobs", since
the Always Encrypted, ARM64, and macOS jobs use special-purpose pools.
Copilot AI review requested due to automatic review settings September 9, 2026 12:33

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

The Azure DevOps variable-group integration has not yet been validated by pipeline execution.

Review details
  • Files reviewed: 8/8 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

@paulmedynski
paulmedynski marked this pull request as ready for review September 9, 2026 14:55
@paulmedynski
paulmedynski requested a review from a team as a code owner September 9, 2026 14:55
cheenamalhotra
cheenamalhotra previously approved these changes Sep 9, 2026
The pool name was configured three different ways: the CI pipelines read
'ci_var_defaultPoolName' from 'ADO Build properties', the PR pipeline read
'PoolNameDefault' from 'sqlclient-testconfig-v1', and the package pipeline
hardcoded ADO-1ES-Pool or ADO-CI-1ES-Pool based on which project it ran in.
Three sources for one value, and the package pipeline's copy had to be edited
by hand whenever the pool changed.

Add a 'sqlclient_pipeline_config' variable group to both the ADO.Net and Public
projects, holding 'general_purpose_pool_name' set to that project's pool, and
read it at every pipeline root.  The name says general-purpose deliberately: we
also use special-purpose pools for Always Encrypted, ARM64, Kerberos and
Managed Instance jobs, which are still named directly and could get their own
variables later.

This also removes the project-name check that chose the package pipeline's
pool, so 'isInternalBuild' now serves only the signing key argument.

No existing variable group is modified.  'ci_var_defaultPoolName' and
'PoolNameDefault' keep their current values; they are simply no longer read.
Match the naming convention used by the other groups in these projects, such as
sqlclient-testconfig-v1 and symbols-variables-v3: dashes rather than
underscores, and a version suffix.

The group was renamed in place in both the ADO.Net and Public projects, so its
contents and its pipeline authorization are unchanged.
Addresses review feedback on PR #4627.

ci-build-nugets-job.yml imported ci-build-variables.yml at job scope, which
meant the sqlclient-pipeline-config-v1 group was loaded below the pipeline
root. The import was redundant: that job is only reachable from
dotnet-sqlclient-ci-core.yml, which already imports the same template at its
root, so localFeedPath and packagePath were already in scope. It was also the
only job template in the repo importing a shared variables file. Remove it so
ci-build-variables.yml is imported at pipeline root only.

Also reword the defaultPoolName parameter comment to "most CI jobs", since
the Always Encrypted, ARM64, and macOS jobs use special-purpose pools.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

The root-only variable flow is consistent, all references are updated, and validation covers both configured projects.

Review details
  • Files reviewed: 8/8 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

Copilot AI review requested due to automatic review settings September 9, 2026 17:36

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

Pool resolution remains root-scoped and the reported cross-project pipeline validation covers the affected paths.

Review details
  • Files reviewed: 8/8 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Area\Engineering Use this for issues that are targeted for changes in the 'eng' folder or build systems.

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

4 participants