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
95 changes: 95 additions & 0 deletions .github/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# CI/CD Workflows for WarehouseEngine

This repository includes several GitHub Actions workflows for continuous integration and deployment.

## Workflows

### 1. CI Build and Test (`ci.yml`)
**Triggers:** Push/PR to `main` or `develop` branches

**What it does:**
- Sets up .NET 9.0 environment
- Provides SQL Server service for database tests
- Builds all core projects (excluding Database project which requires .NET Framework)
- Runs all test suites:
- Domain tests (always runs)
- Infrastructure tests (with SQL Server, allows failures)
- API Integration tests (allows failures if Docker issues)
- Publishes the API project
- Collects code coverage reports

**Projects built:**
- WarehouseEngine.Domain
- WarehouseEngine.Application
- WarehouseEngine.Infrastructure
- WarehouseEngine.Api
- All test projects

### 2. API Build and Test (`api-ci.yml`)
**Triggers:** Push/PR to `main` or `develop` branches, but only when API-related files change

**What it does:**
- Focused on API project specifically
- Builds and tests only API-related components
- Creates deployable API artifacts
- Optimized for faster feedback on API changes

### 3. Build Only (`build-only.yml`)
**Triggers:** Manual dispatch or daily at 2 AM UTC

**What it does:**
- Simple build verification
- Tests API publishing capability
- No tests, just compilation verification
- Useful for dependency updates or general health checks

## Features

### SQL Server Integration
The main CI workflow includes a SQL Server 2022 service for Infrastructure tests that require database connectivity.

### Error Handling
- Infrastructure tests allow failures (SQL Server connectivity issues)
- API Integration tests allow failures (Docker environment issues)
- Build continues even if some tests fail to provide maximum feedback

### Code Coverage
All test runs collect XPlat Code Coverage for local analysis.

### Artifact Management
- API builds are uploaded as artifacts with 7-day retention
- Published API output is available for deployment

## Setup Requirements

### Environment
- Requires GitHub Actions runners with:
- .NET 9.0 support
- Docker support (for API Integration tests)
- SQL Server service support

## Project Dependencies

The build excludes the `WarehouseEngine.Database` project as it requires .NET Framework 4.7.2, which is not available in the Linux CI environment. This is intentional and does not affect the API functionality.

## Usage

1. **Automatic Builds**: Push or create PR to `main`/`develop` branches
2. **Manual Builds**: Use "Actions" tab → "Build Only" → "Run workflow"
3. **API-specific Builds**: Automatically triggered when API-related files change

## Troubleshooting

### Common Issues
1. **Infrastructure tests failing**: Check SQL Server service health
2. **API Integration tests failing**: Usually Docker-related, workflow continues
3. **Database project build errors**: Expected and excluded from CI

### Local Testing
To test the build locally:
```bash
dotnet restore
dotnet build src/WarehouseEngine.Api/WarehouseEngine.Api.csproj --configuration Release
dotnet test tests/WarehouseEngine.Domain.Tests/WarehouseEngine.Domain.Tests.csproj
dotnet publish src/WarehouseEngine.Api/WarehouseEngine.Api.csproj --output ./dist
```
50 changes: 50 additions & 0 deletions .github/workflows/api-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: API Build and Test

on:
push:
branches: [ main ]
paths:
- 'src/WarehouseEngine.Api/**'
- 'src/WarehouseEngine.Domain/**'
- 'src/WarehouseEngine.Application/**'
- 'src/WarehouseEngine.Infrastructure/**'
pull_request:
branches: [ main ]
paths:
- 'src/WarehouseEngine.Api/**'
- 'src/WarehouseEngine.Domain/**'
- 'src/WarehouseEngine.Application/**'
- 'src/WarehouseEngine.Infrastructure/**'

jobs:
api-build-test:
runs-on: ubuntu-latest

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

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'

- name: Restore API dependencies
run: dotnet restore src/WarehouseEngine.Api/WarehouseEngine.Api.csproj

- name: Build API project
run: dotnet build src/WarehouseEngine.Api/WarehouseEngine.Api.csproj --configuration Release --no-restore

- name: Run API-related tests
run: |
dotnet test tests/WarehouseEngine.Domain.Tests/WarehouseEngine.Domain.Tests.csproj --configuration Release --verbosity normal

- name: Publish API
run: dotnet publish src/WarehouseEngine.Api/WarehouseEngine.Api.csproj --configuration Release --no-build --output ./api-dist

- name: Upload API artifacts
uses: actions/upload-artifact@v4
with:
name: api-build
path: ./api-dist/
retention-days: 7
34 changes: 34 additions & 0 deletions .github/workflows/build-only.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Build Only

