feat(publish): multi-channel, package-ID-aware publishing + dogfood the lanes (#333)#339
Merged
Merged
Conversation
…, FALLOUT001)
IPublish gains [Experimental("FALLOUT001")] PublishTargets + a --publish-to selector;
Publish now routes one Pack output across multiple feeds via the pure, unit-tested
PublishPackageRouter (glob include/exclude by package name). Existing single-source
members stay as a back-compat default target.
Build.cs wires the two real channels: github-packages (every package incl Nuke.*,
keyed by the GitHub token) and nuget.org (Fallout.* only, never Nuke.*, keyed by
NUGET_API_KEY) — replacing the legacy single-feed push.
- src/Fallout.Components/PublishTarget.cs — PublishTarget record + PublishPackageRouter
- tests/Fallout.Components.Tests — 10 router tests (added to fallout.slnx)
- docs/experimental-apis.md — FALLOUT001 registered
Framework compiles clean (0 errors); router tests green. Workflow rewire to
`dotnet fallout Publish --publish-to …` follows once experimental is synced with main.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nes (#333) experimental.yml and preview.yml now publish via `dotnet fallout Publish --publish-to github-packages` instead of a hand-rolled `dotnet nuget push` loop. Publish depends on Test + Pack, so one invocation runs Restore → Compile → Test → Pack → Publish as NUKE stages; package routing (Fallout.* + Nuke.* → GitHub Packages) lives in Build.cs IPublish.PublishTargets. The GitHub token is passed via the GitHubToken env. Also restore IPublish.PackagePushSettings + PushSettingsBase (kept for back-compat) so the multi-channel reshape stays additive — the new PublishTargets/PublishTo surface is the only opt-in change, behind [Experimental("FALLOUT001")]. release.yml's publish jobs still use raw nuget push (they're coupled to the artifact handoff + nuget-org approval gate) — dogfooding those is folded into #336. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… skips it CI caught CS0509: the TransitionShimGenerator tried to derive a Nuke.Components shim from the sealed *record* PublishTarget. Sealed classes are skipped by design (SHIM001), but the sealed-record shape slipped past that guard. PublishTarget is a new type with no pre-rename consumers, so skipping its shim is correct; switching record→sealed class hits the documented skip path. We don't use record equality/`with`. Verified: Nuke.Components builds 0 errors (SHIM001 warning only). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…Components.Tests Adding tests/Fallout.Components.Tests to fallout.slnx makes the StronglyTypedSolution generator emit a Fallout_Components_Tests accessor; update the Verify snapshot to match (one added line — the new project's strongly-typed Solution property). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ChrisonSimtian
added a commit
that referenced
this pull request
Jun 9, 2026
…he lanes (#333) (#339) * feat(publish): multi-channel, package-ID-aware publishing surface (#333, FALLOUT001) IPublish gains [Experimental("FALLOUT001")] PublishTargets + a --publish-to selector; Publish now routes one Pack output across multiple feeds via the pure, unit-tested PublishPackageRouter (glob include/exclude by package name). Existing single-source members stay as a back-compat default target. Build.cs wires the two real channels: github-packages (every package incl Nuke.*, keyed by the GitHub token) and nuget.org (Fallout.* only, never Nuke.*, keyed by NUGET_API_KEY) — replacing the legacy single-feed push. - src/Fallout.Components/PublishTarget.cs — PublishTarget record + PublishPackageRouter - tests/Fallout.Components.Tests — 10 router tests (added to fallout.slnx) - docs/experimental-apis.md — FALLOUT001 registered Framework compiles clean (0 errors); router tests green. Workflow rewire to `dotnet fallout Publish --publish-to …` follows once experimental is synced with main. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * ci(publish): dogfood `dotnet fallout Publish` on the alpha/preview lanes (#333) experimental.yml and preview.yml now publish via `dotnet fallout Publish --publish-to github-packages` instead of a hand-rolled `dotnet nuget push` loop. Publish depends on Test + Pack, so one invocation runs Restore → Compile → Test → Pack → Publish as NUKE stages; package routing (Fallout.* + Nuke.* → GitHub Packages) lives in Build.cs IPublish.PublishTargets. The GitHub token is passed via the GitHubToken env. Also restore IPublish.PackagePushSettings + PushSettingsBase (kept for back-compat) so the multi-channel reshape stays additive — the new PublishTargets/PublishTo surface is the only opt-in change, behind [Experimental("FALLOUT001")]. release.yml's publish jobs still use raw nuget push (they're coupled to the artifact handoff + nuget-org approval gate) — dogfooding those is folded into #336. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(publish): make PublishTarget a sealed class so the shim generator skips it CI caught CS0509: the TransitionShimGenerator tried to derive a Nuke.Components shim from the sealed *record* PublishTarget. Sealed classes are skipped by design (SHIM001), but the sealed-record shape slipped past that guard. PublishTarget is a new type with no pre-rename consumers, so skipping its shim is correct; switching record→sealed class hits the documented skip path. We don't use record equality/`with`. Verified: Nuke.Components builds 0 errors (SHIM001 warning only). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(generators): accept solution-generator snapshot for new Fallout.Components.Tests Adding tests/Fallout.Components.Tests to fallout.slnx makes the StronglyTypedSolution generator emit a Fallout_Components_Tests accessor; update the Verify snapshot to match (one added line — the new project's strongly-typed Solution property). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ChrisonSimtian
added a commit
that referenced
this pull request
Jun 14, 2026
…he lanes (#333) (#339) * feat(publish): multi-channel, package-ID-aware publishing surface (#333, FALLOUT001) IPublish gains [Experimental("FALLOUT001")] PublishTargets + a --publish-to selector; Publish now routes one Pack output across multiple feeds via the pure, unit-tested PublishPackageRouter (glob include/exclude by package name). Existing single-source members stay as a back-compat default target. Build.cs wires the two real channels: github-packages (every package incl Nuke.*, keyed by the GitHub token) and nuget.org (Fallout.* only, never Nuke.*, keyed by NUGET_API_KEY) — replacing the legacy single-feed push. - src/Fallout.Components/PublishTarget.cs — PublishTarget record + PublishPackageRouter - tests/Fallout.Components.Tests — 10 router tests (added to fallout.slnx) - docs/experimental-apis.md — FALLOUT001 registered Framework compiles clean (0 errors); router tests green. Workflow rewire to `dotnet fallout Publish --publish-to …` follows once experimental is synced with main. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * ci(publish): dogfood `dotnet fallout Publish` on the alpha/preview lanes (#333) experimental.yml and preview.yml now publish via `dotnet fallout Publish --publish-to github-packages` instead of a hand-rolled `dotnet nuget push` loop. Publish depends on Test + Pack, so one invocation runs Restore → Compile → Test → Pack → Publish as NUKE stages; package routing (Fallout.* + Nuke.* → GitHub Packages) lives in Build.cs IPublish.PublishTargets. The GitHub token is passed via the GitHubToken env. Also restore IPublish.PackagePushSettings + PushSettingsBase (kept for back-compat) so the multi-channel reshape stays additive — the new PublishTargets/PublishTo surface is the only opt-in change, behind [Experimental("FALLOUT001")]. release.yml's publish jobs still use raw nuget push (they're coupled to the artifact handoff + nuget-org approval gate) — dogfooding those is folded into #336. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(publish): make PublishTarget a sealed class so the shim generator skips it CI caught CS0509: the TransitionShimGenerator tried to derive a Nuke.Components shim from the sealed *record* PublishTarget. Sealed classes are skipped by design (SHIM001), but the sealed-record shape slipped past that guard. PublishTarget is a new type with no pre-rename consumers, so skipping its shim is correct; switching record→sealed class hits the documented skip path. We don't use record equality/`with`. Verified: Nuke.Components builds 0 errors (SHIM001 warning only). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(generators): accept solution-generator snapshot for new Fallout.Components.Tests Adding tests/Fallout.Components.Tests to fallout.slnx makes the StronglyTypedSolution generator emit a Fallout_Components_Tests accessor; update the Verify snapshot to match (one added line — the new project's strongly-typed Solution property). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ChrisonSimtian
added a commit
that referenced
this pull request
Jun 14, 2026
…et.org at the same time (plus gating) (#342) Promotes #333 from `experimental` → `main` (the `-preview` trunk) for human review ahead of becoming an RC feature. Curated cherry-pick of the feature commits (#339 + #340) — deliberately not a branch merge, so `main`'s `version.json` stays `-preview` (experimental's `-alpha` identity is left behind). ## What's promoted - `PublishTarget` + pure `PublishPackageRouter` (10 unit tests, `Fallout.Components.Tests`) - `IPublish` `[Experimental("FALLOUT001")]` `PublishTargets` + `--publish-to` — fans one `Pack` across feeds - `Build.cs` channels: `github-packages` (all, incl. `Nuke.*`) + `nuget.org` (`Fallout.*` only) - `experimental.yml` / `preview.yml` now dogfood `dotnet fallout Publish` instead of hand-rolled `dotnet nuget push` ## Why it's safe to promote - **Non-breaking:** purely additive. The new surface is `[Experimental("FALLOUT001")]`-gated, and the legacy single-feed members are retained. - **Validated on `experimental`:** full Test+Pack green, and the post-merge `experimental` publish ran for real — `dotnet fallout Publish --publish-to github-packages` published `-alpha` packages successfully (the token-env fix #340 came out of that live run). ## Reviewer notes - The `[Experimental]` attribute stays until the surface is promoted to stable (attribute removed) once the CD model (#334) settles — this is the preview/RC staging step, not stabilization. - `release.yml` still uses raw `dotnet nuget push` (coupled to the artifact handoff + `nuget-org` approval gate) → folded into #336. Part of epic #332. Issue #333 stays open until this merges to `main`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements the framework half of epic #332's first step (#333), on the
experimentallane (it touches the shippedFallout.Componentspublic surface, gated behind[Experimental("FALLOUT001")]).What
PublishTarget+PublishPackageRouter(Fallout.Components) — a routable feed (name, source, key, include/exclude package-name globs, skip-duplicate) and pure, dependency-free glob routing. 10 unit tests in the newtests/Fallout.Components.Tests.IPublishgains[Experimental("FALLOUT001")]PublishTargets+--publish-to—Publishfans onePackoutput across the selected feeds via the router. Existing single-feed members (NuGetSource/NuGetApiKey/PushSettings/PackagePushSettings/PushSettingsBase) retained → the change is additive, not breaking.Build.cswires the two real channels:github-packages(every package incl.Nuke.*, GitHub-token keyed) andnuget.org(Fallout.*only, neverNuke.*,NUGET_API_KEYkeyed).experimental.yml/preview.ymlnowdotnet fallout Publish --publish-to github-packagesinstead of hand-rolleddotnet nuget push. One invocation = Test → Pack → Publish (NUKE stages); nothing publishes if tests fail.FALLOUT001registered indocs/experimental-apis.md.Verified
Fallout.Components+build/_buildcompile 0 errors; router tests 10/10; all workflow YAML valid; no generated-workflow drift.Scope / deferred
dotnet nuget push— they're coupled to the cross-job artifact handoff + thenuget-orgapproval gate, so dogfooding them is folded into [GitHubActions] generator: emit CD pipelines (or a thin shell delegating to dotnet fallout Deploy) #336 (generator emits CD pipelines).experimentalafter forward-portingmain(chore: forward-port main → experimental (CI hygiene #322/#324/#329) #338). Worked in an isolated worktree to stay clear of the parallelspike/ci-ports-ghawork; the two land separately and reconcile in a later session.Substantially closes #333 (release.yml lane → #336).
🤖 Generated with Claude Code