From fc7bbbb5202d713d920107bbcf2b899fe348e605 Mon Sep 17 00:00:00 2001 From: Rich Lander Date: Thu, 25 Jun 2026 10:37:00 -0700 Subject: [PATCH 1/5] Restore bare Ubuntu Helix VMs (undo VM->container change from #125535) Now that Ubuntu 26.04 VMs are available, undo the temporary VM-to-container conversion done in #125535. Each affected slot returns to a bare Ubuntu VM at its current version (queues verified present in Helix): helix-platforms.yml (oldest slots -> bare 22.04 VMs): - helix_linux_x64_oldest -> Ubuntu.2204.Amd64.Open - helix_linux_x64_oldest_internal -> Ubuntu.2204.Amd64 - helix_linux_x64_ubuntu_oldest -> Ubuntu.2204.Amd64.Open - helix_linux_arm64_oldest -> Ubuntu.2204.ArmArch.Open libraries/helix-queues-setup.yml (primary coverage -> bare 26.04 VMs): - Mono path -> Ubuntu.2604.Amd64.Open - Primary distro (general set) -> Ubuntu.2604.Amd64.Open Restores the bare-VM testing coverage described in the Ubuntu 26.04 VM plan (#125748). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- eng/pipelines/helix-platforms.yml | 8 ++++---- eng/pipelines/libraries/helix-queues-setup.yml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/pipelines/helix-platforms.yml b/eng/pipelines/helix-platforms.yml index d3f2da1d927eaa..68ebec8f85d929 100644 --- a/eng/pipelines/helix-platforms.yml +++ b/eng/pipelines/helix-platforms.yml @@ -93,10 +93,10 @@ variables: # Oldest: Ubuntu 22.04 - name: helix_linux_x64_oldest - value: (Ubuntu.2204.Amd64.Open)AzureLinux.3.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-helix-amd64 + value: Ubuntu.2204.Amd64.Open - name: helix_linux_x64_oldest_internal - value: (Ubuntu.2204.Amd64)AzureLinux.3.Amd64@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-helix-amd64 + value: Ubuntu.2204.Amd64 # Ubuntu x64 # Latest: 26.04 @@ -105,7 +105,7 @@ variables: # Oldest: 22.04 - name: helix_linux_x64_ubuntu_oldest - value: (Ubuntu.2204.Amd64.Open)AzureLinux.3.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-helix-amd64 + value: Ubuntu.2204.Amd64.Open # Debian x64 # Latest: 13 @@ -165,7 +165,7 @@ variables: # Oldest: Ubuntu 22.04 - name: helix_linux_arm64_oldest - value: (Ubuntu.2204.ArmArch.Open)AzureLinux.3.Arm64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-helix-arm64v8 + value: Ubuntu.2204.ArmArch.Open # Linux musl x64 # Latest: Alpine edge diff --git a/eng/pipelines/libraries/helix-queues-setup.yml b/eng/pipelines/libraries/helix-queues-setup.yml index 4b9f6f4f88c4c9..c0eb665d0d4111 100644 --- a/eng/pipelines/libraries/helix-queues-setup.yml +++ b/eng/pipelines/libraries/helix-queues-setup.yml @@ -56,7 +56,7 @@ jobs: - ${{ else }}: - ${{ if eq(parameters.jobParameters.runtimeFlavor, 'mono') }}: # Mono path - test minimal scenario - - (Ubuntu.2604.Amd64.Open)AzureLinux.3.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-26.04-helix-amd64@sha256:f481273f9ce3fe5e1b005a088dbc4299640729c7edcc1f9e0f7bbc005218f531 + - Ubuntu.2604.Amd64.Open - ${{ else }}: # CoreCLR path - ${{ if and(eq(parameters.jobParameters.isExtraPlatformsBuild, true), ne(parameters.jobParameters.testScope, 'outerloop'))}}: @@ -73,7 +73,7 @@ jobs: - ${{ if or(ne(parameters.jobParameters.isExtraPlatformsBuild, true), eq(parameters.jobParameters.includeAllPlatforms, true))}}: # inner and outer loop CoreCLR (general set) # Primary distro for all builds - - (Ubuntu.2604.Amd64.Open)AzureLinux.3.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-26.04-helix-amd64@sha256:f481273f9ce3fe5e1b005a088dbc4299640729c7edcc1f9e0f7bbc005218f531 + - Ubuntu.2604.Amd64.Open # Additional distros on non-PR builds for broader coverage - ${{ if or(eq(variables['isRollingBuild'], true), eq(parameters.jobParameters.includeAllPlatforms, true)) }}: - (AzureLinux.3.0.Amd64.Open)AzureLinux.3.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-helix-amd64@sha256:55365142148944e7d4162afa2ac96c72dc7eb1c1d8c8e58d594b806373c4caf6 From 280ff3d655ffcfd5e9a19bfc456b47f0cfb0afe8 Mon Sep 17 00:00:00 2001 From: Rich Lander Date: Thu, 25 Jun 2026 10:47:31 -0700 Subject: [PATCH 2/5] Keep Mono path on Ubuntu 26.04 container Revert the Mono path (linux_x64) back to the ubuntu-26.04-helix-amd64 container on AzureLinux; only the CoreCLR primary distro and the helix-platforms oldest slots return to bare Ubuntu VMs. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- eng/pipelines/libraries/helix-queues-setup.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/pipelines/libraries/helix-queues-setup.yml b/eng/pipelines/libraries/helix-queues-setup.yml index c0eb665d0d4111..247af96ae89c35 100644 --- a/eng/pipelines/libraries/helix-queues-setup.yml +++ b/eng/pipelines/libraries/helix-queues-setup.yml @@ -56,7 +56,7 @@ jobs: - ${{ else }}: - ${{ if eq(parameters.jobParameters.runtimeFlavor, 'mono') }}: # Mono path - test minimal scenario - - Ubuntu.2604.Amd64.Open + - (Ubuntu.2604.Amd64.Open)AzureLinux.3.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-26.04-helix-amd64@sha256:f481273f9ce3fe5e1b005a088dbc4299640729c7edcc1f9e0f7bbc005218f531 - ${{ else }}: # CoreCLR path - ${{ if and(eq(parameters.jobParameters.isExtraPlatformsBuild, true), ne(parameters.jobParameters.testScope, 'outerloop'))}}: From 8ef28ffcc7cb78bb7ec8f3c3c5d5fcca708513fe Mon Sep 17 00:00:00 2001 From: Rich Lander Date: Thu, 25 Jun 2026 10:51:00 -0700 Subject: [PATCH 3/5] Move oldest Linux Helix VMs from Ubuntu 22.04 to 24.04 Ahead of retiring the Ubuntu 22.04 VMs, make 24.04 the oldest bare-VM slot (queues verified present in Helix): - helix_linux_x64_oldest -> Ubuntu.2404.Amd64.Open - helix_linux_x64_oldest_internal -> Ubuntu.2404.Amd64 - helix_linux_x64_ubuntu_oldest -> Ubuntu.2404.Amd64.Open - helix_linux_arm64_oldest -> Ubuntu.2404.ArmArch.Open Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- eng/pipelines/helix-platforms.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/eng/pipelines/helix-platforms.yml b/eng/pipelines/helix-platforms.yml index 68ebec8f85d929..8f5a23aea8c283 100644 --- a/eng/pipelines/helix-platforms.yml +++ b/eng/pipelines/helix-platforms.yml @@ -91,21 +91,21 @@ variables: - name: helix_linux_x64_latest_internal value: AzureLinux.3.Amd64 - # Oldest: Ubuntu 22.04 + # Oldest: Ubuntu 24.04 - name: helix_linux_x64_oldest - value: Ubuntu.2204.Amd64.Open + value: Ubuntu.2404.Amd64.Open - name: helix_linux_x64_oldest_internal - value: Ubuntu.2204.Amd64 + value: Ubuntu.2404.Amd64 # Ubuntu x64 # Latest: 26.04 - name: helix_linux_x64_ubuntu_latest value: (Ubuntu.2604.Amd64.Open)AzureLinux.3.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-26.04-helix-amd64 - # Oldest: 22.04 + # Oldest: 24.04 - name: helix_linux_x64_ubuntu_oldest - value: Ubuntu.2204.Amd64.Open + value: Ubuntu.2404.Amd64.Open # Debian x64 # Latest: 13 @@ -163,9 +163,9 @@ variables: - name: helix_linux_arm64_latest value: (Ubuntu.2604.ArmArch.Open)AzureLinux.3.Arm64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-26.04-helix-arm64v8 - # Oldest: Ubuntu 22.04 + # Oldest: Ubuntu 24.04 - name: helix_linux_arm64_oldest - value: Ubuntu.2204.ArmArch.Open + value: Ubuntu.2404.ArmArch.Open # Linux musl x64 # Latest: Alpine edge From 041f946ba3c590bc3c2400cd14949d8c56f081b6 Mon Sep 17 00:00:00 2001 From: Rich Lander Date: Thu, 25 Jun 2026 11:22:10 -0700 Subject: [PATCH 4/5] Ubuntu Helix: latest -> bare 26.04 VMs, wasm oldest -> 24.04 - helix_linux_x64_ubuntu_latest -> Ubuntu.2604.Amd64.Open (bare VM, no container) - helix_linux_arm64_latest -> Ubuntu.2604.ArmArch.Open (bare VM, no container) - helix_browser_wasm_oldest -> ubuntu-24.04-helix-webassembly-amd64 (kept as container; the WASM toolchain image is required) WASM latest stays on the 26.04 webassembly container for the same reason. All bare-VM queues and image tags verified present (Helix queue API / MCR registry). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- eng/pipelines/helix-platforms.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/eng/pipelines/helix-platforms.yml b/eng/pipelines/helix-platforms.yml index 8f5a23aea8c283..41edbd4a888c39 100644 --- a/eng/pipelines/helix-platforms.yml +++ b/eng/pipelines/helix-platforms.yml @@ -101,7 +101,7 @@ variables: # Ubuntu x64 # Latest: 26.04 - name: helix_linux_x64_ubuntu_latest - value: (Ubuntu.2604.Amd64.Open)AzureLinux.3.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-26.04-helix-amd64 + value: Ubuntu.2604.Amd64.Open # Oldest: 24.04 - name: helix_linux_x64_ubuntu_oldest @@ -161,7 +161,7 @@ variables: # Linux ARM64 # Latest: Ubuntu 26.04 - name: helix_linux_arm64_latest - value: (Ubuntu.2604.ArmArch.Open)AzureLinux.3.Arm64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-26.04-helix-arm64v8 + value: Ubuntu.2604.ArmArch.Open # Oldest: Ubuntu 24.04 - name: helix_linux_arm64_oldest @@ -262,9 +262,9 @@ variables: - name: helix_browser_wasm_latest value: (Ubuntu.2604.Amd64.Open)AzureLinux.3.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-26.04-helix-webassembly-amd64 - # Oldest: Ubuntu 22.04 + # Oldest: Ubuntu 24.04 - name: helix_browser_wasm_oldest - value: (Ubuntu.2204.Amd64.Open)AzureLinux.3.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-helix-webassembly-amd64 + value: (Ubuntu.2404.Amd64.Open)AzureLinux.3.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-24.04-helix-webassembly-amd64 # =========================================== # Android Platforms From fbd1a2da4aaf57fc9daae825393016281eac9052 Mon Sep 17 00:00:00 2001 From: Rich Lander Date: Thu, 25 Jun 2026 11:22:11 -0700 Subject: [PATCH 5/5] update-os-coverage skill: verify image tags via MCR registry Make the MCR registry tag list (mcr.microsoft.com/v2/dotnet-buildtools/prereqs/tags/list) the source of truth for confirming container tags. The image-info JSON in dotnet/versions can be stale or unavailable when branch protection blocks its automated push; note the in-flux state and the pending ORAS/OCI-artifact migration (dotnet/docker-tools#2142). Image-info is now a secondary cross-check. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/skills/update-os-coverage/SKILL.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/skills/update-os-coverage/SKILL.md b/.github/skills/update-os-coverage/SKILL.md index ca4fcaba69aa93..0d87d22e6df6d2 100644 --- a/.github/skills/update-os-coverage/SKILL.md +++ b/.github/skills/update-os-coverage/SKILL.md @@ -89,15 +89,17 @@ Use the repo tools that fit the environment. The shell snippets below are refere ### 1. Verify container image availability -Before making any changes, confirm the **exact target container tag** exists in the [image-info JSON](https://github.com/dotnet/versions/blob/main/build-info/docker/image-info.dotnet-dotnet-buildtools-prereqs-docker-main.json). This file is more authoritative than probing the registry directly and should be the primary source of truth for published `dotnet-buildtools/prereqs` tags: +Before making any changes, confirm the **exact target container tag** exists by querying the MCR registry directly. The registry is the ground truth for published `dotnet-buildtools/prereqs` tags: ```bash TARGET_TAG="" -curl -sL https://github.com/dotnet/versions/raw/refs/heads/main/build-info/docker/image-info.dotnet-dotnet-buildtools-prereqs-docker-main.json \ - | jq -e --arg tag "$TARGET_TAG" 'any(.repos[].images[].platforms[].simpleTags[]; . == $tag)' +curl -s https://mcr.microsoft.com/v2/dotnet-buildtools/prereqs/tags/list \ + | jq -e --arg tag "$TARGET_TAG" 'any(.tags[]; . == $tag)' ``` -If the exact tag is **not found in `image-info`**, stop and inform the user. Treat that as authoritative even if a registry lookup appears to work. The image must be created first at [dotnet/dotnet-buildtools-prereqs-docker](https://github.com/dotnet/dotnet-buildtools-prereqs-docker). Check if an open issue or PR already exists, for example: +> **⚠️ This is in flux.** Image-info publishing is mid-transition. The [image-info JSON](https://github.com/dotnet/versions/blob/main/build-info/docker/image-info.dotnet-dotnet-buildtools-prereqs-docker-main.json) in `dotnet/versions` was historically the source of truth, but it is published by committing back to `dotnet/versions` and can be **stale or unavailable** when branch protection blocks that automated push. The fix in flight ([dotnet/docker-tools#2142](https://github.com/dotnet/docker-tools/issues/2142)) moves image-info to an **ORAS-based OCI artifact** published to the registry alongside the images. Until that lands, **trust the registry tag list** (above) as the source of truth and treat the image-info JSON only as a possibly-stale cross-check. Revisit this step once the ORAS solution ships. + +If the exact tag is **not found in the registry**, stop and inform the user. The image must be created first at [dotnet/dotnet-buildtools-prereqs-docker](https://github.com/dotnet/dotnet-buildtools-prereqs-docker). Check if an open issue or PR already exists, for example: ```bash gh search issues " " --repo dotnet/dotnet-buildtools-prereqs-docker --state open @@ -170,13 +172,13 @@ For each reference found in step 3: Architecture suffixes vary: `Amd64`, `Arm64`, `ArmArch`, `Arm32` for queue names; `amd64`, `arm64v8`, `arm32v7` for image tags. - When both generic and processor-specific aliases exist in `image-info` (for example, `ubuntu-26.04-helix-webassembly` and `ubuntu-26.04-helix-webassembly-amd64`), **prefer the processor-specific tag** when the queue/environment is processor-specific: + When both generic and processor-specific aliases exist in the registry (for example, `ubuntu-26.04-helix-webassembly` and `ubuntu-26.04-helix-webassembly-amd64`), **prefer the processor-specific tag** when the queue/environment is processor-specific: - `...Amd64...` queue → prefer `*-amd64` - `...Arm64...` / `...ArmArch...` queue → prefer `*-arm64v8` - `...Arm32...` queue → prefer `*-arm32v7` - Use the generic alias only when the surrounding environment is intentionally architecture-agnostic or when no processor-specific tag exists in `image-info`. + Use the generic alias only when the surrounding environment is intentionally architecture-agnostic or when no processor-specific tag exists in the registry. For ARM-based queues, host queues are often `Ubuntu.2204.ArmArch.Open`, but some queues (for example `helix_linux_arm64_oldest`) use AzureLinux-based host queues such as `AzureLinux.3.Arm64.Open`. Follow the existing pattern for the specific queue in `eng/pipelines/helix-platforms.yml` when updating versions. @@ -188,7 +190,7 @@ After editing, verify: 2. **All new references are syntactically consistent** — compare with adjacent entries in the same file to verify formatting. -3. **Updated image tags are present in `image-info`** — verify that each new tag you used appears in `image-info.dotnet-dotnet-buildtools-prereqs-docker-main.json`. +3. **Updated image tags exist in the registry** — verify that each new tag you used appears in the MCR registry tag list (`https://mcr.microsoft.com/v2/dotnet-buildtools/prereqs/tags/list`). 4. **Variable names are unchanged** — only the `value` fields change, never the `name` fields. @@ -262,7 +264,7 @@ Check if the relevant `supported-os.json` in dotnet/core needs corresponding upd The PR description should include: - Table of changes (old version → new version, which slots) - EOL dates for old and new versions - - Confirmation that the exact container image tags are available in `image-info.dotnet-dotnet-buildtools-prereqs-docker-main.json` + - Confirmation that the exact container image tags are available in the MCR registry (`mcr.microsoft.com/v2/dotnet-buildtools/prereqs/tags/list`) - Which CI pipeline(s) need to run (see [step 6](#6-ci-pipeline-coverage)) - Link to the [os-onboarding guide](https://github.com/dotnet/runtime/blob/main/docs/project/os-onboarding.md) - Link to tracking issue if applicable (e.g. [dotnet/core#9638](https://github.com/dotnet/core/issues/9638)) @@ -300,7 +302,8 @@ When asked to audit all OS coverage: - [OS onboarding guide](../../../docs/project/os-onboarding.md) - [.NET OS Support Tracking](https://github.com/dotnet/core/issues/9638) - [Prereq container image lifecycle](https://github.com/dotnet/dotnet-buildtools-prereqs-docker/blob/main/lifecycle.md) -- [Container image registry (image-info)](https://github.com/dotnet/versions/blob/main/build-info/docker/image-info.dotnet-dotnet-buildtools-prereqs-docker-main.json) +- [MCR registry tag list](https://mcr.microsoft.com/v2/dotnet-buildtools/prereqs/tags/list) — source of truth for published `dotnet-buildtools/prereqs` tags +- [image-info JSON](https://github.com/dotnet/versions/blob/main/build-info/docker/image-info.dotnet-dotnet-buildtools-prereqs-docker-main.json) — secondary cross-check; currently in flux and may be stale or unavailable, pending the ORAS/OCI-artifact migration in [dotnet/docker-tools#2142](https://github.com/dotnet/docker-tools/issues/2142) - [endoflife.date](https://endoflife.date/) for OS lifecycle data - [PR #125991](https://github.com/dotnet/runtime/pull/125991) — example EOL OS version replacement - [PR #111768](https://github.com/dotnet/runtime/pull/111768) — example new OS version onboarding