name: CI on: push: branches: [main] pull_request: branches: [main] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: lint: name: Lint runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v7 - name: Setup pnpm uses: ./.github/actions/setup-pnpm - name: Run Biome check run: pnpm biome:check type-check: name: Type Check runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v7 - name: Setup pnpm uses: ./.github/actions/setup-pnpm - name: Run TypeScript type check run: pnpm type-check test: name: Test runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v7 with: fetch-depth: 0 - name: Setup pnpm uses: ./.github/actions/setup-pnpm - name: Run tests run: pnpm test:ci - name: Check data health run: pnpm data-health:check spell-check: name: Spell Check runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v7 - name: Setup pnpm uses: ./.github/actions/setup-pnpm - name: Run CSpell run: pnpm spell security: name: Dependency Audit runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v7 - name: Setup pnpm uses: ./.github/actions/setup-pnpm - name: Block high and critical advisories run: pnpm security:audit build: name: Build runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v7 - name: Setup pnpm uses: ./.github/actions/setup-pnpm - name: Build Next.js application run: pnpm build env: BUILD_TIME: ${{ github.event.head_commit.timestamp }} - name: Verify generated source is current run: git diff --exit-code -- src/lib/generated - name: Upload build artifacts uses: actions/upload-artifact@v6 with: name: build-output path: | .next .open-next retention-days: 7 e2e: name: Browser Smoke runs-on: ubuntu-latest timeout-minutes: 15 steps: - name: Checkout code uses: actions/checkout@v7 - name: Setup pnpm uses: ./.github/actions/setup-pnpm - name: Install Chromium run: pnpm exec playwright install --with-deps chromium - name: Run browser smoke tests run: pnpm test:e2e:ci ci-success: name: CI Success runs-on: ubuntu-latest needs: [lint, type-check, test, spell-check, security, build, e2e] if: always() steps: - name: Check all jobs run: | if [[ "${{ contains(needs.*.result, 'failure') }}" == "true" || "${{ contains(needs.*.result, 'cancelled') }}" == "true" || "${{ contains(needs.*.result, 'skipped') }}" == "true" ]]; then echo "One or more required CI jobs failed, were cancelled, or were skipped" exit 1 fi echo "All CI jobs passed successfully"