mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-07-17 01:07:56 +00:00
## Summary
> [!NOTE]
> Bumping to [24
shards](https://github.com/Comfy-Org/ComfyUI_frontend/pull/13664)
reduces time from 11m14s to 9m31s, but costs 15% more in GitHub Action
runner time. Keep it 16 for now to be conservative and bump to 24 if it
works well for a week
Split Chromium E2E into 16 shards with two Playwright workers each,
preserving the current per-runner worker density while doubling
effective concurrency.
### 16 shards
| Run | E2E time | Shards |
|---|---:|---:|
|
[1](https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/29370163062)
| 11m38s | 16/16 pass |
|
[2](https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/29371313957)
| 11m32s | 16/16 pass |
|
[3](https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/29372283949)
| 10m50s | 16/16 pass |
|
[4](https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/29373163198)
| 11m00s | 16/16 pass |
|
[5](https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/29374055787)
| 11m12s | 16/16 pass |
### 24 shards
| Run | E2E time | Shards |
|---|---:|---:|
|
[1](https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/29379798083)
| 9m13s | 24/24 pass |
|
[2](https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/29380286857)
| 9m33s | 24/24 pass |
|
[3](https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/29380761689)
| 9m38s | 24/24 pass |
|
[4](https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/29381219308)
| 10m02s | 24/24 pass |
|
[5](https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/29381669526)
| 9m07s | 24/24 pass |
## Changes
- **What**: Run Chromium as 16 shards with explicit `--workers=2`.
## Review Focus
- Compare full E2E time, shard skew, runner queue time, and flakiness
with the 8×2 baseline.
## Validation
- YAML parse and oxfmt check
- Pre-commit formatting, linting, and root typecheck
- Pre-push Knip
- Local CodeRabbit review is rate-limited for 24 minutes; server-side
CodeRabbit remains pending.
Created by Codex
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> **Low Risk**
> Changes are limited to CI workflow and Playwright config; no
application runtime, auth, or data paths are touched.
>
> **Overview**
> **Chromium E2E CI** now runs as **16 parallel shards** (up from 8),
with **`workers: 2` on CI** in `playwright.config.ts` so each runner
keeps two Playwright workers while overall concurrency doubles.
>
> Reporter wiring shifts so **blob output is chosen in config** when
`PLAYWRIGHT_BLOB_OUTPUT_DIR` is set (default reporter is `html`
otherwise); workflow steps drop inline `--reporter=blob` from the
Playwright CLI for both sharded Chromium and the other browser matrix
jobs.
>
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
3707e70611. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
---------
Co-authored-by: huang47 <157390+huang47@users.noreply.github.com>
309 lines
10 KiB
YAML
309 lines
10 KiB
YAML
# Description: End-to-end testing with Playwright across multiple browsers, deploys test reports to Cloudflare Pages
|
|
name: 'CI: Tests E2E'
|
|
|
|
on:
|
|
push:
|
|
branches: [main, master, core/*, desktop/*]
|
|
pull_request:
|
|
branches-ignore: [wip/*, draft/*, temp/*]
|
|
merge_group:
|
|
workflow_dispatch:
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
changes:
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: read
|
|
outputs:
|
|
should-run: ${{ steps.changes.outputs.should-run }}
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
- id: changes
|
|
uses: ./.github/actions/changes-filter
|
|
|
|
setup:
|
|
needs: changes
|
|
if: ${{ needs.changes.outputs.should-run == 'true' }}
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v6
|
|
- name: Setup frontend
|
|
uses: ./.github/actions/setup-frontend
|
|
with:
|
|
include_build_step: true
|
|
|
|
# Upload only built dist/ (containerized test jobs will pnpm install without cache)
|
|
- name: Upload built frontend
|
|
uses: actions/upload-artifact@v6
|
|
with:
|
|
name: frontend-dist
|
|
path: dist/
|
|
retention-days: 1
|
|
|
|
- name: Build cloud frontend
|
|
run: pnpm build:cloud
|
|
env:
|
|
VITE_USE_LEGACY_DEFAULT_GRAPH: 'true'
|
|
|
|
- name: Upload cloud frontend
|
|
uses: actions/upload-artifact@v6
|
|
with:
|
|
name: frontend-dist-cloud
|
|
path: dist/
|
|
retention-days: 1
|
|
|
|
# Sharded chromium tests
|
|
playwright-tests-chromium-sharded:
|
|
needs: setup
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 60
|
|
container:
|
|
image: ghcr.io/comfy-org/comfyui-ci-container:0.0.17
|
|
credentials:
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
permissions:
|
|
contents: read
|
|
packages: read
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
shardIndex: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
|
|
shardTotal: [16]
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v6
|
|
- name: Download built frontend
|
|
uses: actions/download-artifact@v7
|
|
with:
|
|
name: frontend-dist
|
|
path: dist/
|
|
|
|
- name: Start ComfyUI server
|
|
uses: ./.github/actions/start-comfyui-server
|
|
|
|
- name: Install frontend deps
|
|
run: pnpm install --frozen-lockfile
|
|
|
|
# Run sharded tests (browsers pre-installed in container)
|
|
- name: Run Playwright tests (Shard ${{ matrix.shardIndex }}/${{ matrix.shardTotal }})
|
|
id: playwright
|
|
run: pnpm exec playwright test --project=chromium --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
|
|
env:
|
|
PLAYWRIGHT_BLOB_OUTPUT_DIR: ./blob-report
|
|
COLLECT_COVERAGE: 'true'
|
|
|
|
- name: Upload blob report
|
|
uses: actions/upload-artifact@v6
|
|
if: ${{ !cancelled() }}
|
|
with:
|
|
name: blob-report-chromium-${{ matrix.shardIndex }}
|
|
path: blob-report/
|
|
retention-days: 1
|
|
|
|
- name: Upload shard coverage data
|
|
if: always()
|
|
uses: actions/upload-artifact@v6
|
|
with:
|
|
name: e2e-coverage-shard-${{ matrix.shardIndex }}
|
|
path: coverage/playwright/
|
|
retention-days: 1
|
|
if-no-files-found: warn
|
|
|
|
playwright-tests:
|
|
# Ideally, each shard runs test in 6 minutes, but allow up to 15 minutes
|
|
timeout-minutes: 15
|
|
needs: setup
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
image: ghcr.io/comfy-org/comfyui-ci-container:0.0.17
|
|
credentials:
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
permissions:
|
|
contents: read
|
|
packages: read
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
browser: [chromium-2x, chromium-0.5x, mobile-chrome, cloud]
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v6
|
|
- name: Download built frontend
|
|
uses: actions/download-artifact@v7
|
|
with:
|
|
name: ${{ matrix.browser == 'cloud' && 'frontend-dist-cloud' || 'frontend-dist' }}
|
|
path: dist/
|
|
|
|
- name: Start ComfyUI server
|
|
uses: ./.github/actions/start-comfyui-server
|
|
|
|
- name: Install frontend deps
|
|
run: pnpm install --frozen-lockfile
|
|
|
|
# Run tests (browsers pre-installed in container)
|
|
- name: Run Playwright tests (${{ matrix.browser }})
|
|
id: playwright
|
|
run: pnpm exec playwright test --project=${{ matrix.browser }}
|
|
env:
|
|
PLAYWRIGHT_BLOB_OUTPUT_DIR: ./blob-report
|
|
|
|
- name: Generate HTML and JSON reports
|
|
if: always()
|
|
run: |
|
|
# Generate HTML report from blob
|
|
pnpm exec playwright merge-reports --reporter=html ./blob-report
|
|
# Generate JSON report separately with explicit output path
|
|
PLAYWRIGHT_JSON_OUTPUT_NAME=playwright-report/report.json \
|
|
pnpm exec playwright merge-reports --reporter=json ./blob-report
|
|
|
|
- name: Upload Playwright report
|
|
uses: actions/upload-artifact@v6
|
|
if: always()
|
|
with:
|
|
name: playwright-report-${{ matrix.browser }}
|
|
path: ./playwright-report/
|
|
retention-days: 30
|
|
|
|
# Merge sharded test reports (no container needed - only runs CLI)
|
|
merge-reports:
|
|
needs: [changes, playwright-tests-chromium-sharded]
|
|
runs-on: ubuntu-latest
|
|
if: ${{ !cancelled() && needs.changes.outputs.should-run == 'true' }}
|
|
steps:
|
|
- name: Install pnpm
|
|
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0
|
|
with:
|
|
version: 10
|
|
|
|
- name: Download blob reports
|
|
uses: actions/download-artifact@v7
|
|
with:
|
|
path: ./all-blob-reports
|
|
pattern: blob-report-chromium-*
|
|
merge-multiple: true
|
|
|
|
- name: Merge into HTML Report
|
|
run: |
|
|
# Generate HTML report
|
|
pnpm dlx @playwright/test merge-reports --reporter=html ./all-blob-reports
|
|
# Generate JSON report separately with explicit output path
|
|
PLAYWRIGHT_JSON_OUTPUT_NAME=playwright-report/report.json \
|
|
pnpm dlx @playwright/test merge-reports --reporter=json ./all-blob-reports
|
|
|
|
- name: Upload HTML report
|
|
uses: actions/upload-artifact@v6
|
|
with:
|
|
name: playwright-report-chromium
|
|
path: ./playwright-report/
|
|
retention-days: 30
|
|
|
|
# Gate job — single required check that passes whether the matrix ran or was
|
|
# skipped. Branch rulesets require this instead of the individual matrix-
|
|
# expanded check names so PRs with no e2e-relevant changes aren't stuck.
|
|
e2e-status:
|
|
if: ${{ always() }}
|
|
needs: [changes, playwright-tests-chromium-sharded, playwright-tests]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Check E2E results
|
|
env:
|
|
SHOULD_RUN: ${{ needs.changes.outputs.should-run }}
|
|
SHARDED: ${{ needs.playwright-tests-chromium-sharded.result }}
|
|
BROWSERS: ${{ needs.playwright-tests.result }}
|
|
run: |
|
|
[[ "$SHOULD_RUN" != "true" ]] && echo "E2E skipped" && exit 0
|
|
[[ "$SHARDED" != "success" || "$BROWSERS" != "success" ]] && echo "E2E failed" && exit 1
|
|
echo "E2E passed"
|
|
|
|
#### BEGIN Deployment and commenting (non-forked PRs only)
|
|
# when using pull_request event, we have permission to comment directly
|
|
# if its a forked repo, we need to use workflow_run event in a separate workflow (pr-playwright-deploy.yaml)
|
|
|
|
# Post starting section into the unified PR report comment for non-forked PRs
|
|
comment-on-pr-start:
|
|
needs: changes
|
|
runs-on: ubuntu-latest
|
|
if: >-
|
|
${{
|
|
needs.changes.outputs.should-run == 'true' &&
|
|
github.event_name == 'pull_request' &&
|
|
github.event.pull_request.head.repo.fork == false
|
|
}}
|
|
permissions:
|
|
pull-requests: write
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v6
|
|
|
|
- name: Upsert playwright starting section into unified report
|
|
uses: ./.github/actions/upsert-comment-section
|
|
with:
|
|
pr-number: ${{ github.event.pull_request.number }}
|
|
section-name: playwright
|
|
section-content: '## 🎭 Playwright: ⏳ Running...'
|
|
comment-marker: '<!-- COMFYUI_FRONTEND_PR_REPORT -->'
|
|
token: ${{ github.token }}
|
|
|
|
# Deploy and upsert final playwright section for non-forked PRs only
|
|
deploy-and-comment:
|
|
needs: [changes, playwright-tests, merge-reports]
|
|
runs-on: ubuntu-latest
|
|
if: >-
|
|
${{
|
|
always() &&
|
|
needs.changes.outputs.should-run == 'true' &&
|
|
github.event_name == 'pull_request' &&
|
|
github.event.pull_request.head.repo.fork == false
|
|
}}
|
|
permissions:
|
|
pull-requests: write
|
|
contents: read
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v6
|
|
|
|
- name: Download all playwright reports
|
|
uses: actions/download-artifact@v7
|
|
with:
|
|
pattern: playwright-report-*
|
|
path: reports
|
|
|
|
- name: Deploy reports and generate section
|
|
env:
|
|
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
|
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
|
GITHUB_TOKEN: ${{ github.token }}
|
|
GITHUB_SHA: ${{ github.event.pull_request.head.sha }}
|
|
SUMMARY_FILE: playwright-section.md
|
|
BRANCH_NAME: ${{ github.head_ref }}
|
|
run: |
|
|
bash ./scripts/cicd/pr-playwright-deploy-and-comment.sh \
|
|
"${{ github.event.pull_request.number }}" \
|
|
"$BRANCH_NAME" \
|
|
"completed"
|
|
|
|
- name: Read playwright section
|
|
id: section
|
|
if: ${{ !cancelled() && hashFiles('playwright-section.md') != '' }}
|
|
uses: juliangruber/read-file-action@b549046febe0fe86f8cb4f93c24e284433f9ab58 # v1.1.7
|
|
with:
|
|
path: playwright-section.md
|
|
|
|
- name: Upsert playwright section into unified report
|
|
if: ${{ !cancelled() && steps.section.outputs.content != '' }}
|
|
uses: ./.github/actions/upsert-comment-section
|
|
with:
|
|
pr-number: ${{ github.event.pull_request.number }}
|
|
section-name: playwright
|
|
section-content: ${{ steps.section.outputs.content }}
|
|
comment-marker: '<!-- COMFYUI_FRONTEND_PR_REPORT -->'
|
|
token: ${{ github.token }}
|
|
#### END Deployment and commenting (non-forked PRs only)
|