[feat] split Playwright tests into 5 shards for parallel execution

- Split Playwright tests into 5 shards to reduce CI runtime from 17min to ~3-4min
- Each browser now runs tests in 5 parallel jobs (20 total jobs: 4 browsers × 5 shards)
- Updated test-ui.yaml workflow to use matrix strategy with sharding
- Added merge-reports job to consolidate test results
- Updated pr-playwright-deploy.yaml to handle sharded test reports
- Merge sharded reports before deploying to Cloudflare Pages

This change will significantly improve CI/CD performance by running tests in parallel,
matching the runtime of other workflows (~3-4 minutes).

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
snomiao
2025-09-02 05:22:11 +00:00
parent f215872e2e
commit 8fbcc98592
2 changed files with 78 additions and 13 deletions

View File

@@ -56,14 +56,39 @@ jobs:
fi
echo "branch=${{ fromJSON(steps.pr-info.outputs.result).sanitized_branch }}" >> $GITHUB_OUTPUT
- name: Download playwright report
- name: Install pnpm
if: fromJSON(steps.pr-info.outputs.result).number != null
uses: pnpm/action-setup@v4
with:
version: 10
- uses: actions/setup-node@v4
if: fromJSON(steps.pr-info.outputs.result).number != null
with:
node-version: lts/*
- name: Download playwright report shards
if: fromJSON(steps.pr-info.outputs.result).number != null
uses: actions/download-artifact@v4
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
run-id: ${{ github.event.workflow_run.id }}
name: playwright-report-${{ matrix.browser }}
path: playwright-report
pattern: playwright-report-${{ matrix.browser }}-shard-*
path: playwright-shards
- name: Install Playwright
if: fromJSON(steps.pr-info.outputs.result).number != null
run: npm install @playwright/test
- name: Merge reports
if: fromJSON(steps.pr-info.outputs.result).number != null
run: |
npx playwright merge-reports --reporter html ./playwright-shards
mv playwright-report merged-report
- name: Rename merged report
if: fromJSON(steps.pr-info.outputs.result).number != null
run: mv merged-report playwright-report
- name: Install Wrangler
if: fromJSON(steps.pr-info.outputs.result).number != null
@@ -78,14 +103,20 @@ jobs:
RETRY_COUNT=0
MAX_RETRIES=3
SUCCESS=false
DEPLOYMENT_URL=""
while [ $RETRY_COUNT -lt $MAX_RETRIES ] && [ $SUCCESS = false ]; do
RETRY_COUNT=$((RETRY_COUNT + 1))
echo "Deployment attempt $RETRY_COUNT of $MAX_RETRIES..."
if npx wrangler pages deploy playwright-report --project-name=${{ steps.project-name.outputs.name }} --branch=${{ steps.project-name.outputs.branch }}; then
OUTPUT=$(npx wrangler pages deploy playwright-report --project-name=${{ steps.project-name.outputs.name }} --branch=${{ steps.project-name.outputs.branch }} 2>&1)
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
SUCCESS=true
DEPLOYMENT_URL=$(echo "$OUTPUT" | grep -oE 'https://[^ ]+\.pages\.dev' | head -1)
echo "Deployment successful on attempt $RETRY_COUNT"
echo "URL: $DEPLOYMENT_URL"
else
echo "Deployment failed on attempt $RETRY_COUNT"
if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then
@@ -99,10 +130,25 @@ jobs:
echo "All deployment attempts failed"
exit 1
fi
echo "deployment_url=$DEPLOYMENT_URL" >> $GITHUB_OUTPUT
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
- name: Save deployment info
if: fromJSON(steps.pr-info.outputs.result).number != null
run: |
echo "${{ matrix.browser }}|${{ steps.cloudflare-deploy.outcome == 'success' && '0' || '1' }}|${{ steps.cloudflare-deploy.outputs.deployment_url || '#' }}" > deployment-info-${{ matrix.browser }}.txt
- name: Upload deployment info
if: fromJSON(steps.pr-info.outputs.result).number != null
uses: actions/upload-artifact@v4
with:
name: deployment-info-${{ matrix.browser }}
path: deployment-info-${{ matrix.browser }}.txt
retention-days: 1
comment-tests-starting:
runs-on: ubuntu-latest
if: github.repository == 'Comfy-Org/ComfyUI_frontend' && github.event.workflow_run.event == 'pull_request' && github.event.action == 'requested'
@@ -144,14 +190,14 @@ jobs:
echo "" >> comment.md
echo "⏰ Started at: ${{ steps.completion-time.outputs.time }} UTC" >> comment.md
echo "" >> comment.md
echo "### 🚀 Running Tests" >> comment.md
echo "- 🧪 **chromium**: Running tests..." >> comment.md
echo "- 🧪 **chromium-0.5x**: Running tests..." >> comment.md
echo "- 🧪 **chromium-2x**: Running tests..." >> comment.md
echo "- 🧪 **mobile-chrome**: Running tests..." >> comment.md
echo "### 🚀 Running Tests (5 parallel shards per browser)" >> comment.md
echo "- 🧪 **chromium**: Running tests in 5 shards..." >> comment.md
echo "- 🧪 **chromium-0.5x**: Running tests in 5 shards..." >> comment.md
echo "- 🧪 **chromium-2x**: Running tests in 5 shards..." >> comment.md
echo "- 🧪 **mobile-chrome**: Running tests in 5 shards..." >> comment.md
echo "" >> comment.md
echo "---" >> comment.md
echo "⏱️ Please wait while tests are running across all browsers..." >> comment.md
echo "⏱️ Tests are running in parallel across 20 jobs (4 browsers × 5 shards)..." >> comment.md
- name: Comment PR - Tests Started
if: steps.pr.outputs.result != 'null'

View File

@@ -84,6 +84,7 @@ jobs:
fail-fast: false
matrix:
browser: [chromium, chromium-2x, chromium-0.5x, mobile-chrome]
shard: [1, 2, 3, 4, 5]
steps:
- name: Wait for cache propagation
run: sleep 10
@@ -135,15 +136,33 @@ jobs:
run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend
- name: Run Playwright tests (${{ matrix.browser }})
- name: Run Playwright tests (${{ matrix.browser }}, shard ${{ matrix.shard }}/5)
id: playwright
run: npx playwright test --project=${{ matrix.browser }} --reporter=html
run: npx playwright test --project=${{ matrix.browser }} --shard=${{ matrix.shard }}/5
working-directory: ComfyUI_frontend
- uses: actions/upload-artifact@v4
if: always() # note: use always() to allow results to be upload/report even tests failed.
with:
name: playwright-report-${{ matrix.browser }}
name: playwright-report-${{ matrix.browser }}-shard-${{ matrix.shard }}
path: ComfyUI_frontend/playwright-report/
retention-days: 30
merge-reports:
needs: playwright-tests
if: always()
runs-on: ubuntu-latest
steps:
- name: Download all workflow artifacts
uses: actions/download-artifact@v4
with:
pattern: playwright-report-*
path: all-reports/
- name: Upload merged report
uses: actions/upload-artifact@v4
with:
name: playwright-report-merged
path: all-reports/
retention-days: 30