44[ ![ .NET CD] ( https://github.com/nanotaboada/Dotnet.Samples.AspNetCore.WebApi/actions/workflows/dotnet-cd.yml/badge.svg )] ( https://github.com/nanotaboada/Dotnet.Samples.AspNetCore.WebApi/actions/workflows/dotnet-cd.yml )
55[ ![ Quality Gate Status] ( https://sonarcloud.io/api/project_badges/measure?project=nanotaboada_Dotnet.Samples.AspNetCore.WebApi&metric=alert_status )] ( https://sonarcloud.io/summary/new_code?id=nanotaboada_Dotnet.Samples.AspNetCore.WebApi )
66[ ![ Build Status] ( https://dev.azure.com/nanotaboada/Dotnet.Samples.AspNetCore.WebApi/_apis/build/status%2FDotnet.Samples.AspNetCore.WebApi?branchName=master )] ( https://dev.azure.com/nanotaboada/Dotnet.Samples.AspNetCore.WebApi/_build/latest?definitionId=14&branchName=master )
7- [ ![ Codacy Badge] ( https://app.codacy.com/project/badge/Grade/ac7b7e22f1cd4d9d9233b36982b0d6a9 )] ( https://app.codacy.com/gh/nanotaboada/Dotnet.Samples.AspNetCore.WebApi/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade )
87[ ![ codecov] ( https://codecov.io/gh/nanotaboada/Dotnet.Samples.AspNetCore.WebApi/graph/badge.svg?token=hgJc1rStJ9 )] ( https://codecov.io/gh/nanotaboada/Dotnet.Samples.AspNetCore.WebApi )
98[ ![ CodeFactor] ( https://www.codefactor.io/repository/github/nanotaboada/Dotnet.Samples.AspNetCore.WebApi/badge )] ( https://www.codefactor.io/repository/github/nanotaboada/Dotnet.Samples.AspNetCore.WebApi )
109[ ![ License: MIT] ( https://img.shields.io/badge/License-MIT-white.svg )] ( https://opensource.org/licenses/MIT )
@@ -30,18 +29,14 @@ Proof of Concept for a RESTful API built with .NET 8 (LTS) and ASP.NET Core. Man
3029
3130## Features
3231
33- - 🔌 RESTful CRUD operations for football player data
34- - 📚 Interactive API documentation
35- - 🚦 Fixed window rate limiting
36- - ⌨️ Input validation
37- - ⚡ In-memory caching (1-hour TTL)
38- - 💿 Relational database with ORM
39- - 🏗️ Layered architecture pattern
40- - ⌛ Asynchronous operations throughout
41- - 📝 Structured logging to console and file
42- - 🩺 Health check endpoint for monitoring
43- - 🐳 Full containerization support
44- - ✅ Comprehensive unit tests
32+ - 🏗️ ** Clean layered architecture** - Repository pattern, dependency injection, and async operations throughout
33+ - 📚 ** Interactive API exploration** - Swagger UI documentation with health monitoring endpoints
34+ - ⚡ ** Performance optimizations** - In-memory caching, rate limiting, and efficient database queries
35+ - 🧪 ** High test coverage** - xUnit tests with automated reporting to Codecov and SonarCloud
36+ - 📖 ** Token-efficient documentation** - AGENTS.md + auto-loaded Copilot instructions for AI-assisted development
37+ - 🐳 ** Full containerization** - Multi-stage Docker builds with Docker Compose orchestration
38+ - 🔄 ** Complete CI/CD pipeline** - Automated testing, code quality checks, Docker publishing, and GitHub releases
39+ - 🏟️ ** Stadium-themed semantic versioning** - Memorable, alphabetical release names from World Cup venues
4540
4641## Tech Stack
4742
@@ -190,7 +185,7 @@ graph TB
190185
191186Interactive API documentation is available via Swagger UI at ` https://localhost:9000/swagger/index.html ` when the server is running.
192187
193- > 💡 ** Note: ** Swagger documentation is only available in development mode for security reasons.
188+ > 💡 Swagger documentation is only available in development mode for security reasons.
194189
195190** Quick Reference:**
196191
@@ -273,7 +268,7 @@ docker compose build
273268docker compose up
274269```
275270
276- > 💡 ** Note: ** On first run, the container copies a pre-seeded SQLite database into a persistent volume. On subsequent runs, that volume is reused and the data is preserved.
271+ > 💡 On first run, the container copies a pre-seeded SQLite database into a persistent volume. On subsequent runs, that volume is reused and the data is preserved.
277272
278273### Stop the application
279274
@@ -304,18 +299,39 @@ Releases follow the pattern: `v{SEMVER}-{STADIUM}` (e.g., `v1.0.0-azteca`)
304299
305300### Create a Release
306301
307- To create a new release, tag a commit and push the tag:
302+ To create a new release, follow this workflow:
303+
304+ #### 1. Update CHANGELOG.md
305+
306+ First, document your changes in [ CHANGELOG.md] ( CHANGELOG.md ) :
307+
308+ ``` bash
309+ # Move items from [Unreleased] to new release section
310+ # Example: [1.0.0 - azteca] - 2026-01-22
311+ git add CHANGELOG.md
312+ git commit -m " docs: prepare changelog for v1.0.0-azteca release"
313+ git push
314+ ```
315+
316+ #### 2. Create and Push Tag
317+
318+ Then create and push the version tag:
308319
309320``` bash
310321git tag -a v1.0.0-azteca -m " Release 1.0.0 - Azteca"
311322git push origin v1.0.0-azteca
312323```
313324
325+ #### 3. Automated CD Workflow
326+
314327This triggers the CD workflow which automatically:
315328
316- 1 . Builds and tests the project in Release configuration
317- 2 . Publishes Docker images to GitHub Container Registry with three tags
318- 3 . Creates a GitHub Release with auto-generated changelog
329+ 1 . Validates the stadium name
330+ 2 . Builds and tests the project in Release configuration
331+ 3 . Publishes Docker images to GitHub Container Registry with three tags
332+ 4 . Creates a GitHub Release with auto-generated changelog from commits
333+
334+ > 💡 Always update CHANGELOG.md before creating the tag. See [ CHANGELOG.md] ( CHANGELOG.md#how-to-release ) for detailed release instructions.
319335
320336### Pull Docker Images
321337
@@ -332,7 +348,7 @@ docker pull ghcr.io/nanotaboada/dotnet-samples-aspnetcore-webapi:azteca
332348docker pull ghcr.io/nanotaboada/dotnet-samples-aspnetcore-webapi:latest
333349```
334350
335- > 💡 ** Note: ** See [ CHANGELOG.md] ( CHANGELOG.md ) for the complete stadium list (A-Z) and release history.
351+ > 💡 See [ CHANGELOG.md] ( CHANGELOG.md ) for the complete stadium list (A-Z) and release history.
336352
337353## Environment Variables
338354
@@ -366,7 +382,7 @@ For containerized production deployment:
366382STORAGE_PATH=/storage/players-sqlite3.db
367383```
368384
369- > 💡 ** Note: ** Additional environment variables (` ASPNETCORE_ENVIRONMENT=Production ` and ` ASPNETCORE_URLS=http://+:9000 ` ) are set in the ` Dockerfile ` .
385+ > 💡 Additional environment variables (` ASPNETCORE_ENVIRONMENT=Production ` and ` ASPNETCORE_URLS=http://+:9000 ` ) are set in the ` Dockerfile ` .
370386
371387## Command Summary
372388
0 commit comments