name: CI on: push: branches: - main pull_request: types: [opened, synchronize, reopened] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true defaults: run: shell: bash jobs: test: # Why Mac and Windows? # I can't run electron playwright on ubuntu-latest and # Linux support for Dyad is experimental so not as important # as Mac + Windows strategy: fail-fast: false matrix: os: [ # npm install is very slow # { name: "windows-arm", image: "windows-11-arm" }, { name: "windows", image: "windows-latest" }, { name: "macos", image: "macos-latest" }, ] shard: [1, 2, 3, 4] shardTotal: [4] runs-on: ${{ matrix.os.image }} steps: - name: Checkout code uses: actions/checkout@v4 - name: Initialize environment uses: actions/setup-node@v4 with: node-version-file: package.json cache: npm cache-dependency-path: package-lock.json - name: Install node modules run: npm ci --no-audit --no-fund --progress=false - name: Presubmit check (e.g. lint, format) # do not run this on Windows (it fails and not necessary) # Only run on shard 1 to avoid redundant execution if: contains(matrix.os.name, 'macos') && matrix.shard == 1 run: npm run presubmit - name: Type-checking # do not run this on windows (it's redunant) # Only run on shard 1 to avoid redundant execution if: contains(matrix.os.name, 'macos') && matrix.shard == 1 run: npm run ts - name: Unit tests # do not run this on windows (it's redunant) # Only run on shard 1 to avoid redundant execution if: contains(matrix.os.name, 'macos') && matrix.shard == 1 run: npm run test - name: Setup pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 with: version: latest - name: Clone nextjs-template run: git clone --depth 1 https://github.com/dyad-sh/nextjs-template.git nextjs-template - name: Get pnpm store directory id: pnpm-cache shell: bash run: | echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - name: Setup pnpm cache uses: actions/cache@v4 with: path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} key: ${{ matrix.os.name }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | ${{ matrix.os.name }}-pnpm-store- # Not strictly needed but makes the e2e tests faster (and less flaky) - name: Install scaffold dependencies run: cd scaffold && pnpm install - name: Install nextjs-template dependencies run: cd nextjs-template && pnpm install - name: Install Chromium browser for Playwright run: npx playwright install chromium --with-deps - name: Build run: npm run pre:e2e - name: Prep test server run: cd testing/fake-llm-server && npm install && npm run build && cd - - name: E2E tests (Shard ${{ matrix.shard }}/4) # You can add debug logging to make it easier to see what's failing # by adding "DEBUG=pw:browser" in front. # Use blob reporter for sharding and merge capabilities run: DEBUG=pw:browser npx playwright test --shard=${{ matrix.shard }}/${{ matrix.shardTotal }} - name: Upload shard results uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: ${{ !cancelled() }} with: name: blob-report-${{ matrix.os.name }}-shard-${{ matrix.shard }} path: blob-report retention-days: 1 merge-reports: # Merge reports after playwright-tests, even if some shards have failed if: ${{ !cancelled() }} needs: [test] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: lts/* - name: Install dependencies run: npm ci --no-audit --no-fund --progress=false - name: Download blob reports from GitHub Actions Artifacts uses: actions/download-artifact@v4 with: path: all-blob-reports pattern: blob-report-* merge-multiple: true - name: Debug - List downloaded blob reports run: | echo "Contents of all-blob-reports directory:" ls -la all-blob-reports/ echo "File sizes and details:" find all-blob-reports/ -type f -exec ls -lh {} \; || echo "No files found" - name: Merge into HTML Report run: PLAYWRIGHT_HTML_OUTPUT_DIR=playwright-report npx playwright merge-reports --config=merge.config.ts ./all-blob-reports - name: Debug - List playwright-report contents run: | echo "Contents of playwright-report directory:" ls -la playwright-report/ || echo "playwright-report directory does not exist" echo "Current directory contents:" ls -la - name: Upload HTML report uses: actions/upload-artifact@v4 with: name: html-report--attempt-${{ github.run_attempt }} path: playwright-report retention-days: 3