Design document: Installing daily/nightly builds with dotnetup#54061
Design document: Installing daily/nightly builds with dotnetup#54061dsplaisted wants to merge 16 commits intodotnet:release/dnupfrom
Conversation
Adds initial design document for installing pre-release (daily/nightly) builds via dotnetup, addressing SDK issue dotnet#51097. Key design decisions: - Uses 'daily' terminology matching dotnet-install scripts - CLI syntax: --quality daily flag alongside channel argument - Manifest tracks quality and feedKind fields - Daily builds do not auto-update by default - Security: host allowlist, TLS-only, weaker trust model acknowledged - 4 implementation phases: data model, specific version, channel+quality, listing Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Simplifies the design by expressing daily builds as channel names (daily/10.0) rather than a separate --quality flag. This means: - No new CLI flag needed - Manifest schema unchanged (channel name encodes daily nature) - GC/update logic distinguishes daily vs stable by channel prefix - Implementation reduced from 4 phases to 3 Also incorporates rubber-duck review feedback: - Restrict blob-feed fallback to prerelease versions only - Add security/trust model section with host allowlist - Add channel parsing sketch for UpdateChannel class Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Changes channel syntax from prefix (daily/10.0) to suffix (10.0/daily). The version scope comes first, then /daily qualifies it. This reads more naturally and mirrors how existing channels work: start with what you want, then narrow it. Examples: daily, 10.0/daily, 10.0.1xx/daily Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Corrects the version discovery mechanism based on reading the actual dotnet-install.sh source code. The aka.ms link redirects directly to the archive blob (not a version file), and the version is extracted from the redirect URL path. There is no fallback when quality is specified — aka.ms failure is terminal. The latest.version file is a separate legacy mechanism used only when no quality is specified. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Daily builds are the lowest quality level in the .NET build pipeline (daily -> signed -> validated -> preview -> ga). Code signing happens at the 'signed' level, not 'daily'. Updated the archive signatures section to reflect this and added open question about supporting other quality levels like 'signed' and 'validated'. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
InstallWorkflow shouldn't need to know whether a channel is daily or released. The ChannelVersionResolver and DotnetArchiveDownloader should handle the daily/release distinction internally based on the channel name, just as they already abstract away the release manifest details today. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The tool was renamed from dnup to dotnetup. Update all command examples and prose references to use the current name. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Specific version installs are simpler (the user provides the exact version, no discovery needed) so they make a better Phase 1. Daily channel resolution (aka.ms redirect) layers on top of the blob-feed download path established in Phase 1. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Query the NuGet feed for Microsoft.NET.Sdk package versions to enumerate available daily SDK builds. Each daily build publishes a transport package whose version matches the SDK version. Runtime components would use a different transport package (TBD). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
With the VMR, any VMR-produced package can serve as the version index
for runtime daily builds since all components are in sync. A candidate
like Microsoft.NETCore.App.Runtime.{rid} would work.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Feed URLs are calculated from the major version (dotnet{N}-transport),
not read from NuGet.config. dotnetup queries the NuGet V3 protocol
directly against the public Azure DevOps feeds.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use the release manifest as an anchor: find the latest released major version, probe major+1 transport feed for daily builds, fall back to the released major version's feed if major+1 doesn't exist yet. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The dash is simpler and aligns with prerelease version tag conventions. No ambiguity with versions since channels use major.minor (2 components) or feature bands with wildcards. Keep / as an alternative in open question 8 for team discussion. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Readers see the proposed UX (commands and channel table) right after the motivation, before diving into background and technical design details. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Adds a design document describing how dotnetup could support installing daily/nightly (pre-release) .NET SDK/runtime builds, including proposed UX, version discovery, trust model, and phased implementation plan.
Changes:
- Documents a channel-based UX for daily builds (e.g.,
daily,10.0-daily,10.0.1xx-daily) without adding a separate--qualityflag. - Proposes aka.ms redirect-based version discovery and blob-feed downloads with
.sha512verification. - Outlines phased implementation steps and key security/trust considerations (redirect allowlist, transparency, etc.).
| - Extend `UpdateChannel` with `IsDaily` / `BaseChannel` properties for `...-daily` suffix parsing | ||
| - Add `IsValidChannelFormat()` support for `...-daily` channels |
There was a problem hiding this comment.
Phase 2 calls out extending IsValidChannelFormat() for ...-daily channels, but the proposed UX also includes bare daily. Make sure the design explicitly includes how bare daily will pass channel validation (e.g., adding daily to the known keyword set) so the implementation checklist is complete.
| - Extend `UpdateChannel` with `IsDaily` / `BaseChannel` properties for `...-daily` suffix parsing | |
| - Add `IsValidChannelFormat()` support for `...-daily` channels | |
| - Extend `UpdateChannel` with `IsDaily` / `BaseChannel` properties for `...-daily` suffix parsing, | |
| and define how bare `daily` maps through the same model | |
| - Add `IsValidChannelFormat()` support for `...-daily` channels and bare `daily` (for example, | |
| by adding `daily` to the known channel keyword set) |
… channel validation
- Fix aka.ms URL to use {base}/{quality} split (10.0/daily) matching
the documented pattern
- Return 'daily' (not 'latest') as BaseChannel for bare daily channel
- Update manifest example to use actual InstallSpec schema
(component, versionOrChannel, installSource)
- Explicitly include bare 'daily' in IsValidChannelFormat() checklist
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- OQ1: Incorporated into main text — global.json prerelease versions naturally fall back to daily feed via Phase 1 behavior - OQ5: Incorporated into aka.ms redirect section — documented all component archive prefixes and runtime version differences - Removed resolved questions, renumbered remaining (now 1-7) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
baronfel
left a comment
There was a problem hiding this comment.
This looks great overall! I left a few questions, but the core question I have is if we want to rely on the aka.ms infrastructure directly. If we already have/need the ability to query the package versions, then the marker version files don't matter (and they may get out of date due to delayed build publishing!). In addition, if the pipelines are public, we should be able to acquire the appropriate installer payload from azdo artifacts.
| `daily → signed → validated → preview → ga`. Should dotnetup support `10.0-signed` or | ||
| `10.0-validated` channels? `signed` builds are code-signed but not fully validated — |
There was a problem hiding this comment.
Should dotnetup support
10.0-signedor10.0-validatedchannels?
No, we can skip these for this feature
|
|
||
| ## Open questions | ||
|
|
||
| 1. **Should there be a `--feed` override?** For internal scenarios, users might want to point at |
There was a problem hiding this comment.
I don't think we need to worry about external feeds for daily support. If a user wants to point to alternative feeds, they should be able to construct their own release manifest and use that, I'd expect.
@baronfel Interesting. I think it might make sense to stick with the aka.ms logic that the install scripts are using to get started. That seems easier and lower risk to get the basic functionality out. Getting payloads from azdo artifacts sounds like it would make it really easy to add the feature where you can install a build from a PR, which would be great. But I would still keep it simple for the initial implementation. |
|
Totally fair - let's get your plan in motion then! |
|
We can add the --skip-sign-check flag for daily builds if it contains warning text. |
Summary
Design document for adding daily/nightly build support to dotnetup (SDK issue #51097).
Key design decisions
--qualityflag —dotnetup sdk install 10.0-dailyuses the same mental model asdotnetup sdk install latest{version-scope}-dailysuffix (e.g.,10.0-daily,10.0.1xx-daily, or baredaily).sha512hash verificationChannelVersionResolverandIArchiveDownloaderabstractionsOpen questions for review
global.jsoninteraction with daily builds--feedoverride for internal scenariosdailyvsnightlyalias-(current) vs/signed,validated)Resolves #51097