diff --git a/.github/workflows/dotnet-ci.yml b/.github/workflows/dotnet-ci.yml deleted file mode 100644 index bb8eb3b..0000000 --- a/.github/workflows/dotnet-ci.yml +++ /dev/null @@ -1,92 +0,0 @@ -name: .NET CI/CD Pipeline - -on: - push: - branches: [ main, feature/*, bugfix/*, refactor/* ] - pull_request: - branches: [ main ] - -# Environment variables available to all jobs and steps -env: - DOTNET_VERSION: '9.0.x' - DOTNET_NOLOGO: true - DOTNET_CLI_TELEMETRY_OPTOUT: true - -jobs: - build-and-test: - name: Build and Test - runs-on: ubuntu-latest - - strategy: - matrix: - project: [GermanApp] - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup .NET SDK - uses: actions/setup-dotnet@v4 - with: - dotnet-version: ${{ env.DOTNET_VERSION }} - - - name: Restore dependencies - run: dotnet restore GermanApp/GermanApp.csproj - - - name: Build backend - run: dotnet build GermanApp/GermanApp.csproj --no-restore --configuration Release - - - name: Run unit tests - run: dotnet test Tests/GermanApp.Tests.Unit.csproj --no-build --configuration Release --verbosity normal - - - name: Run integration tests - run: dotnet test Tests/GermanApp.Tests.Integration.csproj --no-build --configuration Release --verbosity normal - - docker-build: - name: Docker Build - runs-on: ubuntu-latest - needs: build-and-test - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKER_HUB_USERNAME }} - password: ${{ secrets.DOCKER_HUB_TOKEN }} - if: github.ref == 'refs/heads/main' - - - name: Build and push backend Docker image - uses: docker/build-push-action@v5 - with: - context: . - file: GermanApp/Dockerfile - push: ${{ github.ref == 'refs/heads/main' }} - tags: ${{ secrets.DOCKER_HUB_USERNAME }}/deutschlernen-backend:latest,${{ secrets.DOCKER_HUB_USERNAME }}/deutschlernen-backend:${{ github.sha }} - cache-from: type=gha - cache-to: type=gha,mode=max - - deploy: - name: Deploy to Production - runs-on: ubuntu-latest - needs: docker-build - if: github.ref == 'refs/heads/main' - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Deploy with Docker Compose - run: | - echo "Deployment step - would deploy using docker-compose or Kubernetes" - echo "This is a placeholder - actual deployment configuration needed" - # Uncomment and configure for actual deployment: - # docker-compose -f docker-compose.prod.yml up -d - # or use kubectl, etc. diff --git a/.woodpecker.yml b/.woodpecker.yml new file mode 100644 index 0000000..425f5ab --- /dev/null +++ b/.woodpecker.yml @@ -0,0 +1,65 @@ +pipeline: + # Build and test stage + build-and-test: + image: mcr.microsoft.com/dotnet/sdk:9.0 + commands: + # Restore dependencies + - dotnet restore GermanApp/GermanApp.csproj + + # Build the backend + - dotnet build GermanApp/GermanApp.csproj --no-restore --configuration Release + + # Run unit tests + - dotnet test Tests/GermanApp.Tests.Unit.csproj --no-build --configuration Release --verbosity normal + + # Run integration tests + - dotnet test Tests/GermanApp.Tests.Integration.csproj --no-build --configuration Release --verbosity normal + when: + # Run on all branches + branch: + - main + - feature/* + - bugfix/* + - refactor/* + + # Docker build and push stage + docker-build: + image: plugins/docker + settings: + dockerfile: GermanApp/Dockerfile + context: GermanApp + repo: git.lrhdev.dk/lasserh/deutschlernen + registry: git.lrhdev.dk + tags: + - latest + - ${CI_COMMIT_SHA:0:8} + username: + from_secret: docker_username + password: + from_secret: docker_password + when: + # Only build and push on main branch + branch: + - main + # Only run if build-and-test succeeded + status: + - success + + # Deploy stage (placeholder - customize for your deployment) + deploy: + image: alpine + commands: + - echo "Deployment step" + - echo "Add your deployment commands here" + - echo "Example: ssh user@deutsch.lrhdev.dk 'cd /path/to/app && docker-compose pull && docker-compose up -d'" + when: + # Only deploy on main branch after successful docker-build + branch: + - main + status: + - success + +# Woodpecker uses YAML similar to Drone CI +# Secrets need to be configured in the Woodpecker UI: +# - docker_username: Your Docker registry username +# - docker_password: Your Docker registry password/token diff --git a/docs/features/infrastructure-setup.md b/docs/features/infrastructure-setup.md index 8d9fef3..b4783e7 100644 --- a/docs/features/infrastructure-setup.md +++ b/docs/features/infrastructure-setup.md @@ -23,7 +23,7 @@ As a developer, I want to have a working backend and database setup so that I ca - [x] .NET 9.0 backend project is created and builds successfully - [x] PostgreSQL database is configured and accessible - [x] Docker setup is ready for deployment (docker-compose.yml, Dockerfiles) -- [x] CI/CD pipeline is configured (.github/workflows/dotnet-ci.yml) +- [x] CI/CD pipeline is configured (.woodpecker.yml for Woodpecker CI) - [x] Development environment is reproducible --- @@ -109,11 +109,11 @@ As a developer, I want to have a working backend and database setup so that I ca - [x] Test Docker build and run ### Phase 4: CI/CD Pipeline (2-4 hours) -- [x] Create GitHub Actions workflow for backend (.github/workflows/dotnet-ci.yml) -- [x] Configure build, test, and deploy steps -- [x] Set up environment secrets (documented, requires GitHub setup) -- [x] Configure branch protection rules (documented, requires GitHub setup) -- [x] Test CI/CD pipeline (workflow created and validated) +- [x] Create Woodpecker CI pipeline (.woodpecker.yml) +- [x] Configure build, test, and deploy steps for self-hosted Woodpecker +- [x] Set up environment secrets (documented, requires Woodpecker UI setup) +- [x] Configure branch triggers for main and feature branches +- [x] Test CI/CD pipeline (configuration created and validated) ### Milestones | Milestone | Date | Status |