Skip to content

ci(release): nuget.org publish is opt-in; GitHub Packages is the v11 default channel#299

Merged
ChrisonSimtian merged 1 commit into
mainfrom
ci/nuget-org-publish-opt-in
May 29, 2026
Merged

ci(release): nuget.org publish is opt-in; GitHub Packages is the v11 default channel#299
ChrisonSimtian merged 1 commit into
mainfrom
ci/nuget-org-publish-opt-in

Conversation

@ChrisonSimtian

Copy link
Copy Markdown
Collaborator

Implements the v11-off-nuget direction. Tag pushes on release/v11 no longer auto-publish to nuget.org — they publish to GitHub Packages + GitHub Releases only. nuget.org is reserved for v10.x maintenance lines and a future stabilised v11.

This modifies the routing originally documented in #288 (milestone #13's release.yml refactor). The release-branch model, multi-channel fan-out, and CD gating are all unchanged — only the routing policy.

Routing change

Path Old behaviour New behaviour
Tag push on release/v11 Publishes Fallout.* → nuget.org (with approval) Skips nuget.org. Publishes everything to GH Packages + GH Release
Tag push, Fallout.* → nuget.org Default on (approval-gated) Opt-in only via workflow_dispatch + publish-to-nugetorg=true
Tag push, all *.nupkg → GitHub Packages Just Nuke.* shims All packages (Fallout.* + Nuke.*)
Tag push, nupkgs → GitHub Release Yes Yes (unchanged)

Three layers of safety on the nuget.org path

  1. Tag protection ruleset — only repo admins can create v* tags.
  2. workflow_dispatch opt-in flagpublish-to-nugetorg=true required.
  3. nuget-org env approval gate — required-reviewer prompt before the actual push.

Two release runbooks now

Documented in docs/branching-and-release.md:

  • Routine v11 release: gh release create v11.0.X --target release/v11 --generate-notes → tag fires → GH Packages + GH Release. nuget.org untouched.
  • Stabilised release: gh workflow run release.yml -f tag=v11.0.X -f publish-to-nugetorg=true → re-runs against the existing tag, prompts for env approval, publishes to nuget.org.

You can test the wiring without burning a release: set the flag, get the approval prompt, cancel without approving.

Changes

  • .github/workflows/release.yml — new publish-to-nugetorg input + condition on publish-nuget-org job; publish-github-packages glob extended to all *.nupkg; comments rewritten.
  • docs/agents/release-and-versioning.md — Release pipeline section rewritten with the new routing.
  • docs/branching-and-release.md — Channel taxonomy + two release runbooks (routine + stabilised).
  • docs/adr/0002-v11-off-nuget-by-default.md — new ADR for the decision + three rejected alternatives.
  • CHANGELOG.md — entry under [Unreleased] — 11.0 → Process explicitly noting this modifies ci: tag-triggered + multi-channel fan-out for release.yml #288's routing.

Out of scope

  • Unlisting existing 11.0.x on nuget.org — separate parallel work (see your unlist-10.3 worktree pattern).
  • When/how v11 transitions to "stabilised by default" — future ADR when that moment arrives.

Test plan

  • YAML parses
  • Markdown renders, internal links resolve
  • CI green
  • Post-merge: smoke-test via workflow_dispatch with publish-to-nugetorg=false (default) — confirm publish-nuget-org skips
  • (Future) Smoke-test the stabilised path with the flag set, cancel at the env gate without approving

🤖 Generated with Claude Code

…default channel

Implements the v11-off-nuget direction. Tag pushes on release/v11 no
longer auto-publish to nuget.org — they publish to GitHub Packages +
GitHub Releases only. To publish Fallout.* to nuget.org you must
invoke workflow_dispatch with `publish-to-nugetorg=true`, an explicit
"this release is stabilised enough for nuget.org" switch.

This *modifies* the routing originally documented in milestone #13's
release.yml refactor (#288). The release-branch model, multi-channel
fan-out, and CD gating are all unchanged — only the routing policy
shifts.

## Workflow changes (`.github/workflows/release.yml`)

- New `workflow_dispatch` input `publish-to-nugetorg` (boolean, default false).
- `publish-nuget-org` job gains `if:` condition requiring both
  `github.event_name == 'workflow_dispatch'` and
  `inputs.publish-to-nugetorg == true`. Tag pushes skip this job.
- `publish-github-packages` job changes its glob from `Nuke.*.nupkg`
  to `*.nupkg` — now publishes both Fallout.* and Nuke.* to GH Packages.
  GH Packages is the v11 release channel; Nuke.* shim routing per #47
  is preserved (still goes here permanently).
- Header comment + per-job comments rewritten to describe the new
  routing policy explicitly.

Three layers of safety on the nuget.org path now:
  1. Tag protection ruleset (only repo admins can create v* tags).
  2. workflow_dispatch flag opt-in.
  3. nuget-org env approval gate.

## Doc updates

- `docs/agents/release-and-versioning.md` — Release pipeline section
  rewritten. Table updated. New "Why nuget.org is opt-in for v11"
  subsection. workflow_dispatch inputs documented.
- `docs/branching-and-release.md` — Channel taxonomy table extended
  with "Current v11 use" column. "Cutting a release" split into two
  sub-runbooks: routine (GitHub Packages only) and stabilised (with
  the opt-in flag).
- `docs/adr/0002-v11-off-nuget-by-default.md` — new ADR capturing the
  decision and three rejected alternatives.

## CHANGELOG

Entry under [Unreleased] — 11.0 → Process explicitly noting this
*modifies* the routing originally documented in the milestone #13
umbrella entry (rather than backdating that entry; preserves history
of how the decision evolved).

## Out of scope

- Unlisting existing 11.0.x on nuget.org — separate work (see worktree
  `unlist-10.3` for the parallel 10.3 unlisting).
- When/how v11 transitions to "stabilised" and opts into nuget.org by
  default — a future ADR / decision when that moment arrives.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@ChrisonSimtian ChrisonSimtian merged commit 8108295 into main May 29, 2026
2 checks passed
@ChrisonSimtian ChrisonSimtian deleted the ci/nuget-org-publish-opt-in branch May 29, 2026 08:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant