Skip to content

Retarget x64 CI to the NVMe 1ES pool and images - #142

Draft
David-Engel wants to merge 7 commits into
mainfrom
david/nvme-pool
Draft

Retarget x64 CI to the NVMe 1ES pool and images#142
David-Engel wants to merge 7 commits into
mainfrom
david/nvme-pool

Conversation

@David-Engel

@David-Engel David-Engel commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Summary

Switches every x64 Windows/Linux job in the Rust CI pipelines from the RUST-1ES-POOL-WUS3 pool (RUST-1ES-UBUSLIM / RUST-Win22-Sql25-1P images) to the NVMe-capable RUST-1ES-POOL-WUS3-NVME pool and the RUST-1ES-UBUSLIM-NVME / RUST-Win22-Sql25-1P-NVME images. The NVMe images/pool were newly provisioned (v6 D4ads_v6 SKU with a local NVMe temp disk); the old pool and images are being retired, so NVMe becomes the default everywhere rather than an opt-in override.

DRY refactor (single source of truth per file)

  • validation-stages.yml — adds poolName / linuxImage / windowsImage parameters (NVMe defaults); every inline x64 pool block now references them, so a future retarget is a 1–3 line change.
  • sync-container-images.yml — adds poolName / imageName pipeline variables; all 11 job pool blocks now reference them.

Straight rename

  • OneBranch/stages.yml, benchmark-pipeline.yml, sync-github-main-to-stable.yml
  • Shared templates: sql-host-template.yml, kerberos-test-template.yml, test-matrix-template.yml, test-matrix-template-alpine.yml, private-link-smoke-template.yml
  • run-benchmarks.ps1 comment and arm-sql-host-design.md

Unchanged (intentional)

ARM jobs (RUST-1ES-POOL-ARM-WUS3, RUST-UBUNTU-ARM64, RUST-WINSRV-ARM) — no NVMe ARM images exist.

Linked work item

AB#46593

Testing

  • All 10 changed YAML files parse with yaml.safe_load.
  • Verified the 19 ARM references are untouched and no non-NVMe x64 pool/image names remain (outside intentional references).
  • Not yet exercised on an actual pipeline run — needs a validation-pipeline run from this branch to confirm the NVMe pool schedules and builds green.

Breaking changes / migration notes

The NVMe pool uses a 4-vCPU D4ads_v6 SKU vs. the previous 8-vCPU pool. Functionally equivalent, but absolute perf/benchmark numbers will shift; PR-vs-target benchmark comparisons stay valid since both sides run on the same pool. The 1ES images/pool/subnet themselves are provisioned via Bicep that is intentionally kept out of this public repo (contains internal subscription/tenant IDs).

Switch every x64 Windows/Linux job in the Rust CI pipelines from the
RUST-1ES-POOL-WUS3 pool (RUST-1ES-UBUSLIM / RUST-Win22-Sql25-1P images)
to the NVMe-capable RUST-1ES-POOL-WUS3-NVME pool and the
RUST-1ES-UBUSLIM-NVME / RUST-Win22-Sql25-1P-NVME images.

The old pool and images are being retired, so the NVMe pool becomes the
default everywhere rather than an opt-in override.

DRY refactor for the two files with many references:
- validation-stages.yml: adds poolName / linuxImage / windowsImage
  parameters (NVMe defaults) as a single source of truth; every inline
  x64 pool block now references them.
- sync-container-images.yml: adds poolName / imageName pipeline variables;
  every job pool block now references them.

All other pipelines (OneBranch build, benchmark, sync-github-main-to-stable)
and the shared templates (sql-host, kerberos, test-matrix, test-matrix-alpine,
private-link) are renamed directly to the NVMe names.

ARM jobs (RUST-1ES-POOL-ARM-WUS3, RUST-UBUNTU-ARM64, RUST-WINSRV-ARM) are
unchanged - no NVMe ARM images exist.
Temporarily reduces .pipeline/validation-pipeline.yml (the PR validation
entry, def "mssql-rs Pull request validation") to a single DiskInfo stage
with a Linux and a Windows job that print disk hardware/layout and exit —
no build/test — to confirm the NVMe disk topology cheaply.

Also enriches the reusable diagnostics for when full validation is restored:
- print-disk-info.sh: lsblk TRAN/ROTA, /dev/nvme*, per-mount transport.
- PrintAgentDebugInfo.ps1: Get-PhysicalDisk BusType, Get-Disk, Get-Volume.
- validation-stages.yml Build_Linux: run print-disk-info.sh.

REVERT: restore the validation-stages.yml template call in
validation-pipeline.yml (kept commented at the bottom) and drop the
DiskInfo stage.
Disk fix verified on rebuilt images (Linux root 194G / Windows C: 200G, both
local NVMe). Restore the full validation-stages.yml matrix. The reusable disk
diagnostics (print-disk-info.sh, PrintAgentDebugInfo.ps1, Build_Linux disk step)
are kept.
The SSRP named-instance test (test_ssrp_named_instance_resolution) connects to
HOST\SQLDEV as sa. sql-setup-template.yml only configured SQLDEV's sa password
when the MSSQL$SQLDEV service was already Running, and silently skipped
otherwise. On freshly-built images the service can be stopped / manual-start at
setup time, so sa was never set and the test failed with 'Login failed for user
sa'. Now set the service to Automatic, start it, and wait for Running before
configuring, instead of skipping.
Generate-SqlCertificates.ps1 used a bare Restart-Service, which fails
intermittently on freshly-provisioned ephemeral NVMe images with
'cannot be stopped' (CouldNotStopService) because SQL Server is still
in startup/recovery. Wait for a steady state, then stop/start with
retries via Restart-SqlServiceSafely.
@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown

📊 Code Coverage Report

🔥 Diff Coverage

100%

🎯 Overall Coverage

90.3%

📦 Project: mssql-tds + mssql-odbc + mssql-py-core
ℹ️ Note: diff coverage is reported, not enforced.


Diff Coverage

Diff: main...HEAD, staged and unstaged changes

No lines with coverage information in this diff.


🔗 Quick Links

View Azure DevOps Build · Coverage Report

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.

1 participant