Skip to content

[vs18.6] Fix OptProf bootstrapper channel: use 'int.stable' not 'release'#14005

Merged
rainersigwald merged 2 commits into
vs18.6from
janprovaznik/optprof-channel-intstable-vs18.6
Jun 8, 2026
Merged

[vs18.6] Fix OptProf bootstrapper channel: use 'int.stable' not 'release'#14005
rainersigwald merged 2 commits into
vs18.6from
janprovaznik/optprof-channel-intstable-vs18.6

Conversation

@JanProvaznik

@JanProvaznik JanProvaznik commented Jun 8, 2026

Copy link
Copy Markdown
Member

Problem

The previous fix (#13992, stable -> release) was wrong. On the official build it fails with:

##[error]Invalid JSON primitive: .

because release is not a valid channel moniker for VS 18. https://aka.ms/vs/18/release/channel bounces to a Bing fallback page, which the bootstrapper task saves as the .chman and then fails to parse as JSON.

Why release and stable are both wrong

The aka.ms moniker convention changed between VS17 and VS18:

moniker VS 17 VS 18
release real CDN manifest bounces to bing.com (broken)
stable bounces to bing.com real public CDN manifest (VisualStudio.18.Release.chman)
int.stable n/a internal vsdrop manifest (VisualStudio.18.int.stable.chman)

So for VS 18 the public GA channel is stable (not release). But the MicroBuild MicroBuildBuildVSBootstrapper task's CreateConfigFile only special-cases the VS17-era public names release/preview. Any other name — including stable — is routed down the internal path, where it parses the installer-manifest URL as a vsdrop {prefix};{suffix} drop. stable's public CDN URL has no semicolon, hence the original "drop url ... is invalid" failure.

Fix

Use int.stable: the internal, vsdrop-backed equivalent of stable. It tracks the stable 18.x bits (not the moving int.main that caused the System.Text.Json 10.0.0.4 drift in #13923), and because it is an internal channel its installer-manifest URL is a vsdrop {prefix};{suffix} URL that CreateConfigFile accepts.

  • https://aka.ms/vs/18/int.stable/channel resolves to VisualStudio.18.int.stable.chman on vsdrop.microsoft.com (verified).

Relevant task logic (CreateConfigFile): https://dev.azure.com/devdiv/Engineering/_git/MicroBuild?path=/src/Tasks/BuildVSBootstrapper/plugin.ps1&line=286&lineEnd=307&lineStartColumn=1&lineEndColumn=1&lineStyle=plain&_a=contents

Companion to #14006 (vs18.7).


Local validation (verified before merge)

Replicated every step the MicroBuildBuildVSBootstrapper task performs, using the same VSDrop token audience the task uses (per plugin.ps1):

Check Result Failure mode it rules out
(a) aka.ms/vs/18/int.stable/channel redirects to vsdrop (not bing.com) the release "Invalid JSON primitive" (Bing fallback page)
(b) .chman downloads and is valid JSON (11 channelItems) the release "Invalid JSON primitive"
(c) installer-manifest URL splits into {prefix};{suffix} (2 parts) the stable "drop url ... is invalid" (CreateConfigFile Split(";") check)
(d) config payload …;bootstrappers/Enterprise/configuration/vs_setup_bootstrapper.config returns HTTP 200 (after the corp→ZTN host rewrite the task does) the only downstream config-download risk
(bonus) installer .vsman downloads and parses (20,527 packages) the vsman overlay step input

This is the same code path int.main already runs successfully; int.stable only pins it to stable 18.x bits.

Note: the int.stable channel's installer manifest is named VisualStudioIntPreview.vsman (...Channels.IntPreviewInstallerManifest). That is just the drop's internal naming for the stable-pinned channel and does not affect correctness — all checks above passed.

'release' is not a valid VS18 channel moniker (aka.ms/vs/18/release/channel
bounces to a Bing page -> "Invalid JSON primitive"). 'stable' is the public
VS18 channel but the MicroBuildBuildVSBootstrapper task only special-cases the
VS17-era names release/preview, so it routes 'stable' down the internal vsdrop
path and rejects its public CDN URL ("drop url ... is invalid").

int.stable is the internal, vsdrop-backed equivalent of stable: it tracks the
stable 18.x bits (not the moving int.main that caused assembly drift) and its
installer-manifest URL is a vsdrop {prefix};{suffix} URL the task accepts.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

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.

Pull request overview

Updates the OptProf Visual Studio bootstrapper configuration for the VS 18.6 pipeline to use a VS18-valid internal channel moniker so the MicroBuild bootstrapper task can resolve and parse the channel manifest correctly.

Changes:

  • Change VisualStudio.ChannelName from 'release' to 'int.stable' for VS 18 builds.
  • Ensure MicroBuildBuildVSBootstrapper@3 receives the updated channel name via channelName: $(VisualStudio.ChannelName).

Avoid colliding with the in-flight 18.6.10 official build.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@JanProvaznik JanProvaznik requested a review from a team as a code owner June 8, 2026 16:13
@rainersigwald rainersigwald merged commit 2a32f1f into vs18.6 Jun 8, 2026
1 of 10 checks passed
@rainersigwald rainersigwald deleted the janprovaznik/optprof-channel-intstable-vs18.6 branch June 8, 2026 16:16
rainersigwald pushed a commit that referenced this pull request Jun 8, 2026
…ase' (#14006)

### Problem
The previous fix (#13993, `stable` -> `release`) was wrong. On the
official build it fails with:

> ##[error]Invalid JSON primitive: .

because `release` is **not a valid channel moniker for VS 18**.
`https://aka.ms/vs/18/release/channel` bounces to a Bing fallback page,
which the bootstrapper task saves as the `.chman` and then fails to
parse as JSON.

### Why `release` and `stable` are both wrong
The aka.ms moniker convention changed between VS17 and VS18:

| moniker | VS 17 | VS 18 |
| --- | --- | --- |
| `release` | real CDN manifest | bounces to bing.com (broken) |
| `stable` | bounces to bing.com | real **public** CDN manifest
(`VisualStudio.18.Release.chman`) |
| `int.stable` | n/a | **internal vsdrop** manifest
(`VisualStudio.18.int.stable.chman`) |

So for VS 18 the public GA channel is `stable` (not `release`). But the
MicroBuild `MicroBuildBuildVSBootstrapper` task's `CreateConfigFile`
only special-cases the VS17-era public names `release`/`preview`. Any
other name — including `stable` — is routed down the **internal** path,
where it parses the installer-manifest URL as a vsdrop
`{prefix};{suffix}` drop. `stable`'s public CDN URL has no semicolon,
hence the original *"drop url ... is invalid"* failure.

### Fix
Use **`int.stable`**: the **internal, vsdrop-backed** equivalent of
`stable`. It tracks the stable 18.x bits (not the moving `int.main` that
caused the System.Text.Json 10.0.0.4 drift in #13923), and because it is
an internal channel its installer-manifest URL is a vsdrop
`{prefix};{suffix}` URL that `CreateConfigFile` accepts.

- `https://aka.ms/vs/18/int.stable/channel` resolves to
`VisualStudio.18.int.stable.chman` on `vsdrop.microsoft.com` (verified).

Relevant task logic (`CreateConfigFile`):
https://dev.azure.com/devdiv/Engineering/_git/MicroBuild?path=/src/Tasks/BuildVSBootstrapper/plugin.ps1&line=286&lineEnd=307&lineStartColumn=1&lineEndColumn=1&lineStyle=plain&_a=contents



Companion to #14005 (vs18.6).




---

### Local validation (verified before merge)
Replicated every step the `MicroBuildBuildVSBootstrapper` task performs,
using the same VSDrop token audience the task uses

| Check | Result | Failure mode it rules out |
| --- | --- | --- |
| (a) `aka.ms/vs/18/int.stable/channel` redirects to **vsdrop** (not
bing.com) | ✅ | the `release` "Invalid JSON primitive" (Bing fallback
page) |
| (b) `.chman` downloads and is valid JSON (11 channelItems) | ✅ | the
`release` "Invalid JSON primitive" |
| (c) installer-manifest URL splits into `{prefix};{suffix}` (2 parts) |
✅ | the `stable` "drop url ... is invalid" (`CreateConfigFile`
`Split(";")` check) |
| (d) config payload
`…;bootstrappers/Enterprise/configuration/vs_setup_bootstrapper.config`
returns **HTTP 200** (after the corp→ZTN host rewrite the task does) | ✅
| the only downstream config-download risk |
| (bonus) installer `.vsman` downloads and parses (20,527 packages) | ✅
| the `vsman overlay` step input |

This is the same code path `int.main` already runs successfully;
`int.stable` only pins it to stable 18.x bits.

> Note: the `int.stable` channel's installer manifest is named
`VisualStudioIntPreview.vsman`
(`...Channels.IntPreviewInstallerManifest`). That is just the drop's
internal naming for the stable-pinned channel and does not affect
correctness — all checks above passed.

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.

3 participants