Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 108 additions & 0 deletions .github/release-drafter.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# Release Drafter Configuration
# Documentation: https://github.com/release-drafter/release-drafter

name-template: 'Version $RESOLVED_VERSION'
tag-template: 'v$RESOLVED_VERSION'

# Categories for organizing release notes
categories:
- title: '🚀 Features'
labels:
- 'feature'
- 'enhancement'
- title: '🐛 Bug Fixes'
labels:
- 'bug'
- 'fix'
- title: '🔧 Maintenance'
labels:
- 'maintenance'
- 'chore'
- 'refactor'
- 'dependencies'
- title: '📚 Documentation'
labels:
- 'documentation'
- 'docs'
- title: '⚡ Performance'
labels:
- 'performance'
- title: '🔒 Security'
labels:
- 'security'

# Exclude certain labels from release notes
exclude-labels:
- 'skip-changelog'
- 'wip'

# Change template (how each PR is listed)
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
change-title-escapes: '\<*_&' # Escape special markdown characters

# Template for the release body
template: |
## What's Changed

$CHANGES

## 📦 NuGet Packages

The following packages are included in this release:

- `MyCSharp.HttpClientHints`
- `MyCSharp.HttpClientHints.AspNetCore`

### Installation

```bash
dotnet add package MyCSharp.HttpClientHints
dotnet add package MyCSharp.HttpClientHints.AspNetCore
```

## Contributors

$CONTRIBUTORS

---

**Full Changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION

# Automatically label PRs based on modified files
autolabeler:
- label: 'documentation'
files:
- '*.md'
- 'docs/**/*'
- label: 'bug'
branch:
- '/fix\/.+/'
title:
- '/fix/i'
- label: 'feature'
branch:
- '/feature\/.+/'
title:
- '/feature/i'
- label: 'dependencies'
files:
- '**/packages.lock.json'
- '**/*.csproj'
- 'Directory.Packages.props'
- 'Directory.Build.props'
- label: 'github-actions'
files:
- '.github/workflows/**/*'
- label: 'tests'
files:
- 'tests/**/*'
- '**/*Tests.cs'
- '**/*Test.cs'
- label: 'performance'
files:
- 'perf/**/*'
- '**/*Benchmark*.cs'

# Version resolver (uses version from workflow input)
version-resolver:
default: patch
90 changes: 90 additions & 0 deletions .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
name: Build and Test (Reusable)

on:
workflow_call:
inputs:
dotnet-version:
description: '.NET version to use (can be multi-line for multiple versions)'
required: false
type: string
default: |
8.0.x
9.0.x
10.0.x
11.0.x
configuration:
description: 'Build configuration'
required: false
type: string
default: 'Release'
upload-test-results:
description: 'Whether to upload test results as artifacts'
required: false
type: boolean
default: false
create-pack:
description: 'Whether to pack NuGet packages'
required: false
type: boolean
default: false
outputs:
version:
description: 'The calculated version from NBGV'
value: ${{ jobs.build.outputs.version }}

jobs:
build:
name: Build and Test
runs-on: ubuntu-latest
outputs:
version: ${{ steps.nbgv.outputs.SemVer2 }}

steps:
- name: Checkout code
uses: actions/checkout@v6
with:
fetch-depth: 0 # Required for GitVersion

- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: ${{ inputs.dotnet-version }}
global-json-file: ./global.json

- name: Calculate Version with NBGV
uses: dotnet/nbgv@master
id: nbgv
with:
setAllVars: true

- name: Version Info
run: |
echo "Calculated version: ${{ steps.nbgv.outputs.SemVer2 }}"

- name: Restore dependencies
run: dotnet restore

- name: Build
run: dotnet build --configuration ${{ inputs.configuration }} --no-restore /p:Version=${{ steps.nbgv.outputs.SemVer2 }}

- name: Test
run: dotnet test --configuration ${{ inputs.configuration }} --no-build --verbosity normal --logger "trx;LogFileName=test-results.trx"

- name: Upload test results
if: always() && inputs.upload-test-results
uses: actions/upload-artifact@v6
with:
name: test-results-${{ inputs.dotnet-version }}
path: '**/TestResults/**/*.trx'

- name: Pack NuGet packages
if: inputs.create-pack
run: dotnet pack --configuration ${{ inputs.configuration }} --no-build --output ./artifacts /p:PackageVersion=${{ steps.nbgv.outputs.SemVer2 }}

