diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml new file mode 100644 index 00000000..81496bd3 --- /dev/null +++ b/.gitea/workflows/ci.yml @@ -0,0 +1,136 @@ +name: CI + +on: + push: + pull_request: + +jobs: + # ─── Unit & Browser Component Tests ────────────────────────────────────────── + # No backend needed — Vitest runs in Node (utils) and headless Chromium (components). + unit-tests: + name: Unit & Component Tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + cache-dependency-path: frontend/package-lock.json + + - name: Install dependencies + run: npm ci + working-directory: frontend + + - name: Install Playwright Chromium (used by vitest browser mode) + run: npx playwright install chromium --with-deps + working-directory: frontend + + - name: Run unit and component tests + run: npm test + working-directory: frontend + + - name: Upload screenshots + if: always() + uses: actions/upload-artifact@v4 + with: + name: unit-test-screenshots + path: frontend/test-results/screenshots/ + + # ─── E2E Tests ──────────────────────────────────────────────────────────────── + # Needs: PostgreSQL + MinIO (via docker-compose) + Spring Boot + SvelteKit dev server. + # Test data is seeded by DataInitializer on first startup (admin user + e2e profile data). + e2e-tests: + name: E2E Tests + runs-on: ubuntu-latest + + # These env vars are picked up by docker-compose (overrides .env file) + env: + POSTGRES_USER: archive_user + POSTGRES_PASSWORD: ci_db_password + POSTGRES_DB: family_archive_db + MINIO_ROOT_USER: minio_admin + MINIO_ROOT_PASSWORD: ci_minio_password + MINIO_DEFAULT_BUCKETS: archive-documents + PORT_DB: 5432 + PORT_MINIO_API: 9000 + PORT_MINIO_CONSOLE: 9001 + PORT_BACKEND: 8080 + PORT_FRONTEND: 3000 + + steps: + - uses: actions/checkout@v4 + + # ── Infrastructure ────────────────────────────────────────────────────── + - name: Start DB and MinIO + run: docker-compose up -d db minio create-buckets + + - name: Wait for DB to be ready + run: | + timeout 30 bash -c \ + 'until docker-compose exec -T db pg_isready -U archive_user; do sleep 2; done' + + # ── Backend ───────────────────────────────────────────────────────────── + - uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: temurin + cache: maven + + - name: Build backend (skip tests — covered by separate Java test job) + run: | + chmod +x mvnw + ./mvnw clean package -DskipTests + working-directory: backend + + - name: Start backend + run: | + java -jar backend/target/*.jar \ + --spring.profiles.active=e2e \ + --SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/family_archive_db \ + --SPRING_DATASOURCE_USERNAME=archive_user \ + --SPRING_DATASOURCE_PASSWORD=ci_db_password \ + --S3_ENDPOINT=http://localhost:9000 \ + --S3_ACCESS_KEY=minio_admin \ + --S3_SECRET_KEY=ci_minio_password \ + --S3_BUCKET_NAME=archive-documents \ + --S3_REGION=us-east-1 \ + --APP_ADMIN_USERNAME=admin \ + --APP_ADMIN_PASSWORD=admin123 \ + & + echo "Waiting for backend..." + timeout 90 bash -c \ + 'until curl -sf http://localhost:8080/actuator/health | grep -q "UP"; do sleep 3; done' + echo "Backend is up." + + # ── Frontend ───────────────────────────────────────────────────────────── + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + cache-dependency-path: frontend/package-lock.json + + - name: Install frontend dependencies + run: npm ci + working-directory: frontend + + - name: Install Playwright Chromium + run: npx playwright install chromium --with-deps + working-directory: frontend + + # ── Tests ──────────────────────────────────────────────────────────────── + - name: Run E2E tests + run: npm run test:e2e + working-directory: frontend + env: + E2E_BASE_URL: http://localhost:3000 + E2E_USERNAME: admin + E2E_PASSWORD: admin123 + + - name: Upload E2E results + if: always() + uses: actions/upload-artifact@v4 + with: + name: e2e-results + path: frontend/test-results/e2e/