MSBuild Release Checklist 18.8
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 (e.g. 18.5) |
18.7 |
{{THIS_RELEASE_VERSION}} |
Version being released now (e.g. 18.6) |
18.8 |
{{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.8.0 |
{{NEXT_VERSION}} |
Version that main will be bumped to (e.g. 18.7) |
18.9 |
{{BRANCH_SNAP_DATE}} |
Date MSBuild branches vs* from main. Insertion targets VS main. |
2026-05-27 |
{{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-29 |
{{STABLE_SNAP_DATE}} |
Date VS snaps rel/insiders → rel/stable. From VS-Dates wiki |
2026-06-23 |
{{VS_SHIP_DATE}} |
Date VS ships publicly (GA). Post-GA tasks (nuget.org, docs) happen after this. |
2026-07-14 |
Derived values (do not edit — computed from inputs):
- Release branch:
vs18.8
- DARC channel:
VS 18.8
- Next DARC channel:
VS 18.9
- 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-05-27 reached.
Steps are sequential — complete in order.
Phase 2: Bump Main & Update Pipelines
Trigger: vs18.8 branch exists (Phase 1.1 done). Previous release is in insiders stage.
Create one PR in main containing all of the following changes:
Phase 3: DARC Subscription Updates
Trigger: Phase 2 branding PR merged (main now has 18.9 version).
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 release/msbuild-18.8-main-bump and --no-pr on all but the last command:
Verifications (parallel — read-only, no ordering dependency):
Phase 4: Final Branding & VS Insertion
Trigger: 7 calendar days before 2026-05-29.
Precondition: Phases 1–3 complete. Preview builds from vs18.8 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):
After stable snap (only if a backport to stable is needed):
Phase 5: Post-GA
Trigger: 2026-07-14 has passed and VS release has shipped.
Steps are mostly parallel unless noted.
If 18.9 is a new major version
18.9 is not a new major version (still 18.x). This section can be ignored for this release.
MSBuild Release Checklist 18.8
Inputs
Fill in these values before starting. Version increments are irregular — they must be specified explicitly.
{{PREVIOUS_RELEASE_VERSION}}18.5)18.7{{THIS_RELEASE_VERSION}}18.6)18.8{{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.8.0{{NEXT_VERSION}}18.7)18.9{{BRANCH_SNAP_DATE}}vs*frommain. Insertion targets VSmain.{{INSIDERS_SNAP_DATE}}main→rel/insiders. Final-branded MSBuild must be in VSmainbefore this date. From VS-Dates wiki{{STABLE_SNAP_DATE}}rel/insiders→rel/stable. From VS-Dates wiki{{VS_SHIP_DATE}}Derived values (do not edit — computed from inputs):
vs18.8VS 18.8VS 18.9main(VS snaps main → insiders → stable on its own schedule)Phase 0: Instantiate Release
eng/Versions.propsonmainhasVersionPrefix=18.8.0— if not, the inputs are wrongvs18.8does not already exist — if it does, this release was already startedVS 18.8exists:darc get-channel --name "VS 18.8"If missing, it should have been created during the previous release (Phase 1.2b "create next channel" step). Create it now:
darc add-channel --name "VS 18.8"{{PLACEHOLDERS}}replacedPhase 1: Branch & Prepare
Steps are sequential — complete in order.
vs18.8from HEAD ofmain:git push upstream HEAD:refs/heads/vs18.8git push upstream <correct_sha>:refs/heads/vs18.8Use
--configuration-branch release/msbuild-18.8on every command and--no-pron all but the last:First check:
darc get-default-channels --channel "VS 18.8" --branch vs18.8 --source-repo https://github.com/dotnet/msbuildIf
No matching channels were found.:darc add-default-channel --channel "VS 18.8" --branch vs18.8 --repo https://github.com/dotnet/msbuild --configuration-branch release/msbuild-18.8 --no-prdarc add-channel --name "VS 18.9" --configuration-branch release/msbuild-18.8 --no-pr(If channel already exists, this is a no-op.)
--no-prto create the PR):darc add-default-channel --channel "VS 18.9" --branch vs18.9 --repo https://github.com/dotnet/msbuild --configuration-branch release/msbuild-18.8.config/git-merge-flow-config.jsonc:Insert
vs18.8as the last entry beforemainin the merge chain. Add a comment noting the VS/SDK version context.Phase 2: Bump Main & Update Pipelines
Create one PR in
maincontaining all of the following changes:eng/Versions.props: UpdateVersionPrefixto18.9.0eng/Versions.props: UpdatePackageValidationBaselineVersionto the last released version (the18.7GA version published to nuget.org).CompatibilitySuppressions.xmlfiles. Run:dotnet pack MSBuild.Dev.slnf /p:ApiCompatGenerateSuppressionFile=trueSee API compat documentation for details.
azure-pipelines/vs-insertion.yml: setAutoInsertTargetBranchforvs18.8→ VSmain.azure-pipelines/vs-insertion-experimental.yml:Add
rel/insidersand/orrel/stabletoTargetBranchparameter values if not already present.Phase 3: 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.8"Note the subscription ID for the SDK
mainbranch entry.darc get-default-channels --source-repo https://github.com/dotnet/msbuild --branch vs18.8Note whether the association exists (needed for step 3.3d).
Then, batch all write operations into one PR on the maestro-configuration repo.
Use
--configuration-branch release/msbuild-18.8-main-bumpand--no-pron all but the last command:darc delete-default-channel --repo https://github.com/dotnet/msbuild --branch main --channel "VS 18.8" --configuration-branch release/msbuild-18.8-main-bump --no-prdarc add-default-channel --channel "VS 18.9" --branch main --repo https://github.com/dotnet/msbuild --configuration-branch release/msbuild-18.8-main-bump --no-prdarc update-subscription --id <subscription_id_from_3.1> --channel "VS 18.9" --configuration-branch release/msbuild-18.8-main-bump --no-prdarc add-default-channel --channel "VS 18.8" --branch vs18.8 --repo https://github.com/dotnet/msbuild --configuration-branch release/msbuild-18.8-main-bump --no-pr--no-pr.--no-prto open the PR on the configuration branch.Verifications (parallel — read-only, no ordering dependency):
darc get-subscriptions --exact --target-repo https://github.com/dotnet/msbuild --source-repo https://github.com/dotnet/arcadedarc get-subscriptions --exact --target-repo https://github.com/dotnet/msbuild --source-repo https://github.com/nuget/nuget.clientdarc get-subscriptions --exact --target-repo https://github.com/dotnet/msbuild --source-repo https://github.com/dotnet/roslynEnabled: Falsein output). We do not want to automatically bump them — version updates are driven by SDK or VS.darc add-subscription/darc update-subscription(run with--helpfor params)Phase 4: Final Branding & VS Insertion
Steps are sequential.
vs18.8branch:Move contents of
PublicAPI.Unshipped.txt→PublicAPI.Shipped.txtfor all projects with API changes. See release.md for details.scripts/Stabilize-Release.ps1onvs18.8branch:Use
-DryRunfirst to preview. The script adds<DotNetFinalVersionKind>release</DotNetFinalVersionKind>on the same line asVersionPrefix(creates merge conflict for forward-flow) and changesPreReleaseVersionLabelfrompreviewtoservicing.If the script says "already stabilized" — skip (idempotent).
vs18.8: Stable branding for 18.8 release #13883vs18.8:vs18.8withOptional OptProfDrop Overrideset to main's latest OptProf drop path. (Find the path in main CI logs: Windows_NT → Build → search forOptimizationData.) Alternatively, setSkipApplyOptimizationDatatotruein Advanced options.vs18.8. If not triggered, run manually ('Run pipeline' in upper right).vs18.8with no overrides — OptProf should succeed now.vs18.8into VSmain(auto-generated at https://devdiv.visualstudio.com/DevDiv/_git/VS/pullrequests). The final-branded bits must be in VSmainbefore29.5so they are included when VS snaps torel/insiders: https://dev.azure.com/devdiv/DevDiv/_git/VS/pullrequest/742873\The insertion PR contains the inserted package versions — useful for the nuget.org publishing step.
After insiders snap (only if a backport to insiders is needed):
azure-pipelines/vs-insertion.yml: retargetAutoInsertTargetBranchforvs18.8from VSmain→rel/insiders. This enables direct insertion of hotfix commits into the insiders branch.After stable snap (only if a backport to stable is needed):
azure-pipelines/vs-insertion.yml: retargetAutoInsertTargetBranchforvs18.8→rel/stable. This enables direct insertion of hotfix commits into the stable branch.Phase 5: Post-GA
Steps are mostly parallel unless noted.
5.1 Push packages to nuget.org. Contact dnceng — search "Publish MSBuild 18.8 to NuGet.org" email subject for template.
THIS_RELEASE_EXACT_VERSION=VersionPrefixfromeng/Versions.propson the release branch (also visible in the VS insertion PR). Packages to publish taken from the official build https://devdiv.visualstudio.com/DevDiv/_build?definitionId=9434 for the 18.8 branch; search in artifacts under the Shipping folder for:5.2 Publish docs: submit reference request at https://aka.ms/publishondocs
Click Request – Reference Publishing. Use existing ticket as a reference.
5.3 Create GitHub release:
Create release at https://github.com/dotnet/msbuild/releases/new — use
Generate Release Notesto prepopulate.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.5.5 Extend OptProf data expiration for
vs18.8branch if the release is LTSC:OptimizationData/DotNet-msbuild-Trusted/vs18.8/...(in MSBuild CI logs: Build task, or OptProf pipeline: "Publish OptimizationInputs drop" task)5.6 Verify
mainsubscriptions point toVS 18.9channel (should have been done in Phase 3; confirm):darc get-subscriptions --exact --target-repo https://github.com/dotnet/msbuild --target-branch main5.7 Review this tracking issue for any process deviations. If the process changed, create a PR to update
documentation/release-checklist.mdwith the improvements.If 18.9 is a new major version
18.9 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