MSBuild Release Checklist 18.7
Release Output
Artifacts produced over the course of the release. Record each URL here as the corresponding phase completes so this issue serves as the single index back into every PR / build / tag that defines 18.7.1 (the version that shipped to customers; the template originally assumed 18.7.0).
Inputs
Fill in these values before starting. Version increments are irregular — they must be specified explicitly.
| Placeholder |
Description |
Value |
{{PREVIOUS_RELEASE_VERSION}} |
Version being replaced as latest |
18.6 |
{{THIS_RELEASE_VERSION}} |
Version being released now |
18.7 |
{{THIS_RELEASE_EXACT_VERSION}} |
Full VersionPrefix from eng/Versions.props on the release branch after final branding (e.g. 18.6.0). For non-patch releases this is always {{THIS_RELEASE_VERSION}}.0. |
18.7.0 (bumped to 18.7.1 on the inserted build to enable OptProf-fresh insertion) |
{{NEXT_VERSION}} |
Version that main will be bumped to |
18.8 |
{{BRANCH_SNAP_DATE}} |
Date we create vs18.7 from main. |
~2026-04-24 (estimated; branch existed by 2026-04-30 when merge-chain update PR #13643 merged) |
{{INSIDERS_SNAP_DATE}} |
Date VS snaps main → rel/insiders. Final-branded MSBuild must be in VS main before this date. From VS-Dates wiki |
2026-05-01 |
{{STABLE_SNAP_DATE}} |
Date VS snaps rel/insiders → rel/stable. From VS-Dates wiki |
2026-05-27 |
{{VS_SHIP_DATE}} |
Date VS ships publicly (GA). Post-GA tasks (nuget.org, docs) happen after this. |
2026-06-09 |
{{PACKAGE_VALIDATION_BASELINE_VERSION}} |
Latest 18.7.0-preview-NNNNN-NN MSBuild build reachable from vs18.7. Used as the ApiCompat baseline for the bumped main. How to determine it: see the release skill. |
18.7.0-preview-26229-01 (matches the 18.7 preview just inserted into VS main) |
Derived values (do not edit — computed from inputs):
- Release branch:
vs18.7
- DARC channel:
VS 18.7 (ID 10189)
- Next DARC channel:
VS 18.8 (ID 10188)
- VS insertion target: VS
main (VS snaps main → insiders → stable on its own schedule)
Phase 0: Instantiate Release
Trigger: User decides to start a release. Do this first.
Phase 1: Branch & Prepare
Trigger: ~2026-04-24 reached.
Steps are sequential — complete in order.
Phase 2: DARC Subscription Updates
Trigger: vs18.7 branch exists (Phase 1 complete).
Why this runs before bumping main: consumers of MSBuild via main (notably the VMR) should start receiving next-version bits from the VS 18.8 channel the moment main is bumped. Reassigning main's default channel before the Phase 3 branding bump means the first main build at the new version is already published to the correct channel; otherwise it lands on the now-stale VS 18.7 channel.
First, gather information (read-only queries — no PR needed):
Then, batch all write operations into one PR on the maestro-configuration repo.
Use --configuration-branch msbuild-18.7-main-bump and --no-pr on all but the last command:
Verifications (parallel — read-only, no ordering dependency):
Roslyn subscription verification intentionally omitted from the per-release checklist: there is always exactly one Roslyn subscription, targeting main only and its channel does not rotate with SDK bands.
NuGet subscription: when the next-to-ship SDK band rotates (e.g. 4xx → 5xx), the NuGet → msbuild/main subscription must be re-pointed to the new band's channel. For 18.7: no SDK band rotation, so no re-point was required. (The old template's per-release NuGet/Roslyn verifications + the "should be Enabled: False" assertion have been removed; both subscriptions remained Enabled: True — this is intentional under the new policy.)
Phase 3: Bump Main & Update Pipelines
Trigger: Phase 2 DARC updates merged (main's default channel is now VS 18.8).
Create one PR in main containing all of the following changes:
Phase 4: Final Branding & VS Insertion
Trigger: 7 calendar days before 2026-05-01 (i.e., ~2026-04-24).
Precondition: Phases 1–3 complete. Preview builds from vs18.7 have been inserting into VS main since Phase 2.
Goal: Final-brand the release branch and get the final-branded bits inserted into VS main before VS snaps to rel/insiders.
Steps are sequential.
After insiders snap (only if a backport to insiders is needed):
🛑 4.7 and 4.8 are NOT part of the regular release flow — skip them entirely on a normal release.
They only apply when servicing a previously-shipped release (i.e. you actually have a hotfix commit on vs18.7 that needs to be inserted into VS's already-snapped rel/insiders or rel/stable branch). If you have no such commit to service, leave AutoInsertTargetBranch untouched and move on to Phase 5.
⚠️ When you do need to service: re-confirm which VS branch you actually want to insert into before flipping AutoInsertTargetBranch. The default is main, so forgetting to retarget after the snap silently lands your fix in the next VS instead of the one you're servicing.
Phase 5: Post-GA
Trigger: 2026-06-09 has passed and VS release (18.7.0 Feature Update) has shipped. ← Today.
Steps are mostly parallel unless noted.
If 18.8 is a new major version
18.8 is not a new major version (still 18.x). This section can be ignored for this release.
MSBuild Release Checklist 18.7
Release Output
Artifacts produced over the course of the release. Record each URL here as the corresponding phase completes so this issue serves as the single index back into every PR / build / tag that defines
18.7.1(the version that shipped to customers; the template originally assumed18.7.0).18.7/18.8)VS 18.8)mainnext-version main-bump PRmaintestMicrosoft.Build.Utilities.UnitTests_net472_x86vs18.7final branding PR6ed5e9aa)18.7.1-servicing-26230-11→ VSmainbefore insiders snap)v18.7.1— tagged at commit024f5b03(the GA build's source). Note: shipped version is18.7.1, not18.7.0— see Phase 5.1 below.Inputs
Fill in these values before starting. Version increments are irregular — they must be specified explicitly.
{{PREVIOUS_RELEASE_VERSION}}18.6{{THIS_RELEASE_VERSION}}18.7{{THIS_RELEASE_EXACT_VERSION}}VersionPrefixfromeng/Versions.propson the release branch after final branding (e.g.18.6.0). For non-patch releases this is always{{THIS_RELEASE_VERSION}}.0.18.7.0(bumped to18.7.1on the inserted build to enable OptProf-fresh insertion){{NEXT_VERSION}}18.8{{BRANCH_SNAP_DATE}}vs18.7frommain.~2026-04-24(estimated; branch existed by 2026-04-30 when merge-chain update PR #13643 merged){{INSIDERS_SNAP_DATE}}main→rel/insiders. Final-branded MSBuild must be in VSmainbefore this date. From VS-Dates wiki2026-05-01{{STABLE_SNAP_DATE}}rel/insiders→rel/stable. From VS-Dates wiki2026-05-27{{VS_SHIP_DATE}}2026-06-09{{PACKAGE_VALIDATION_BASELINE_VERSION}}18.7.0-preview-NNNNN-NNMSBuild build reachable fromvs18.7. Used as the ApiCompat baseline for the bumpedmain. How to determine it: see the release skill.18.7.0-preview-26229-01(matches the 18.7 preview just inserted into VSmain)Derived values (do not edit — computed from inputs):
vs18.7VS 18.7(ID 10189)VS 18.8(ID 10188)main(VS snaps main → insiders → stable on its own schedule)Phase 0: Instantiate Release
eng/Versions.propsonmainhadVersionPrefix=18.7.0at the time of the snapvs18.7did not already existVS 18.7exists (ID: 10189):darc get-channels{{PLACEHOLDERS}}replacedPhase 1: Branch & Prepare
Steps are sequential — complete in order.
mainthat should ship in18.7. Anything that lands inmainafter Phase 1.1 will go into18.8instead.(Not explicitly tracked in this release; step is new in the updated checklist.)
vs18.7from HEAD ofmain(requires repo admin rights —git pushtorefs/heads/vs*is restricted; if you don't have permission, ask a repo admin withvs*push rights to do it):git push upstream HEAD:refs/heads/vs18.7git push upstream <correct_sha>:refs/heads/vs18.7Use
--configuration-branch msbuild-18.7on every command and--no-pron all but the last:darc add-default-channel --channel "VS 18.7" --branch vs18.7 --repo https://github.com/dotnet/msbuild --configuration-branch msbuild-18.7 --no-prdarc add-channel --name "VS 18.8" --configuration-branch msbuild-18.7 --no-prChannel VS 18.8 already existed (ID 10188), so this was a no-op.
--no-prto create the PR):darc add-default-channel --channel "VS 18.8" --branch vs18.8 --repo https://github.com/dotnet/msbuild --configuration-branch msbuild-18.7.config/git-merge-flow-config.jsonc:vs18.7as the last entry beforemainin the merge chain. Add a comment noting the VS/SDK version context. Done via PR Update merge-flow config for vs18.7 release branch #13643 (merged 2026-04-30); follow-up auto-merge-flow PR [automated] Merge branch 'vs18.7' => 'main' #13659 still pending.MergeToBranchentries and rewire the chain to skip them so automation does not open stale forward-merge PRs.(Not explicitly tracked in this release; step is new in the updated checklist.)
How to identify a retired branch:
vs18.7 - 3=vs18.4— always confirm on the wiki, since servicing exceptions can extend specific versions beyond the rule of thumb.Phase 2: DARC Subscription Updates
First, gather information (read-only queries — no PR needed):
darc get-subscriptions --exact --source-repo https://github.com/dotnet/msbuild --channel "VS 18.7"Found:
d1c6afb2-7bf1-43e4-8f2e-af7e0680b540darc get-default-channels --source-repo https://github.com/dotnet/msbuild --branch vs18.7vs18.7 → VS 18.7association already existed (id 6921) — 2.3d not needed.Then, batch all write operations into one PR on the maestro-configuration repo.
Use
--configuration-branch msbuild-18.7-main-bumpand--no-pron all but the last command:darc delete-default-channel --repo https://github.com/dotnet/msbuild --branch main --channel "VS 18.7" --configuration-branch msbuild-18.7-main-bump --no-pr→ maestro-config PR #60704
darc add-default-channel --channel "VS 18.8" --branch main --repo https://github.com/dotnet/msbuild --configuration-branch msbuild-18.7-main-bump --no-pr→ maestro-config PR #60705
darc update-subscription --id d1c6afb2-7bf1-43e4-8f2e-af7e0680b540 --channel "VS 18.8" --configuration-branch msbuild-18.7-main-bump --no-pr→ maestro-config PR #60706
vs18.7 → VS 18.7association already existed (verified in 2.2).(Not tracked in this release; step is new in the updated checklist.)
Verifications (parallel — read-only, no ordering dependency):
vs18.7:darc get-subscriptions --exact --target-repo https://github.com/dotnet/msbuild --source-repo https://github.com/dotnet/arcadeResult:
Enabled: True, source channel.NET 10 Eng. ✓Phase 3: Bump Main & Update Pipelines
Create one PR in
maincontaining all of the following changes:eng/Versions.props: UpdateVersionPrefixto18.8.0eng/Versions.props: UpdatePackageValidationBaselineVersionto18.7.0-preview-26229-01(matches the 18.7 preview just inserted into VSmain). See How to determinePACKAGE_VALIDATION_BASELINE_VERSIONin the release skill.CompatibilitySuppressions.xmlupdates were required this release.maintestMicrosoft.Build.Utilities.UnitTests_net472_x86. Needs admin merge or test fix.Phase 4: Final Branding & VS Insertion
Steps are sequential.
vs18.7branch:No-op for 18.7 — no non-empty
PublicAPI.Unshipped.txtentries onvs18.7.scripts/Stabilize-Release.ps1onvs18.7branch (applied via PR Final branding for 18.7 release #13658).vs18.7: #13658 — MERGED 2026-04-30 12:27 UTC (commit6ed5e9aa).vs18.7. After the final-branding commit (4.3) merged, the official build was auto-triggered without OptProf data for the new branch and failed. Workaround applied:vs18.7.vs18.7with the OptProf override frommain— setOptional OptProfDrop Overridetomain's latest OptProf drop path. For 18.7 the override path was…/main/20260428.11/13968297/1per rainersigwald's guidance, producing build 13982412 (20260430.11, version18.7.1).18.7 needed this approval (release was running close to the schedule).
vs18.7into VSmain: devdiv VS PR #734106 — merged 2026-05-01 01:58 UTC (vs18.7 18.7.1-servicing-26230-11→ VSmain, before the 5/1 insiders snap).After insiders snap (only if a backport to insiders is needed):
azure-pipelines/vs-insertion.yml: retargetAutoInsertTargetBranchforvs18.7from VSmain→rel/insiders. N/A for 18.7 — see callout above.azure-pipelines/vs-insertion.yml: retargetAutoInsertTargetBranchforvs18.7→rel/stable. N/A for 18.7 — see callout above.Phase 5: Post-GA
Steps are mostly parallel unless noted.
5.1 Push packages to nuget.org. (5.1a–c verified; 5.1d email sent 2026-06-10.)
Shipped version =
18.7.1(18.7.1-servicing-26230-11) — confirmed from VSrel/stable.corext/Configs/msbuild-components.json(Microsoft.Build→18.7.1-servicing-26230-11+024f5b0379cf99b95bc8939cd92a57912528b55c).vs18.7, build20260430.11(id13982412, result succeeded), source commit024f5b0379cf99b95bc8939cd92a57912528b55c. Build run.PackageArtifactsverified — all 7 shipping nupkgs present as18.7.1:Microsoft.Build.Utilities.Core.18.7.1.nupkgMicrosoft.Build.18.7.1.nupkgMicrosoft.Build.Framework.18.7.1.nupkgMicrosoft.Build.Runtime.18.7.1.nupkgMicrosoft.Build.Tasks.Core.18.7.1.nupkgMicrosoft.NET.StringTools.18.7.1.nupkgMicrosoft.Build.Templates.18.7.1.nupkgartifacts-shippinglink from build13982412and ask them to publish18.7.1to nuget.org. Sent 2026-06-10.5.2 Publish docs
documentation/wiki/ChangeWaves.mdgained a### 18.7section, but the public Change Waves Learn page was already synced with 18.7 (and 18.8) by the vendor on 2026-05-22 via visualstudio-docs-pr#15433 (public mirror #11350). Verified the page's#### 18.7entries matchmain. No new PR needed.5.3 Create GitHub release: DONE →
v18.7.1upstream. Verified:v18.6.3is present on upstream (andv18.5.4). (The earlier note claiming latest tag wasv18.4.0and thatv18.5.0/v18.6.0were never pushed is stale — the convention is to tag the shipped servicing version, e.g.v18.5.4,v18.6.3.)20260430.11:024f5b0379cf99b95bc8939cd92a57912528b55c("Bump version prefix from 18.7.0 to 18.7.1 (Bump version prefix from 18.7.0 to 18.7.1 #13664)").v18.6.3; not a draft, not prerelease).5.4 Update
BootstrapSdkVersionineng/Versions.propsif a fresh SDK was released. Check https://dotnet.microsoft.com/download/visual-studio-sdks — always verify the details for the targeted .NET version. 18.7 note:mainhas already advanced to VS 18.9 (BootstrapSdkVersion10.0.300, targeting the 10.0.4xx band); the bootstrap-SDK refresh onmainis decoupled from 18.7 post-GA and handled by the current release cadence.vs18.7stays pinned at10.0.108.5.4b Update
tools.dotnetinglobal.jsonto the latest released SDK in the targeted band. (Same note as 5.4 —main'sglobal.jsonis at10.0.300.)5.5 Verify the overall subscription map across every still-supported branch — each
vsXX.Ybranch has an Arcade subscription matching its targeted .NET band, and each supported branch's outbound subscriptions land in the right downstream (e.g. SDK band, VMR). You can find more info here.Findings (2026-06-10) — map is correct:
vs18.7←dotnet/arcade (.NET 10 Eng)exists, matching its band.vs18.7 → VS 18.7mapping present.VS 18.7andVS 18.8intentionally have no outbounddotnet/dotnetsubscription. MSBuild ships more often than the SDK, so only the latest VS minor and the band-representative one (≈1 in 3, aligned to an SDK feature band) are VMR-bound — currentlyVS 18.6 → release/10.0.3xxandVS 18.9 → release/10.0.4xx/main.VS 18.7/18.8flow forward via the merge chain instead. No change needed.5.6 Review this tracking issue for any process deviations. If the process changed, create a PR to update
documentation/release-checklist.mdwith the improvements. → PR dotnet/msbuild#14017 (read shipped version from VSrel/stable; correct the "alwaysx.0" guidance for OptProfx.1bumps; de-ping the template). \If 18.8 is a new major version
18.8 is not a new major version (still 18.x). This section can be ignored for this release.
src/Shared/BuildEnvironmentHelper.cssrc/Shared/Constants.cssrc/Framework/Telemetry/TelemetryConstants.cs