ci: fold website e2e and release comments into the unified PR report#12939
ci: fold website e2e and release comments into the unified PR report#12939christian-byrne wants to merge 6 commits into
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThe upsert action now retries concurrent updates and verifies section survival. The release-links action uses named sections and the shared upsert action. Remaining workflows switch to the unified report marker, and legacy cleanup removes the old marker. ChangesUnified PR Report Comment Migration
Estimated code review effort: 3 (Moderate) | ~20 minutes Sequence Diagram(s)sequenceDiagram
participant Workflow
participant UpsertCommentSection
participant GitHubAPI
participant PRReportComment
Workflow->>UpsertCommentSection: provide section name and content
UpsertCommentSection->>GitHubAPI: find or create unified report comment
UpsertCommentSection->>GitHubAPI: replace or append section
GitHubAPI->>PRReportComment: save updated body
UpsertCommentSection->>GitHubAPI: re-fetch and verify markers
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 6✅ Passed checks (6 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
🎭 Playwright: ✅ 1709 passed, 0 failed · 4 flaky📊 Browser Reports
📦 Bundle: 7.91 MB gzip ⚪ 0 BDetailsSummary
Category Glance App Entry Points — 47.3 kB (baseline 47.3 kB) • ⚪ 0 BMain entry bundles and manifests Status: 1 unchanged Graph Workspace — 1.25 MB (baseline 1.25 MB) • ⚪ 0 BGraph editor runtime, canvas, workflow orchestration Status: 1 unchanged Views & Navigation — 109 kB (baseline 109 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces Status: 14 unchanged Panels & Settings — 550 kB (baseline 550 kB) • ⚪ 0 BConfiguration panels, inspectors, and settings screens Status: 26 unchanged User & Accounts — 29.1 kB (baseline 29.1 kB) • ⚪ 0 BAuthentication, profile, and account management bundles Status: 10 unchanged Editors & Dialogs — 121 kB (baseline 121 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors Status: 6 unchanged UI Components — 56.8 kB (baseline 56.8 kB) • ⚪ 0 BReusable component library chunks Status: 13 unchanged Data & Services — 270 kB (baseline 270 kB) • ⚪ 0 BStores, services, APIs, and repositories Status: 16 unchanged Utilities & Hooks — 3.4 MB (baseline 3.4 MB) • ⚪ 0 BHelpers, composables, and utility bundles Status: 36 unchanged Vendor & Third-Party — 15.7 MB (baseline 15.7 MB) • ⚪ 0 BExternal libraries and shared vendor chunks Status: 16 unchanged Other — 11.9 MB (baseline 11.9 MB) • ⚪ 0 BBundles that do not match a named category Status: 163 unchanged ⚡ Performance Report
Show regressions
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-07-17T22:22:40.898Z",
"gitSha": "bca675569051062ed0c41b706f0f57d31bae6686",
"branch": "unify-website-release-comments",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2056.175000000053,
"styleRecalcs": 9,
"styleRecalcDurationMs": 6.676000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 480.76300000000003,
"heapDeltaBytes": -22764028,
"heapUsedBytes": 46213280,
"domNodes": -268,
"jsHeapTotalBytes": 19279872,
"scriptDurationMs": 22.805,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-idle",
"durationMs": 2044.2899999999895,
"styleRecalcs": 10,
"styleRecalcDurationMs": 7.991,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 483.87299999999993,
"heapDeltaBytes": -23400880,
"heapUsedBytes": 45596348,
"domNodes": -265,
"jsHeapTotalBytes": 19279872,
"scriptDurationMs": 26.894000000000002,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1716.6320000000042,
"styleRecalcs": 72,
"styleRecalcDurationMs": 30.608000000000004,
"layouts": 12,
"layoutDurationMs": 2.92,
"taskDurationMs": 644.694,
"heapDeltaBytes": -1755832,
"heapUsedBytes": 66878948,
"domNodes": 56,
"jsHeapTotalBytes": 20987904,
"scriptDurationMs": 97.64200000000001,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1763.9859999999885,
"styleRecalcs": 73,
"styleRecalcDurationMs": 33.594,
"layouts": 12,
"layoutDurationMs": 3.2419999999999995,
"taskDurationMs": 780.623,
"heapDeltaBytes": -16481312,
"heapUsedBytes": 52368484,
"domNodes": -265,
"jsHeapTotalBytes": 19279872,
"scriptDurationMs": 110.682,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1713.7650000000235,
"styleRecalcs": 31,
"styleRecalcDurationMs": 16.299,
"layouts": 6,
"layoutDurationMs": 0.6249999999999999,
"taskDurationMs": 319.59700000000004,
"heapDeltaBytes": 7598592,
"heapUsedBytes": 76559144,
"domNodes": 78,
"jsHeapTotalBytes": 19152896,
"scriptDurationMs": 23.639,
"eventListeners": 21,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1723.7519999999904,
"styleRecalcs": 30,
"styleRecalcDurationMs": 17.615,
"layouts": 6,
"layoutDurationMs": 0.5690000000000001,
"taskDurationMs": 291.042,
"heapDeltaBytes": 7070356,
"heapUsedBytes": 75951124,
"domNodes": 77,
"jsHeapTotalBytes": 19939328,
"scriptDurationMs": 20.225,
"eventListeners": 21,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "dom-widget-clipping",
"durationMs": 532.0919999999774,
"styleRecalcs": 12,
"styleRecalcDurationMs": 7.2379999999999995,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 318.996,
"heapDeltaBytes": -11887088,
"heapUsedBytes": 56940284,
"domNodes": 20,
"jsHeapTotalBytes": 20463616,
"scriptDurationMs": 48.762,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "dom-widget-clipping",
"durationMs": 545.4490000000192,
"styleRecalcs": 12,
"styleRecalcDurationMs": 7.108,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 321.386,
"heapDeltaBytes": -11571956,
"heapUsedBytes": 57104924,
"domNodes": 20,
"jsHeapTotalBytes": 20201472,
"scriptDurationMs": 50.67000000000001,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666682,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-idle",
"durationMs": 2022.0069999999737,
"styleRecalcs": 11,
"styleRecalcDurationMs": 9.437999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 578.1590000000001,
"heapDeltaBytes": 5345808,
"heapUsedBytes": 66541348,
"domNodes": -265,
"jsHeapTotalBytes": 4669440,
"scriptDurationMs": 91.408,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "large-graph-idle",
"durationMs": 2026.6899999999737,
"styleRecalcs": 9,
"styleRecalcDurationMs": 9.379,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 649.261,
"heapDeltaBytes": 5639000,
"heapUsedBytes": 64603296,
"domNodes": -266,
"jsHeapTotalBytes": 4145152,
"scriptDurationMs": 95.17,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2109.983999999997,
"styleRecalcs": 69,
"styleRecalcDurationMs": 15.137,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 984.3720000000001,
"heapDeltaBytes": 1271944,
"heapUsedBytes": 63516712,
"domNodes": -267,
"jsHeapTotalBytes": 4874240,
"scriptDurationMs": 318.29200000000003,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2095.9740000000124,
"styleRecalcs": 69,
"styleRecalcDurationMs": 16.135000000000005,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1028.381,
"heapDeltaBytes": 26228544,
"heapUsedBytes": 86441112,
"domNodes": -269,
"jsHeapTotalBytes": 5136384,
"scriptDurationMs": 343.15299999999996,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-zoom",
"durationMs": 3108.910999999978,
"styleRecalcs": 66,
"styleRecalcDurationMs": 15.36,
"layouts": 60,
"layoutDurationMs": 7.500000000000001,
"taskDurationMs": 1191.1190000000001,
"heapDeltaBytes": -7654744,
"heapUsedBytes": 54063308,
"domNodes": -268,
"jsHeapTotalBytes": 7553024,
"scriptDurationMs": 409.71200000000005,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "large-graph-zoom",
"durationMs": 3137.0959999999286,
"styleRecalcs": 66,
"styleRecalcDurationMs": 16.169999999999998,
"layouts": 60,
"layoutDurationMs": 7.568,
"taskDurationMs": 1242.269,
"heapDeltaBytes": -8520524,
"heapUsedBytes": 55428292,
"domNodes": -270,
"jsHeapTotalBytes": 8077312,
"scriptDurationMs": 439.876,
"eventListeners": -131,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "minimap-idle",
"durationMs": 2021.2750000000028,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.984000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 579.861,
"heapDeltaBytes": 5327916,
"heapUsedBytes": 66151584,
"domNodes": -266,
"jsHeapTotalBytes": 5455872,
"scriptDurationMs": 91.882,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "minimap-idle",
"durationMs": 1992.1319999999696,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.276999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 531.593,
"heapDeltaBytes": 5289812,
"heapUsedBytes": 66163884,
"domNodes": -267,
"jsHeapTotalBytes": 4931584,
"scriptDurationMs": 84.926,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 550.7579999999734,
"styleRecalcs": 47,
"styleRecalcDurationMs": 9.729999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 325.64200000000005,
"heapDeltaBytes": -11453636,
"heapUsedBytes": 57497628,
"domNodes": 20,
"jsHeapTotalBytes": 20987904,
"scriptDurationMs": 100.78200000000001,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 519.1010000000915,
"styleRecalcs": 49,
"styleRecalcDurationMs": 10.782000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 305.851,
"heapDeltaBytes": -11451724,
"heapUsedBytes": 57490188,
"domNodes": 24,
"jsHeapTotalBytes": 20463616,
"scriptDurationMs": 96.86699999999999,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000273
},
{
"name": "subgraph-idle",
"durationMs": 2022.81899999997,
"styleRecalcs": 10,
"styleRecalcDurationMs": 7.335000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 412.49,
"heapDeltaBytes": 3844856,
"heapUsedBytes": 72789200,
"domNodes": 20,
"jsHeapTotalBytes": 19939328,
"scriptDurationMs": 19.327,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-idle",
"durationMs": 1994.324000000006,
"styleRecalcs": 11,
"styleRecalcDurationMs": 9.883,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 463.70599999999996,
"heapDeltaBytes": -22040704,
"heapUsedBytes": 46883680,
"domNodes": -264,
"jsHeapTotalBytes": 20066304,
"scriptDurationMs": 20.769,
"eventListeners": -131,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1702.2309999999834,
"styleRecalcs": 76,
"styleRecalcDurationMs": 30.420999999999996,
"layouts": 16,
"layoutDurationMs": 3.688,
"taskDurationMs": 675.2249999999999,
"heapDeltaBytes": -21166656,
"heapUsedBytes": 47851748,
"domNodes": -267,
"jsHeapTotalBytes": 19017728,
"scriptDurationMs": 84.46100000000001,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1708.5340000000429,
"styleRecalcs": 77,
"styleRecalcDurationMs": 37.175,
"layouts": 16,
"layoutDurationMs": 4.535,
"taskDurationMs": 671.7850000000001,
"heapDeltaBytes": -5156040,
"heapUsedBytes": 63729840,
"domNodes": 63,
"jsHeapTotalBytes": 20725760,
"scriptDurationMs": 88.58099999999999,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-transition-enter",
"durationMs": 882.4700000000121,
"styleRecalcs": 19,
"styleRecalcDurationMs": 26.074999999999996,
"layouts": 15,
"layoutDurationMs": 10.598,
"taskDurationMs": 683.3530000000001,
"heapDeltaBytes": 27170316,
"heapUsedBytes": 97181396,
"domNodes": 13673,
"jsHeapTotalBytes": 15990784,
"scriptDurationMs": 25.141999999999996,
"eventListeners": 2369,
"totalBlockingTimeMs": 103,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "viewport-pan-sweep",
"durationMs": 8140.54699999997,
"styleRecalcs": 249,
"styleRecalcDurationMs": 40.311,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3499.4990000000003,
"heapDeltaBytes": 15354852,
"heapUsedBytes": 74270752,
"domNodes": -267,
"jsHeapTotalBytes": 7233536,
"scriptDurationMs": 1043.8780000000002,
"eventListeners": -113,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8155.479000000014,
"styleRecalcs": 249,
"styleRecalcDurationMs": 40.695,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3418.984,
"heapDeltaBytes": 15250976,
"heapUsedBytes": 74259544,
"domNodes": -268,
"jsHeapTotalBytes": 6709248,
"scriptDurationMs": 1041.7749999999999,
"eventListeners": -113,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.80000000000109
},
{
"name": "vue-large-graph-idle",
"durationMs": 11802.06899999996,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 11784.695000000002,
"heapDeltaBytes": -37515928,
"heapUsedBytes": 183124992,
"domNodes": -8311,
"jsHeapTotalBytes": -8327168,
"scriptDurationMs": 454.263,
"eventListeners": -16384,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.223333333333358,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 11609.909000000016,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 11593.311,
"heapDeltaBytes": -66085628,
"heapUsedBytes": 163861552,
"domNodes": -8311,
"jsHeapTotalBytes": -7802880,
"scriptDurationMs": 467.735,
"eventListeners": -16388,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.219999999999953,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 14180.465000000026,
"styleRecalcs": 66,
"styleRecalcDurationMs": 13.41500000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 14161.520999999999,
"heapDeltaBytes": -38294304,
"heapUsedBytes": 176705016,
"domNodes": -8311,
"jsHeapTotalBytes": -15228928,
"scriptDurationMs": 734.2109999999999,
"eventListeners": -16380,
"totalBlockingTimeMs": 49,
"frameDurationMs": 17.220000000000073,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 14018.204000000082,
"styleRecalcs": 65,
"styleRecalcDurationMs": 13.115000000000016,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 13995.617,
"heapDeltaBytes": -47219544,
"heapUsedBytes": 161243216,
"domNodes": -8311,
"jsHeapTotalBytes": -9900032,
"scriptDurationMs": 732.4190000000001,
"eventListeners": -16382,
"totalBlockingTimeMs": 6,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "workflow-execution",
"durationMs": 465.2060000000233,
"styleRecalcs": 14,
"styleRecalcDurationMs": 23.623,
"layouts": 3,
"layoutDurationMs": 1.447,
"taskDurationMs": 128.78699999999998,
"heapDeltaBytes": -16392824,
"heapUsedBytes": 51787744,
"domNodes": 130,
"jsHeapTotalBytes": 6569984,
"scriptDurationMs": 10.167,
"eventListeners": 65,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "workflow-execution",
"durationMs": 453.0040000000781,
"styleRecalcs": 18,
"styleRecalcDurationMs": 17.972,
"layouts": 3,
"layoutDurationMs": 1.054,
"taskDurationMs": 108.236,
"heapDeltaBytes": -16073164,
"heapUsedBytes": 51999772,
"domNodes": 143,
"jsHeapTotalBytes": 6569984,
"scriptDurationMs": 9.437999999999999,
"eventListeners": 65,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.799999999999727
}
]
} |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/actions/comment-release-links/action.yaml:
- Around line 104-111: The upsert-comment-section action in the
comment-release-links workflow at the step "Upsert release section into unified
report" uses a shared marker (<!-- COMFYUI_FRONTEND_PR_REPORT -->) that is now
targeted by multiple concurrent workflows, causing read-modify-write race
conditions where unrelated sections can be lost. Implement a solution by either:
(1) adding a concurrency strategy or locking mechanism at the workflow level to
serialize all writes to the same PR using the shared marker, or (2) modify the
upsert-comment-section action itself to be conflict-tolerant by implementing
retry logic with re-reading and merging instead of simple read-modify-write.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: c34fbe1a-df17-4c13-aed2-b7d005c7c058
📒 Files selected for processing (5)
.github/actions/comment-release-links/action.yaml.github/workflows/ci-website-e2e.yaml.github/workflows/pr-report.yaml.github/workflows/pr-update-website-screenshots.yaml.github/workflows/pr-vercel-website-preview.yaml
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## main #12939 +/- ##
==========================================
- Coverage 77.52% 77.34% -0.19%
==========================================
Files 1649 1687 +38
Lines 109395 115148 +5753
Branches 37655 38926 +1271
==========================================
+ Hits 84812 89058 +4246
- Misses 23715 25381 +1666
+ Partials 868 709 -159
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
…writers Several workflows now share one PR comment via read-modify-write, which the REST API can't do atomically. Re-read immediately before each write and verify our section plus every previously-present section survived; on a detected clobber, re-read and retry with backoff so concurrent writers converge instead of dropping each other's sections. Addresses review feedback: #12939 (comment)
|
✅ All contributors have signed the CLA. Thank you! This PR is ready to be merged. |
|
I have read and agree to the Contributor License Agreement |
Point the website e2e, preview, and screenshot-update sections at the shared COMFYUI_FRONTEND_PR_REPORT comment instead of the separate WEBSITE_CI_REPORT comment, and add WEBSITE_CI_REPORT to the legacy-comment cleanup so the old standalone website comment is removed. Addresses review feedback: #11935 (review)
Convert comment-release-links to upsert a release / desktop-release section into the shared COMFYUI_FRONTEND_PR_REPORT comment instead of posting a separate release-summary comment.
…writers Several workflows now share one PR comment via read-modify-write, which the REST API can't do atomically. Re-read immediately before each write and verify our section plus every previously-present section survived; on a detected clobber, re-read and retry with backoff so concurrent writers converge instead of dropping each other's sections. Addresses review feedback: #12939 (comment)
3e84c8f to
9a986bc
Compare
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/actions/comment-release-links/action.yaml:
- Around line 100-102: The composite action is already writing new_version to
GITHUB_OUTPUT, but it is not exposed through the action’s outputs definition.
Update the outputs block in action.yaml to include new_version alongside
prev_version so callers can reference steps.<id>.outputs.new_version; use the
existing output name consistently with the echo statements in the action’s main
script.
In @.github/actions/upsert-comment-section/action.yaml:
- Around line 102-107: The update path in the comment upsert flow is missing the
same retry resilience as the create path: `github.rest.issues.updateComment` is
called without a `try/catch`, so transient failures will abort immediately. Wrap
the `updateComment` call in the same retry/backoff handling used around
`createComment` in the action logic, and make sure the `existing`/`updated`
comment flow continues to retry on temporary errors instead of failing fast.
- Around line 96-112: The post-write verification in the comment upsert flow
only checks for section markers, so stale reads can still clobber concurrent
edits inside the section. Update the logic around the section update path in the
action’s comment handling to compare the full section block content (or a hash
of it) after `github.rest.issues.updateComment` and treat any mismatch as a
failed write. Use the existing `sectionStartsIn`, `sectionRegex`,
`sectionBlock`, and `findComment` flow to locate the check, and retry when the
returned comment body does not exactly match the expected block.
- Around line 82-94: The first-write path in the upsert comment action can still
create duplicate marker comments because `findComment()` and
`github.rest.issues.createComment()` are not protected against concurrent
callers. Update the logic in the action handler so the initial creation is
serialized across callers, or add a post-create deduplication step that removes
extra comments with the same marker. Keep the retry/update flow intact, but
ensure only one marker comment survives after concurrent first writes.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 54fba75d-83cf-4ac9-88b8-3eb40c27c288
📒 Files selected for processing (6)
.github/actions/comment-release-links/action.yaml.github/actions/upsert-comment-section/action.yaml.github/workflows/ci-website-e2e.yaml.github/workflows/pr-report.yaml.github/workflows/pr-update-website-screenshots.yaml.github/workflows/pr-vercel-website-preview.yaml
DrJKL
left a comment
There was a problem hiding this comment.
Batched review comments for the duplicate unified-comment creation concern.
| return github.rest.issues.createComment({ | ||
| if (!existing) { | ||
| try { | ||
| await github.rest.issues.createComment({ |
There was a problem hiding this comment.
Multiple callers can still create duplicate unified comments here. If two workflows both observe no existing COMFYUI_FRONTEND_PR_REPORT, both createComment calls can succeed and return because issue comments have no uniqueness constraint, splitting sections across separate comments. Re-read after creation and merge/delete duplicates, or serialize all writers on one PR-scoped concurrency key.
There was a problem hiding this comment.
✅ Fixed in 6eb3eeb. After createComment succeeds, we now re-read all PR comments and delete any other github-actions[bot] comments with the same marker, so concurrent first-writes converge to a single comment.
| return github.rest.issues.createComment({ | ||
| if (!existing) { | ||
| try { | ||
| await github.rest.issues.createComment({ |
There was a problem hiding this comment.
Multiple callers can still create duplicate unified comments here. If two workflows both observe no existing COMFYUI_FRONTEND_PR_REPORT, both createComment calls can succeed and return because issue comments have no uniqueness constraint, splitting sections across separate comments. Re-read after creation and merge/delete duplicates, or serialize all writers on one PR-scoped concurrency key.
There was a problem hiding this comment.
✅ Fixed in 6eb3eeb. After createComment succeeds, we now re-read all PR comments and delete any other github-actions[bot] comments with the same marker, so concurrent first-writes converge to a single comment.
Addresses review feedback: #12939 (comment)
After createComment succeeds, re-read all PR comments and delete any other github-actions[bot] comments containing the same marker. Closes the race where two callers both miss findComment() and each post a copy, splitting sections across separate comments. Addresses review feedback: #12939 (comment) #12939 (comment) #12939 (comment)
…aviour Transient failures (rate limit, 5xx, deleted comment) in updateComment previously aborted immediately. Now they re-enter the retry loop with the same backoff as the create path. Addresses review feedback: #12939 (comment)
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/actions/upsert-comment-section/action.yaml:
- Around line 89-109: Update the duplicate-handling flow around allComments and
duplicates to preserve content: select the lowest-ID marker comment as
canonical, merge all section blocks from competing comments into it, update and
verify that canonical body, then delete only confirmed duplicates. If merging or
verification fails, retry or leave duplicates intact rather than deleting
comments and losing sections; ensure concurrent writers cannot delete each
other’s content.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 0e4b8300-8609-4a0f-bf13-4fe78b11672f
📒 Files selected for processing (2)
.github/actions/comment-release-links/action.yaml.github/actions/upsert-comment-section/action.yaml
| // Concurrent writers may have also created a comment; deduplicate | ||
| // by keeping the lowest-id copy and deleting the rest. | ||
| const allComments = await github.paginate( | ||
| github.rest.issues.listComments, | ||
| { ...context.repo, issue_number: prNumber } | ||
| ) | ||
| const duplicates = allComments.filter( | ||
| (c) => | ||
| c.user?.login === 'github-actions[bot]' && | ||
| c.body?.includes(commentMarker) && | ||
| c.id !== created.data.id | ||
| ) | ||
| for (const dup of duplicates) { | ||
| try { | ||
| await github.rest.issues.deleteComment({ | ||
| ...context.repo, | ||
| comment_id: dup.id | ||
| }) | ||
| } catch (_) {} | ||
| } | ||
| return |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift
Merge duplicate bodies before deleting them.
This deletes every competing marker comment without preserving its sections—and despite the comment, retains the newly-created ID rather than the lowest ID. Concurrent first writes for e2e and release, for example, can delete one another’s sections; if both list before either deletion, each can even delete the other’s comment. Merge all section blocks into one canonical comment, verify it, then delete duplicates; otherwise retry/leave duplicates rather than lose report content.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.github/actions/upsert-comment-section/action.yaml around lines 89 - 109,
Update the duplicate-handling flow around allComments and duplicates to preserve
content: select the lowest-ID marker comment as canonical, merge all section
blocks from competing comments into it, update and verify that canonical body,
then delete only confirmed duplicates. If merging or verification fails, retry
or leave duplicates intact rather than deleting comments and losing sections;
ensure concurrent writers cannot delete each other’s content.
Follow-up to #11935. Folds the remaining standalone bot comments into the single unified PR report comment (
<!-- COMFYUI_FRONTEND_PR_REPORT -->).Changes
e2e,preview,screenshot-update) now upsert into the unified comment instead of a separate<!-- WEBSITE_CI_REPORT -->comment. AddedWEBSITE_CI_REPORTto the legacy-comment cleanup inpr-report.yamlso the old standalone comment is removed.comment-release-linksaction) now upserts arelease/desktop-releasesection into the unified comment instead of posting a separaterelease-summarycomment.Not included
pr-backport.yaml) are intentionally left as standalone comments: they@mentionthe author with conflict details that require manual action, and a unified-comment section is edited (not posted), so it would not trigger a notification. Folding them would regress that.Addresses the remaining items from this review:
#11935 (review)