Pin the SDK feature band so release builds can't roll onto an untested one - #28
Conversation
…ntested one
The v1.5 release build failed with MAUIX2000 ("Cannot resolve type
clr-namespace:SharpClient.App.Components:Routes") 13 minutes after the same
commit went green in CI. Nothing in the tree changed: global.json used
rollForward: latestFeature, the 10.0.400 band was published in between, and
setup-dotnet rolled onto it. That band had no workload set yet, so
'dotnet workload restore' fell back to its baseline maui manifest (10.0.0),
whose XAML source generator cannot resolve the Razor-generated Routes type —
CI had built on 10.0.302 / maui 10.0.20.
Pin to latestPatch so CI, the release pipeline, and dev machines all build on
10.0.3xx, and bump the band deliberately with a green Android head build.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015MPRzndB5egy4F2A3q5852
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (3)
WalkthroughThe release configuration now uses latest-patch SDK roll-forward behavior. Workflow comments and release documentation describe feature-band pinning. The store checklist advances to v1.6 and records completed v1.5 release preparation. ChangesRelease toolchain and checklist
Estimated code review effort: 2 (Simple) | ~10 minutes Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
Comment |
There was a problem hiding this comment.
Pull request overview
This PR makes Android release builds reproducible by preventing the .NET SDK from rolling onto a newer, unvetted feature band at build time (the root cause of the v1.5 release breaking minutes after CI).
Changes:
- Pin SDK roll-forward behavior in
global.jsontolatestPatchto stay within the 10.0.3xx feature band. - Document the rationale and the “how to move bands safely” process in the store release checklist.
- Add an in-workflow note in
release-apk.ymlexplaining why the toolchain is pinned and where to find the checklist guidance.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| global.json | Switch rollForward to latestPatch to prevent feature-band jumps. |
| docs/store/release-checklist.md | Add a “toolchain pinning” section and refresh version/tag guidance. |
| .github/workflows/release-apk.yml | Document why the workflow relies on the pinned SDK feature band. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
What broke
The
v1.5release build failed with:…on the exact commit whose CI run (
Android head build, samedotnet build -c Release -f net10.0-android) had gone green 13 minutes earlier. No source change explains it.Root cause
global.jsonusedrollForward: latestFeature, sosetup-dotnettakes whatever the newest 10.0.x feature band is at that moment:The 10.0.400 band had no published workload set, so
dotnet workload restorefell back to the SDK's baseline maui manifest — 10.0.0, older than what the 10.0.3xx band ships. That version's XAML source generator (we opt intoMauiXamlInflator=SourceGen) can't resolveRoutes, the Razor-generated root component referenced fromMainPage.xaml.So a release build silently changed toolchains between CI and packaging.
Fix
rollForward: latestPatch— accept 10.0.3xx patches, nothing higher. CI, the release pipeline, and dev machines now build on the same band. Moving bands becomes a deliberateversionbump gated on a green Android head build, documented indocs/store/release-checklist.mdand at thesetup-dotnetstep.If we later need 10.0.4xx before that band's maui manifest catches up, the code-level escape hatch is registering the Blazor root component in
MainPage.xaml.csinstead of XAML, which removes the source-generator dependency entirely. Not needed at 10.0.20+.Verification
dotnet publish -c Release -f net10.0-androidlocally, bothapkandaab, clean obj/bin: succeeds, 0 warnings (TreatWarningsAsErrorson).release-apk.ymldispatched on this branch: run 31532318170.Also refreshed two stale spots in the checklist (keystore/tags are done; next tag is
v1.6).🤖 Generated with Claude Code
https://claude.ai/code/session_015MPRzndB5egy4F2A3q5852
Summary by CodeRabbit
Documentation
Maintenance