Experiment #1291
Workflow file for this run
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
| name: CI | |
| on: | |
| push: | |
| branches: [main] | |
| pull_request: | |
| branches: [main] | |
| workflow_dispatch: | |
| # Cancel in-progress runs for the same workflow and branch | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| # Shared job for installing dependencies with caching | |
| install: | |
| name: Install Dependencies | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 5 | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version-file: ".nvmrc" | |
| cache: "npm" | |
| - name: Cache node_modules | |
| id: cache-node-modules | |
| uses: actions/cache@v4 | |
| with: | |
| path: node_modules | |
| key: ${{ runner.os }}-node-modules-${{ hashFiles('package-lock.json') }} | |
| restore-keys: | | |
| ${{ runner.os }}-node-modules- | |
| - name: Install dependencies | |
| if: steps.cache-node-modules.outputs.cache-hit != 'true' | |
| run: npm ci | |
| # Lint, format, and type check | |
| code-quality: | |
| name: Code Quality | |
| needs: install | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 5 | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version-file: ".nvmrc" | |
| cache: "npm" | |
| - name: Restore node_modules | |
| uses: actions/cache@v4 | |
| with: | |
| path: node_modules | |
| key: ${{ runner.os }}-node-modules-${{ hashFiles('package-lock.json') }} | |
| - name: Type Check | |
| run: npm run type-check | |
| - name: Lint | |
| run: npm run lint | |
| - name: Format Check | |
| run: npm run format:check | |
| # Run tests | |
| test: | |
| name: Test | |
| needs: install | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version-file: ".nvmrc" | |
| cache: "npm" | |
| - name: Restore node_modules | |
| uses: actions/cache@v4 | |
| with: | |
| path: node_modules | |
| key: ${{ runner.os }}-node-modules-${{ hashFiles('package-lock.json') }} | |
| - name: Run tests | |
| run: npm run test:coverage | |
| - name: Upload coverage reports | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: coverage | |
| path: coverage/ | |
| retention-days: 7 | |
| # Build on multiple OS and Node versions | |
| build: | |
| name: Build (${{ matrix.os }}, Node ${{ matrix.node-version }}) | |
| needs: install | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: 10 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| node-version: [20.x, 22.x] | |
| os: [ubuntu-latest, windows-latest, macos-latest] | |
| exclude: | |
| # Reduce matrix size for faster CI | |
| - os: windows-latest | |
| node-version: 20.x | |
| - os: macos-latest | |
| node-version: 20.x | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js ${{ matrix.node-version }} | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: ${{ matrix.node-version }} | |
| cache: "npm" | |
| - name: Install dependencies | |
| run: npm ci | |
| - name: Build | |
| run: npm run build | |
| env: | |
| NODE_ENV: production | |
| NEXT_PUBLIC_GA_TRACKING_ID: ${{ vars.NEXT_PUBLIC_GA_TRACKING_ID || 'G-XXXXXXXXXX' }} | |
| - name: Verify static export | |
| shell: bash | |
| run: | | |
| if [ ! -d "out" ]; then | |
| echo "Error: 'out' directory not found. Static export may have failed." | |
| exit 1 | |
| fi | |
| echo "Static export successful. Found $(find out -type f | wc -l) files." | |
| - name: Upload build artifacts | |
| if: matrix.os == 'ubuntu-latest' && matrix.node-version == '22.x' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: build-output | |
| path: out/ | |
| retention-days: 7 | |
| # Summary job to ensure all checks pass | |
| ci-success: | |
| name: CI Success | |
| needs: [code-quality, test, build] | |
| runs-on: ubuntu-latest | |
| if: always() | |
| steps: | |
| - name: Check if all jobs succeeded | |
| run: | | |
| if [[ "${{ needs.code-quality.result }}" != "success" || | |
| "${{ needs.test.result }}" != "success" || | |
| "${{ needs.build.result }}" != "success" ]]; then | |
| echo "One or more jobs failed" | |
| exit 1 | |
| fi | |
| echo "All CI checks passed!" |