Quick reminder card for cutting NAudio releases. Full design rationale and history is in Docs/Architecture/ReleaseStrategy.md.
Prerequisites: gh CLI authenticated, working directory inside the repo, on main for the local-clone steps.
gh workflow run release.ymlProduces <VersionPrefix>-preview.<run_number> — e.g. 3.0.0-preview.5. Watch in the Actions tab. On success, all 8 packages (.nupkg + .snupkg) appear on NuGet within a few minutes.
Override the suffix via the milestone input. Use for alpha / beta / rc progression:
gh workflow run release.yml -f milestone=rc.1Suffix ordering on NuGet: alpha.N < beta.N < preview.N < rc.N < (final). Always use the dotted form (rc.1, not rc1) so the trailing integer compares numerically — rc.10 > rc.9 only works with the dot.
- Bump
<VersionPrefix>in Directory.Build.props to the target version (e.g.3.0.0). - In RELEASE_NOTES.md: rename
### Unreleased→### 3.0.0 (DD MMM YYYY), curate the bullets, add PR numbers where useful. - Add a fresh empty
### Unreleasedsection above the renamed one so post-release contributors have a place to land bullets.
Merge via the usual protected-branch flow.
From local main synced to the merge commit:
git fetch origin
git checkout main
git pull --ff-only
git tag v3.0.0
git push origin v3.0.0The tag push triggers release.yml, which:
- Validates the tag matches
<VersionPrefix>inDirectory.Build.props. - Validates
RELEASE_NOTES.mdhas a matching### 3.0.0section. - Packs all 8 NAudio packages (+ matching
.snupkgsymbol packages). - Pushes everything to NuGet via trusted publishing.
- Creates a GitHub Release titled
NAudio 3.0.0with body extracted from theRELEASE_NOTES.mdsection.
No further action required for the publish itself. Both validations are fail-fast — if VersionPrefix or release notes don't match the tag, the workflow errors before packing.
Open a small follow-up PR bumping <VersionPrefix> in Directory.Build.props to the next development version (e.g. 3.0.1 or 3.1.0). Without this, the next preview dispatch produces a version lower than the just-shipped final (since 3.0.0-preview.N < 3.0.0).
GitHub Release + NuGet are the canonical channels. Optionally:
- Blog post on markheath.net
- Social media
- Pin a GitHub Discussion for major-version announcements
gh workflow runreturns "workflow not found": the workflow file must exist on the default branch. After Phase 8 the default ismain; should always work.- NuGet push fails with auth error: the trusted-publisher policy on NuGet.org has a 7-day temporarily-active window. After a successful publish it becomes permanent, but if no publish happens for 7 days it goes inactive. Re-activate at NuGet.org → username → Trusted Publishing.
Tag v3.0.0 does not match VersionPrefix 3.0.0-alpha(or similar): you're tagging a commit whoseDirectory.Build.propsdoesn't have<VersionPrefix>3.0.0</VersionPrefix>. Either retag after the pre-flight PR merges, or push a fixup commit and tag that.RELEASE_NOTES.md has no '### 3.0.0' section: the pre-flight PR didn't rename### Unreleased. Push a fix tomainand delete + re-create the tag.
- Full release strategy and decision rationale: Docs/Architecture/ReleaseStrategy.md
- Release workflow file: .github/workflows/release.yml
- Build workflow file: .github/workflows/build.yml