feat: implement core features including auth, courses, ai-quizzes, an… #56
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # ============================================================================== | |
| # CI Pipeline - Learnix | |
| # Runs on: Pull requests and pushes to main | |
| # Uses reusable workflows for DRY pattern | |
| # ============================================================================== | |
| name: CI | |
| on: | |
| push: | |
| branches: [main] | |
| paths: | |
| - 'apps/web/**' | |
| - 'apps/api/**' | |
| - 'packages/**' | |
| - 'e2e/**' | |
| - 'playwright.config.ts' | |
| - '.github/workflows/ci.yml' | |
| - '.github/workflows/reusable-ci.yml' | |
| - '.github/actions/**' | |
| pull_request: | |
| branches: [main] | |
| paths: | |
| - 'apps/web/**' | |
| - 'apps/api/**' | |
| - 'packages/**' | |
| - 'e2e/**' | |
| - 'playwright.config.ts' | |
| - '.github/workflows/ci.yml' | |
| - '.github/workflows/reusable-ci.yml' | |
| - '.github/actions/**' | |
| concurrency: | |
| group: ci-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| # ========================== | |
| # Format Check (runs once for whole repo) | |
| # ========================== | |
| format: | |
| name: Format Check | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v6 | |
| - name: Setup Node.js and pnpm | |
| uses: ./.github/actions/setup-node-pnpm | |
| with: | |
| working-directory: . | |
| node-version: '24' | |
| - name: Check formatting | |
| run: pnpm exec prettier --check . | |
| # ========================== | |
| # Backend CI | |
| # ========================== | |
| backend: | |
| name: Backend | |
| uses: ./.github/workflows/reusable-ci.yml | |
| with: | |
| project: apps/api | |
| filter: '@repo/api' | |
| test-command: pnpm test | |
| # ========================== | |
| # Frontend CI | |
| # ========================== | |
| frontend: | |
| name: Frontend | |
| uses: ./.github/workflows/reusable-ci.yml | |
| with: | |
| project: apps/web | |
| filter: '@repo/web' | |
| test-command: pnpm test | |
| # ========================== | |
| # E2E Tests (Playwright) | |
| # Runs only on PRs to catch regressions before merge | |
| # ========================== | |
| e2e: | |
| name: E2E Tests | |
| runs-on: ubuntu-latest | |
| needs: [backend, frontend] | |
| if: github.event_name == 'pull_request' | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v6 | |
| - name: Setup Node.js and pnpm | |
| uses: ./.github/actions/setup-node-pnpm | |
| with: | |
| working-directory: . | |
| node-version: '24' | |
| - name: Cache Playwright browsers | |
| uses: actions/cache@v4 | |
| id: playwright-cache | |
| with: | |
| path: ~/.cache/ms-playwright | |
| key: playwright-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }} | |
| - name: Install Playwright browsers | |
| if: steps.playwright-cache.outputs.cache-hit != 'true' | |
| run: pnpm exec playwright install --with-deps chromium | |
| - name: Install Playwright dependencies only | |
| if: steps.playwright-cache.outputs.cache-hit == 'true' | |
| run: pnpm exec playwright install-deps chromium | |
| - name: Build frontend | |
| run: pnpm --filter @repo/web build | |
| - name: Start frontend preview server | |
| run: | | |
| cd apps/web | |
| pnpm preview --port 5173 & | |
| # Wait for server to be ready | |
| npx wait-on http://localhost:5173 --timeout 30000 | |
| - name: Run E2E tests | |
| run: pnpm test:e2e --project=chromium | |
| env: | |
| CI: true | |
| PLAYWRIGHT_BASE_URL: http://localhost:5173 | |
| - name: Upload Playwright report | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: playwright-report | |
| path: playwright-report/ | |
| retention-days: 7 | |
| - name: Upload test results | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: test-results | |
| path: test-results/ | |
| retention-days: 7 | |
| # ========================== | |
| # CI Status Check | |
| # ========================== | |
| ci-status: | |
| name: CI Status | |
| runs-on: ubuntu-latest | |
| needs: [format, backend, frontend, e2e] | |
| if: always() | |
| steps: | |
| - name: Check CI status | |
| run: | | |
| if [[ "${{ needs.format.result }}" == "failure" ]] || \ | |
| [[ "${{ needs.backend.result }}" == "failure" ]] || \ | |
| [[ "${{ needs.frontend.result }}" == "failure" ]] || \ | |
| [[ "${{ needs.e2e.result }}" == "failure" ]]; then | |
| echo "❌ CI failed" | |
| exit 1 | |
| fi | |
| echo "✅ All CI checks passed" |