mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-07-15 03:37:48 +00:00
## Summary - Merges the separate Playwright and Storybook bot comments into the existing `<!-- COMFYUI_FRONTEND_PR_REPORT -->` unified comment, using named sections via `upsert-comment-section` - Each workflow independently upserts its own section without clobbering others - `pr-report.yaml` cleans up legacy `<!-- PLAYWRIGHT_TEST_STATUS -->` and `<!-- STORYBOOK_BUILD_STATUS -->` comments on first run - Perf report: collapses detailed metric tables in `<details>` by default — only headline FPS/TBT/heap summary and a brief regression count are visible inline ## Before → After **Before:** 4–5 separate bot comments per PR (Playwright, Storybook, Bundle/Perf/Coverage, Chromatic URLs) + CodeRabbit + Codecov **After:** 1 unified comment with collapsible sections: ``` <!-- COMFYUI_FRONTEND_PR_REPORT --> <!-- section:playwright:start --> ... <!-- section:playwright:end --> <!-- section:storybook:start --> ... <!-- section:storybook:end --> <!-- section:ci-metrics:start --> ... <!-- section:ci-metrics:end --> <!-- section:chromatic:start --> ... <!-- section:chromatic:end --> ``` (CodeRabbit and Codecov are external and can't be merged) ## How it works `upsert-comment-section` already existed for the website CI comment. This PR extends that pattern to the main PR report comment: 1. **Playwright** — shell script writes to `SUMMARY_FILE` when set, CI workflow uses `upsert-comment-section` with `section-name: playwright` 2. **Storybook** — same pattern, `section-name: storybook` 3. **Bundle/Perf/Coverage** — `pr-report.yaml` now also uses `upsert-comment-section` instead of replacing the whole comment, `section-name: ci-metrics` 4. **Chromatic** — `section-name: chromatic`, no script change needed Both fork and non-fork PR paths updated. ## Perf report noise fix Previously the full per-metric regression table was shown inline. Now: - **Visible:** headline summary (avg FPS, P5 FPS, TBT, heap per test) + "⚠️ N regressions detected" count - **Collapsed by default:** regression detail table, all-metrics table, historical variance, trend data ## Test plan - [ ] Open a PR with frontend changes — confirm single unified bot comment appears - [ ] Confirm Playwright section appears with ⏳ then updates to results - [ ] Confirm Storybook section appears only when storybook-relevant files change - [ ] Confirm legacy standalone Playwright/Storybook comments are deleted by `pr-report.yaml` - [ ] Confirm perf report shows headline only, details collapsed - [ ] Test with a fork PR — confirm fork path also works 🤖 Generated with [Claude Code](https://claude.ai/claude-code) ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-11935-ci-consolidate-PR-bot-comments-into-one-unified-comment-3566d73d36508173964cdf596cfae1f8) by [Unito](https://www.unito.io) --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Connor Byrne <c.byrne@comfy.org> Co-authored-by: Alexander Brown <drjkl@comfy.org>
181 lines
6.6 KiB
YAML
181 lines
6.6 KiB
YAML
name: 'PR: Unified Report'
|
|
|
|
on:
|
|
workflow_run:
|
|
workflows: ['CI: Size Data', 'CI: Performance Report', 'CI: E2E Coverage']
|
|
types:
|
|
- completed
|
|
branches-ignore:
|
|
- main
|
|
|
|
permissions:
|
|
contents: read
|
|
pull-requests: write
|
|
issues: write
|
|
actions: read
|
|
|
|
concurrency:
|
|
group: pr-report-${{ github.event.workflow_run.head_sha }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
comment:
|
|
runs-on: ubuntu-latest
|
|
if: >
|
|
github.repository == 'Comfy-Org/ComfyUI_frontend' &&
|
|
github.event.workflow_run.event == 'pull_request'
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
|
|
- name: Setup frontend
|
|
uses: ./.github/actions/setup-frontend
|
|
|
|
- name: Resolve PR from workflow_run context
|
|
id: pr-meta
|
|
uses: ./.github/actions/resolve-pr-from-workflow-run
|
|
|
|
- name: Find size workflow run
|
|
if: steps.pr-meta.outputs.skip != 'true'
|
|
id: find-size
|
|
uses: ./.github/actions/find-workflow-run
|
|
with:
|
|
workflow-id: ci-size-data.yaml
|
|
head-sha: ${{ steps.pr-meta.outputs.head-sha }}
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Find perf workflow run
|
|
if: steps.pr-meta.outputs.skip != 'true'
|
|
id: find-perf
|
|
uses: ./.github/actions/find-workflow-run
|
|
with:
|
|
workflow-id: ci-perf-report.yaml
|
|
head-sha: ${{ steps.pr-meta.outputs.head-sha }}
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Download size data (current)
|
|
if: steps.pr-meta.outputs.skip != 'true' && steps.find-size.outputs.status == 'ready'
|
|
uses: dawidd6/action-download-artifact@0bd50d53a6d7fb5cb921e607957e9cc12b4ce392 # v12
|
|
with:
|
|
name: size-data
|
|
run_id: ${{ steps.find-size.outputs.run-id }}
|
|
path: temp/size
|
|
|
|
- name: Download size baseline
|
|
if: steps.pr-meta.outputs.skip != 'true' && steps.find-size.outputs.status == 'ready'
|
|
uses: dawidd6/action-download-artifact@0bd50d53a6d7fb5cb921e607957e9cc12b4ce392 # v12
|
|
with:
|
|
branch: ${{ steps.pr-meta.outputs.base }}
|
|
workflow: ci-size-data.yaml
|
|
event: push
|
|
name: size-data
|
|
path: temp/size-prev
|
|
if_no_artifact_found: warn
|
|
|
|
- name: Find coverage workflow run
|
|
if: steps.pr-meta.outputs.skip != 'true'
|
|
id: find-coverage
|
|
uses: ./.github/actions/find-workflow-run
|
|
with:
|
|
workflow-id: ci-tests-e2e-coverage.yaml
|
|
head-sha: ${{ steps.pr-meta.outputs.head-sha }}
|
|
not-found-status: skip
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Download coverage data
|
|
if: steps.pr-meta.outputs.skip != 'true' && steps.find-coverage.outputs.status == 'ready'
|
|
uses: dawidd6/action-download-artifact@0bd50d53a6d7fb5cb921e607957e9cc12b4ce392 # v12
|
|
with:
|
|
name: e2e-coverage
|
|
run_id: ${{ steps.find-coverage.outputs.run-id }}
|
|
path: temp/coverage
|
|
if_no_artifact_found: warn
|
|
|
|
- name: Download perf metrics (current)
|
|
if: steps.pr-meta.outputs.skip != 'true' && steps.find-perf.outputs.status == 'ready'
|
|
uses: dawidd6/action-download-artifact@0bd50d53a6d7fb5cb921e607957e9cc12b4ce392 # v12
|
|
with:
|
|
name: perf-metrics
|
|
run_id: ${{ steps.find-perf.outputs.run-id }}
|
|
path: test-results/
|
|
|
|
- name: Download perf baseline
|
|
if: steps.pr-meta.outputs.skip != 'true' && steps.find-perf.outputs.status == 'ready'
|
|
uses: dawidd6/action-download-artifact@0bd50d53a6d7fb5cb921e607957e9cc12b4ce392 # v12
|
|
with:
|
|
branch: ${{ steps.pr-meta.outputs.base }}
|
|
workflow: ci-perf-report.yaml
|
|
event: push
|
|
name: perf-metrics
|
|
path: temp/perf-baseline/
|
|
if_no_artifact_found: warn
|
|
|
|
- name: Download perf history from perf-data branch
|
|
if: steps.pr-meta.outputs.skip != 'true' && steps.find-perf.outputs.status == 'ready'
|
|
continue-on-error: true
|
|
run: |
|
|
if git ls-remote --exit-code origin perf-data >/dev/null 2>&1; then
|
|
git fetch origin perf-data --depth=1
|
|
mkdir -p temp/perf-history
|
|
for file in $(git ls-tree --name-only origin/perf-data baselines/ 2>/dev/null | sort -r | head -15); do
|
|
git show "origin/perf-data:${file}" > "temp/perf-history/$(basename "$file")" 2>/dev/null || true
|
|
done
|
|
echo "Loaded $(ls temp/perf-history/*.json 2>/dev/null | wc -l) historical baselines"
|
|
fi
|
|
|
|
- name: Generate unified report
|
|
if: steps.pr-meta.outputs.skip != 'true'
|
|
run: >
|
|
pnpm exec tsx scripts/unified-report.ts
|
|
--size-status=${{ steps.find-size.outputs.status }}
|
|
--perf-status=${{ steps.find-perf.outputs.status }}
|
|
--coverage-status=${{ steps.find-coverage.outputs.status }}
|
|
> pr-report.md
|
|
|
|
- name: Remove legacy separate comments
|
|
if: steps.pr-meta.outputs.skip != 'true'
|
|
uses: actions/github-script@v8
|
|
with:
|
|
script: |
|
|
const prNumber = Number('${{ steps.pr-meta.outputs.number }}');
|
|
const legacyMarkers = [
|
|
'<!-- COMFYUI_FRONTEND_SIZE -->',
|
|
'<!-- COMFYUI_FRONTEND_PERF -->',
|
|
'<!-- PLAYWRIGHT_TEST_STATUS -->',
|
|
'<!-- STORYBOOK_BUILD_STATUS -->',
|
|
];
|
|
|
|
const comments = await github.paginate(github.rest.issues.listComments, {
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
issue_number: prNumber,
|
|
per_page: 100,
|
|
});
|
|
|
|
for (const comment of comments) {
|
|
if (legacyMarkers.some(m => comment.body?.includes(m))) {
|
|
await github.rest.issues.deleteComment({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
comment_id: comment.id,
|
|
});
|
|
core.info(`Deleted legacy comment ${comment.id}`);
|
|
}
|
|
}
|
|
|
|
- name: Read PR report
|
|
id: report
|
|
if: steps.pr-meta.outputs.skip != 'true'
|
|
uses: juliangruber/read-file-action@b549046febe0fe86f8cb4f93c24e284433f9ab58 # v1.1.7
|
|
with:
|
|
path: ./pr-report.md
|
|
|
|
- name: Upsert bundle/perf/coverage section into unified report
|
|
if: steps.pr-meta.outputs.skip != 'true'
|
|
uses: ./.github/actions/upsert-comment-section
|
|
with:
|
|
pr-number: ${{ steps.pr-meta.outputs.number }}
|
|
section-name: ci-metrics
|
|
section-content: ${{ steps.report.outputs.content }}
|
|
comment-marker: '<!-- COMFYUI_FRONTEND_PR_REPORT -->'
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|