- name: Upload NuGet packages
if: inputs.create-pack
uses: actions/upload-artifact@v6
with:
name: nuget-packages
path: ./artifacts/*.nupkg
retention-days: 30
24 changes: 0 additions & 24 deletions .github/workflows/ci.yml

This file was deleted.

104 changes: 104 additions & 0 deletions .github/workflows/main-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
name: Main Build

on:
push:
branches:
- main

permissions:
contents: write
packages: write

jobs:
build-and-test:
name: Build, Test and Pack
uses: ./.github/workflows/build-and-test.yml
with:
create-pack: true

create-draft-release:
name: Create Draft Release
needs: build-and-test
runs-on: ubuntu-latest
permissions:
contents: write

steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Download NuGet packages
uses: actions/download-artifact@v4
with:
name: nuget-packages
path: ./artifacts

- name: Check if tag exists
id: check-tag
run: |
TAG="v${{ needs.build-and-test.outputs.version }}"
if git rev-parse "$TAG" >/dev/null 2>&1; then
echo "exists=true" >> $GITHUB_OUTPUT
echo "⚠️ Tag $TAG already exists"
else
echo "exists=false" >> $GITHUB_OUTPUT
echo "✅ Tag $TAG does not exist yet"
fi

- name: Delete existing draft releases
if: steps.check-tag.outputs.exists == 'false'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
echo "Checking for existing draft releases..."
gh release list --json isDraft,tagName --jq '.[] | select(.isDraft) | .tagName' | while read -r tag_name; do
echo "Deleting existing draft release: $tag_name"
gh release delete "$tag_name" --yes --cleanup-tag || echo "Failed to delete release $tag_name"
done

- name: Create Draft Release
if: steps.check-tag.outputs.exists == 'false'
uses: release-drafter/release-drafter@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
config-name: release-drafter.yml
version: v${{ needs.build-and-test.outputs.version }}
tag: v${{ needs.build-and-test.outputs.version }}
name: Version ${{ needs.build-and-test.outputs.version }}
publish: false
prerelease: false

- name: Upload packages to draft release
if: steps.check-tag.outputs.exists == 'false'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
TAG="v${{ needs.build-and-test.outputs.version }}"
# Wait a moment for the release to be created
sleep 2

# Upload new artifacts to the draft release
echo "📦 Uploading new NuGet packages..."
for file in ./artifacts/*.nupkg; do
gh release upload "$TAG" "$file" --clobber
done
echo "✅ Uploaded NuGet packages to draft release"

- name: Summary
if: steps.check-tag.outputs.exists == 'false'
run: |
echo "✅ Draft release created/updated" >> $GITHUB_STEP_SUMMARY
echo "Version: v${{ needs.build-and-test.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Next steps:" >> $GITHUB_STEP_SUMMARY
echo "1. Go to [Releases](../../releases)" >> $GITHUB_STEP_SUMMARY
echo "2. Review the draft release" >> $GITHUB_STEP_SUMMARY
echo "3. Edit release notes if needed" >> $GITHUB_STEP_SUMMARY
echo "4. Publish release to trigger production deployment" >> $GITHUB_STEP_SUMMARY

- name: Release already exists
if: steps.check-tag.outputs.exists == 'true'
run: |
echo "ℹ️ Release v${{ needs.build-and-test.outputs.version }} already exists" >> $GITHUB_STEP_SUMMARY
echo "No action taken" >> $GITHUB_STEP_SUMMARY
39 changes: 39 additions & 0 deletions .github/workflows/pr-validation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: PR Validation

on:
pull_request:
branches:
- main

permissions:
contents: read
pull-requests: read

jobs:
validate-dotnet-8:
name: Test on .NET 8.0
uses: ./.github/workflows/build-and-test.yml
with:
dotnet-version: '8.0.x'
upload-test-results: true

validate-dotnet-9:
name: Test on .NET 9.0
uses: ./.github/workflows/build-and-test.yml
with:
dotnet-version: '9.0.x'
upload-test-results: true

validate-dotnet-10:
name: Test on .NET 10.0
uses: ./.github/workflows/build-and-test.yml
with:
dotnet-version: '10.0.x'
upload-test-results: true

validate-dotnet-11:
name: Test on .NET 11.0
uses: ./.github/workflows/build-and-test.yml
with:
dotnet-version: '11.0.x'
upload-test-results: true
Loading