Et simpelt C# .NET 9 Web API projekt, der demonstrerer hvordan man kan bygge en REST API med Entity Framework Core og dokumenteres med Swagger UI.
Derudover er der ogsΓ₯ mulighed for Dockerization, og CI/CD med Jenkins, i en samlet pakke med docker compose.
Projektet kan kΓΈres lokalt med dotnet run fra projektroden og Docker containers med docker compose up --build (--build er til fΓΈrste gang man kΓΈrer det)
NΓ₯r projektet kΓΈres i Docker med docker compose up --build sΓ₯ oprettes der 4 containere:
cereal-api, cereal-db, cereal-frontend, og jenkins i Γ©n samlet compose
cereal-api er den container der holder pΓ₯ alt API funktionalitet. Som f.eks. Models, Controllers, Endpoints, etc.
cereal-db er en MySQL database instance.
cereal-frontend er React frontend der kΓΈres med Vite. Der er desuden hot-reload indbygget, sΓ₯ man ikke skal genstarte containere hver gang man Γ¦ndre pΓ₯ koden.
jenkins er et CI/CD værktøj der kører i sin egen instance.
NΓ₯r projektet kΓΈrer enten lokalt eller gennem Docker containerization, kan det tilgΓ₯s pΓ₯ http://localhost:5173.
CerealAPI/
βββ π CerealAPI/ # API projektmappe
β βββ π Controllers/ # API controllere
β βββ π Data/ # CSV-fil og database seeder
β βββ π Migrations/ # Entity Framework migrations
β βββ π Models/ # Datamodeller
β βββ π CerealAPI.csproj # C# projektfilen
βββ βββ π Dockerfile # Dockerfilen til API
β βββ βοΈ Program.cs # Main entry point
βββ π CerealFrontEnd/ # Frontend projektmappe
β βββ π public/ # Den "offentlige" mappe
β βββ π src/ # Resurse mappen
β β βββ π api/ # Indeholder API typing
β β βββ π assets/ # Diverse assets
β β βββ π components/ # Genbrugelige komponenter
β β βββ π pages/ # Alle siderne der loades
β β βββ πͺ¨ App.tsx # Filen hvor det hele kΓΈres (minimal size)
β β βββ π types.ts # TypesΓ¦tning til objekter (pt. kun Cereals)
β β βββ π Og mange flere filer...
βββ βββ π Dockerfile # Docker filen til Frontend
β βββ βοΈ Config-filer.. # En hel masse config filer
βββ πΌ docker-compose.yml # Orkestrerer API, MySQL, Frontend, og Jenkins
βββ π€΅π»ββοΈ Jenkinsfile # CI/CD pipeline konfiguration| Metode | Endpoint | Beskrivelse | Body (JSON) eksempel |
|---|---|---|---|
| GET | /api/Cereal |
Hent alle cereals | β |
| GET | /api/Cereal/{id} |
Hent en cereal via Id | { "id": 15 } |
| POST | /api/Cereal |
Opret en ny cereal | { "name": "Corn Flakes", "calories": 120 } |
| PUT | /api/Cereal/{id} |
Opdater en cereal | { "id": 1, "name": "Choco Pops", "calories": 200 } |
| DELETE | /api/Cereal/{id} |
Slet en cereal | { "id": 37 } |
- ASP.NET Core Web API
- Entity Framework Core
- MySQL Workbench
- Swagger / Swashbuckle
- Docker Containers
- Jenkins
- React w. Vite & TypeScript
Ved fΓΈrste opstart importerer APIβet automatisk data fra Data/Cereal.csv til databasen. Dette hΓ₯ndteres af CerealSeeder under opstart:
CerealSeeder.SeedProducts(context, "Data/Cereal.csv");Hvis filen ikke findes, kaster den en exception f.eks.:
System.IO.FileNotFoundException: CSV filen blev ikke fundetFor at sikre adgang og at Docker faktisk kan finde filen tilfΓΈjes denne linje til docker-compose.yml:
volumes:
- ./CerealApi/Data:/app/Data- Klon repoet:
git clone https://github.com/brugernavn/CerealAPI.git
cd CerealAPI- TilfΓΈj database-forbindelse i
appsettings.json:
"ConnectionStrings": {
"DefaultConnection": "server=localhost;database=cerealsdb;user=dinBruger;password=dinKode"
}- Opret migrations og opdater databasen:
dotnet ef add migrations initialCreate
dotnet ef database update- Start API'et enten i Visual Studio Run eller .NET CLI:
dotnet runNΓ₯r APIβet kΓΈrer, kan du Γ₯bne:
http://localhost:5555/swaggerHer kan ud teste alle endpoints til API'et i browseren.
Hvis det kΓΈres i Docker er porten 5556: (Husk at tjekke om Docker containers kΓΈrer fΓΈr du gΓ₯r ind pΓ₯ adressen)
http://localhost:5556/swaggerGennemgΓ₯ Dockerfile og docker-compose.yml for at sΓ¦tte dine egne vΓ¦rdier:
EXPOSE 5556 # bruges i dette projekt# Under api:
ports:
- "5556:5556" # Docker API port
environment:
- ConnectionStrings__DefaultConnection=Server=db;Port=3306;Database=cerealdb;User=DockerUserDb;Password=DockerPassDb;
- ASPNETCORE_URLS=http://+:5556
- DOTNET_ENVIRONMENT=Development
# Under db:
environment:
MYSQL_ROOT_PASSWORD: DbPassIDocker
MYSQL_DATABASE: cerealdb
MYSQL_ROOT_HOST: '%'
ports:
- "3308:3306" # Docker MySQL portDerefter kan de startes gennem Docker Desktop, eller med Docker CLI fra rod-mappen (samme sted som README):
docker compose up --buildPipelinen (defineret i Jenkinsfile) bestΓ₯r af fire hovedtrin: π§Ύ Checkout β Henter projektet fra GitHub ποΈ Build β Genskaber og kompilerer .NET-projektet π§ͺ Test β KΓΈrer enhedstests π Deploy β Genstarter containerne via Docker Compose
ββββββββββββββββββββββββ
β GitHub β
β (CerealAPI Repo) β
ββββββββββββ¬ββββββββββββ
β Push / Commit
βΌ
ββββββββββββββββββββββββ
β Jenkins β
β CI/CD Pipeline β
ββββββββββββββββββββββββ€
β 1οΈβ£ Build & Test β
β 2οΈβ£ Docker Compose β
β 3οΈβ£ Deploy API β
ββββββββββββ¬ββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββ
β Docker Host β
β β
β π₯£ CerealAPI | π¬ MySQL β
β β
β Swagger β localhost:5556 β
ββββββββββββββββββββββββββββββ
Repo Flow: NΓ₯r der pushes ny kode til GitHub, trigger Jenkins pipelinen, der automatisk bygger, tester og genstarter hele miljΓΈet i Docker. (I teorien)
Kald Lokalt API fra terminalen:
curl https://localhost:5555/api/cerealEller benyt Swagger til GET/POST requests.
Kald Dockerized API i terminalen:
curl http://localhost:5556/api/cereal- Jenkins Agent (docker image)
- Frontend (React?)