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.