name: CI on: push: branches: [main, develop] pull_request: branches: [main, develop] env: NODE_VERSION: '18' jobs: lint: name: Lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Bun uses: oven-sh/setup-bun@v1 with: bun-version: latest - name: Install dependencies run: bun install --frozen-lockfile - name: Run ESLint run: bun run lint - name: Check formatting run: bun run format:check type-check: name: Type Check runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Bun uses: oven-sh/setup-bun@v1 with: bun-version: latest - name: Install dependencies run: bun install --frozen-lockfile - name: Run TypeScript type checking run: bun run type-check test: name: Unit & Integration Tests runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Bun uses: oven-sh/setup-bun@v1 with: bun-version: latest - name: Install dependencies run: bun install --frozen-lockfile - name: Run tests with coverage run: bun run test:ci - name: Upload coverage reports uses: codecov/codecov-action@v3 with: files: ./coverage/lcov.info fail_ci_if_error: false verbose: true - name: Upload test results uses: actions/upload-artifact@v4 if: always() with: name: test-results path: | coverage/ junit.xml retention-days: 30 build: name: Build runs-on: ubuntu-latest needs: [lint, type-check, test] steps: - uses: actions/checkout@v4 - name: Setup Bun uses: oven-sh/setup-bun@v1 with: bun-version: latest - name: Install dependencies run: bun install --frozen-lockfile - name: Build application run: bun run build - name: Upload build artifacts uses: actions/upload-artifact@v4 with: name: build path: .next/ retention-days: 7 e2e: name: E2E Tests runs-on: ubuntu-latest needs: build steps: - uses: actions/checkout@v4 - name: Setup Bun uses: oven-sh/setup-bun@v1 with: bun-version: latest - name: Install dependencies run: bun install --frozen-lockfile - name: Download build artifacts uses: actions/download-artifact@v4 with: name: build path: .next/ - name: Run Cypress tests uses: cypress-io/github-action@v6 with: start: bun run start wait-on: 'http://localhost:3001' wait-on-timeout: 120 browser: chrome record: false - name: Upload Cypress screenshots uses: actions/upload-artifact@v4 if: failure() with: name: cypress-screenshots path: cypress/screenshots retention-days: 7 - name: Upload Cypress videos uses: actions/upload-artifact@v4 if: failure() with: name: cypress-videos path: cypress/videos retention-days: 7