on:
workflow_dispatch: # Manual trigger
schedule:
- cron: '0 2 * * *' # Daily at 2 AM UTC

jobs:
build:
runs-on: ubuntu-latest

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

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'

- name: Restore dependencies
run: dotnet restore

- name: Build solution
run: dotnet build --configuration Release --no-restore

- name: Build API project specifically
run: dotnet build src/WarehouseEngine.Api/WarehouseEngine.Api.csproj --configuration Release --no-restore

- name: Check that API can be published
run: dotnet publish src/WarehouseEngine.Api/WarehouseEngine.Api.csproj --configuration Release --no-build --output ./publish-output

- name: List published files
run: ls -la ./publish-output
91 changes: 91 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: CI Build and Test

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

jobs:
build-and-test:
runs-on: ubuntu-latest

services:
sqlserver:
image: mcr.microsoft.com/mssql/server:2022-latest
env:
SA_PASSWORD: YourStrong@Passw0rd
ACCEPT_EULA: Y
ports:
- 1433:1433
options: >-
--health-cmd="/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P YourStrong@Passw0rd -C -Q 'SELECT 1'"
--health-interval=10s
--health-timeout=3s
--health-retries=3

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

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'

- name: Restore dependencies
run: dotnet restore

- name: Build core projects (excluding Database project)
run: |
dotnet build src/WarehouseEngine.Domain/WarehouseEngine.Domain.csproj --configuration Release --no-restore
dotnet build src/WarehouseEngine.Application/WarehouseEngine.Application.csproj --configuration Release --no-restore
dotnet build src/WarehouseEngine.Infrastructure/WarehouseEngine.Infrastructure.csproj --configuration Release --no-restore
dotnet build src/WarehouseEngine.Api/WarehouseEngine.Api.csproj --configuration Release --no-restore
dotnet build tests/WarehouseEngine.Domain.Tests/WarehouseEngine.Domain.Tests.csproj --configuration Release --no-restore
dotnet build tests/WarehouseEngine.Infrastructure.Tests/WarehouseEngine.Infrastructure.Tests.csproj --configuration Release --no-restore
dotnet build tests/WarehouseEngine.Api.Integration.Tests/WarehouseEngine.Api.Integration.Tests.csproj --configuration Release --no-restore

- name: Run Domain tests
run: dotnet test tests/WarehouseEngine.Domain.Tests/WarehouseEngine.Domain.Tests.csproj --configuration Release --no-build --verbosity normal --collect:"XPlat Code Coverage"

- name: Run Infrastructure tests (with SQL Server)
run: dotnet test tests/WarehouseEngine.Infrastructure.Tests/WarehouseEngine.Infrastructure.Tests.csproj --configuration Release --no-build --verbosity normal --collect:"XPlat Code Coverage"
env:
ConnectionStrings__DefaultConnection: "Server=localhost,1433;Database=WarehouseEngineTest;User Id=sa;Password=YourStrong@Passw0rd;TrustServerCertificate=true;"
continue-on-error: true # Allow this to fail gracefully if it can't connect to SQL Server

- name: Run API Integration tests
run: dotnet test tests/WarehouseEngine.Api.Integration.Tests/WarehouseEngine.Api.Integration.Tests.csproj --configuration Release --no-build --verbosity normal --collect:"XPlat Code Coverage"
continue-on-error: true # Allow this to fail if Docker is not available

- name: Publish API
run: dotnet publish src/WarehouseEngine.Api/WarehouseEngine.Api.csproj --configuration Release --no-build --output ./api-publish

# Alternative job for environments without services support
build-basic:
runs-on: ubuntu-latest
if: github.event_name == 'workflow_dispatch'

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

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'

- name: Restore dependencies
run: dotnet restore

- name: Build core projects only
run: |
dotnet build src/WarehouseEngine.Domain/WarehouseEngine.Domain.csproj --configuration Release --no-restore
dotnet build src/WarehouseEngine.Application/WarehouseEngine.Application.csproj --configuration Release --no-restore
dotnet build src/WarehouseEngine.Infrastructure/WarehouseEngine.Infrastructure.csproj --configuration Release --no-restore
dotnet build src/WarehouseEngine.Api/WarehouseEngine.Api.csproj --configuration Release --no-restore
dotnet build tests/WarehouseEngine.Domain.Tests/WarehouseEngine.Domain.Tests.csproj --configuration Release --no-restore

- name: Run Domain tests only (basic build)
run: dotnet test tests/WarehouseEngine.Domain.Tests/WarehouseEngine.Domain.Tests.csproj --configuration Release --no-build --verbosity normal
Loading