SKILL: .NET NuGet CI/CD Pipeline
Reusable pattern for .NET projects that produce NuGet packages.
CI Workflow Pattern (build.yml)
Triggers: push to main + pull_request to main.
Key steps (in order):
- •
dotnet restore <solution> - •
dotnet build <solution> -c Release --no-restore - •
dotnet test --no-build -c Release --verbosity normal - •
dotnet pack -c Release --no-build -o nupkgs - •Upload
nupkgs/*.nupkgas artifact
Best practices:
- •Use concurrency groups (
build-${{ github.ref }}+cancel-in-progress: true) to kill stale runs. - •Matrix on
ubuntu-latest+windows-latestfor cross-platform verification. - •Only upload artifacts from one OS leg to avoid name collisions.
- •Always pass
--no-restoreto build and--no-buildto test/pack for speed.
Release Workflow Pattern (release.yml)
Trigger: Push of a v* tag.
Key steps:
- •Full build + pack (cannot reuse CI artifacts across workflows).
- •
dotnet nuget push "nupkgs/*.nupkg" --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate - •Create GitHub Release with
softprops/action-gh-release@v2attaching nupkg files.
Requirements:
- •
NUGET_API_KEYrepo secret. - •
permissions: contents: writefor release creation. - •
--skip-duplicateprevents failures on re-runs.
Release Flow
code
developer pushes to main → build.yml runs CI developer tags v0.1.0 → release.yml builds, packs, publishes to NuGet, creates GitHub Release
Anti-patterns to Avoid
- •Don't trigger NuGet publish on every push to main (accidental publishes).
- •Don't use
dotnet packwithout--no-buildafter a build step (double compilation). - •Don't upload artifacts from every matrix leg (duplicate artifact names fail).