Skip to content

fix: run E2E tests after i18n completes on release PRs#8111

Closed
Myestery wants to merge 6 commits intomainfrom
fix/e2e-release-workflow-v2
Closed

fix: run E2E tests after i18n completes on release PRs#8111
Myestery wants to merge 6 commits intomainfrom
fix/e2e-release-workflow-v2

Conversation

@Myestery
Copy link
Contributor

@Myestery Myestery commented Jan 16, 2026

Summary

  • Adds workflow_run trigger to run E2E tests after i18n workflow completes on version-bump PRs
  • Skips E2E tests on pull_request trigger for version-bump branches to avoid cancellation by i18n commits
  • Updates checkout refs and PR comment jobs to handle workflow_run events

Problem

When a version-bump PR is created, both E2E tests and i18n workflow trigger simultaneously. The i18n workflow commits locale updates after ~5-8 minutes, which triggers a new E2E run that cancels the in-progress tests due to cancel-in-progress: true.

Solution

Skip E2E on pull_request for version-bump PRs, run via workflow_run after i18n completes instead.

Test plan

  • Verify regular PRs still run E2E tests normally
  • Verify version-bump PRs skip E2E on initial trigger
  • Verify E2E runs after i18n workflow completes on version-bump PRs

┆Issue is synchronized with this Notion page by Unito

- Add workflow_run trigger for 'i18n: Update Core' workflow
- Skip version-bump PRs on pull_request trigger
- Run E2E tests via workflow_run after i18n completes
- Update checkout refs and PR commenting for workflow_run events
@Myestery Myestery requested a review from a team as a code owner January 16, 2026 20:47
@dosubot dosubot bot added the size:M This PR changes 30-99 lines, ignoring generated files. label Jan 16, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 16, 2026

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

📝 Walkthrough

Walkthrough

Adds a workflow_run trigger and a new get-pr-info job to resolve PR number and branch for workflow_run and pull_request contexts; pins checkouts to the resolved head branch; and threads PR_NUMBER, BRANCH, START_TIME, and fallback GITHUB_SHA into comment and deploy steps.

Changes

Cohort / File(s) Summary
CI E2E Workflow
.github/workflows/ci-tests-e2e.yaml
Added workflow_run trigger and extended branches-ignore for version-bump PRs; recomposed concurrency to prefer `workflow_run.head_branch

Sequence Diagram(s)

sequenceDiagram
    participant I18n as I18n Workflow
    participant E2E as CI E2E Workflow
    participant API as GitHub REST API
    participant Runner as Job Runner / Scripts

    rect rgba(200,200,255,0.5)
    I18n->>E2E: emit workflow_run (completed)
    end

    rect rgba(200,255,200,0.5)
    E2E->>E2E: compute concurrency (workflow_run.head_branch || github.ref)
    E2E->>API: query PRs / gh pr view to resolve PR number & branch
    API-->>E2E: return PR number and branch
    end

    rect rgba(255,200,200,0.5)
    E2E->>Runner: checkout using resolved branch / fallback SHA
    Runner->>Runner: set outputs/env PR_NUMBER, BRANCH, GITHUB_SHA, START_TIME
    Runner->>Runner: run pr-playwright-deploy-and-comment.sh with resolved PR info
    end
Loading

Possibly related PRs

Suggested reviewers

  • christian-byrne
  • DrJKL
  • snomiao

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link

github-actions bot commented Jan 16, 2026

🎭 Playwright Tests: ⚠️ Passed with flaky tests

Results: 503 passed, 0 failed, 2 flaky, 8 skipped (Total: 513)

❌ Failed Tests

📊 Browser Reports
  • chromium: View Report (✅ 493 / ❌ 0 / ⚠️ 1 / ⏭️ 8)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 7 / ❌ 0 / ⚠️ 1 / ⏭️ 0)

@github-actions
Copy link

github-actions bot commented Jan 16, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 01/17/2026, 10:14:23 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@socket-security
Copy link

socket-security bot commented Jan 16, 2026

All alerts resolved. Learn more about Socket for GitHub.

This PR previously contained dependency changes with security issues that have been resolved, removed, or ignored.

View full report

setup:
runs-on: ubuntu-latest
# Skip version-bump PRs on pull_request (they run via workflow_run after i18n completes)
if: ${{ !(github.event_name == 'pull_request' && startsWith(github.head_ref, 'version-bump-')) }}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you just add this to the branches-ignore?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Amazing!

@github-actions
Copy link

github-actions bot commented Jan 16, 2026

Bundle Size Report

Summary

  • Raw size: 19.1 MB baseline 19.1 MB — ⚪ 0 B
  • Gzip: 4.05 MB baseline 4.05 MB — ⚪ 0 B
  • Brotli: 3.09 MB baseline 3.09 MB — ⚪ 0 B
  • Bundles: 155 current • 155 baseline

Category Glance
Vendor & Third-Party ⚪ 0 B (9.09 MB) · Other ⚪ 0 B (5.91 MB) · Data & Services ⚪ 0 B (2.74 MB) · Graph Workspace ⚪ 0 B (878 kB) · Panels & Settings ⚪ 0 B (385 kB) · Views & Navigation ⚪ 0 B (66.6 kB) · + 5 more

Per-category breakdown
App Entry Points — 18.1 kB (baseline 18.1 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-C4tPUVSq.js 18.1 kB 18.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Graph Workspace — 878 kB (baseline 878 kB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BhpZsNVj.js 878 kB 878 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Views & Navigation — 66.6 kB (baseline 66.6 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudAuthTimeoutView-CRvlos3M.js 4.71 kB 4.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudForgotPasswordView-CQhBkaW5.js 5.31 kB 5.31 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudLayoutView-RpCijIXU.js 6.18 kB 6.18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudLoginView-DrS8aThn.js 9.75 kB 9.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSignupView-DaQoeW6Y.js 6.96 kB 6.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSorryContactSupportView-Bq5r0bm1.js 958 B 958 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSubscriptionRedirectView-DtFAMXsR.js 4.37 kB 4.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSurveyView-Be0ThBmU.js 15.5 kB 15.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-DPXamnO6.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserCheckView-DMPXXtRT.js 8.2 kB 8.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserSelectView-Cecxw--8.js 4.34 kB 4.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Panels & Settings — 385 kB (baseline 385 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/AboutPanel-IrApHprU.js 8.26 kB 8.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudRemoteConfig-xYXGiN4-.js 1.71 kB 1.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ExtensionPanel-CotM4NsB.js 9.18 kB 9.18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/KeybindingPanel-RBVXls00.js 12.3 kB 12.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LegacyCreditsPanel-BQ5LazXs.js 20.5 kB 20.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/remoteConfig-BUDSMhNf.js 180 B 180 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/remoteConfig-ChJ6chsD.js 842 B 842 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ServerConfigPanel-C0fgOT_-.js 6.27 kB 6.27 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B4tKvhju.js 25.9 kB 25.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CaRugk0T.js 31.4 kB 31.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Cc_5ZmNN.js 22.9 kB 22.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CGqeatFl.js 25.7 kB 25.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CmdWWupL.js 26.7 kB 26.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CUG7K3Yo.js 22.3 kB 22.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D-sRfyAY.js 28.3 kB 28.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DiaIkXsJ.js 27.5 kB 27.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DNazWeKW.js 26.6 kB 26.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dx2hk4FX.js 35.4 kB 35.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-NGLy8ZAc.js 29.2 kB 29.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanel-DhoCrgE8.js 18.2 kB 18.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserPanel-ZYy7Izf6.js 5.92 kB 5.92 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
User & Accounts — 4.22 kB (baseline 4.22 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-COl4KUkb.js 288 B 288 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auth-h5_EBPSm.js 3.29 kB 3.29 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/firebaseAuthStore-BM7aaP1X.js 638 B 638 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
Editors & Dialogs — 2.85 kB (baseline 2.85 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-BZV2YTQa.js 2.22 kB 2.22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useSubscriptionDialog-n0M56v0j.js 631 B 631 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
UI Components — 26.3 kB (baseline 26.3 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Button-DXbPXIj1.js 2.86 kB 2.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-DlTg2ijn.js 1.14 kB 1.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudFeedbackTopbarButton-DJzgXDIL.js 1.09 kB 1.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyQueueButton-BzDDKw8y.js 643 B 643 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyQueueButton-rfr8eon4.js 7.07 kB 7.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscribeButton-DGg_YfZx.js 10.7 kB 10.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-CRJy-LDw.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-CKnjYR8V.js 1.71 kB 1.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Data & Services — 2.74 MB (baseline 2.74 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/api-DfWs7Mfv.js 1.08 MB 1.08 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/audioService-PSCQt5EB.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/dialogService-BAkYJEAE.js 1.64 MB 1.64 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/keybindingService-o3MfI4m9.js 6.04 kB 6.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/releaseStore-CQEcRrHe.js 7.91 kB 7.91 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/releaseStore-DHM-peYD.js 610 B 610 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/serverConfigStore-D6d48Q0y.js 2.3 kB 2.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/userStore-DzHzUW1c.js 1.83 kB 1.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Utilities & Hooks — 16.6 kB (baseline 16.6 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/_plugin-vue_export-helper-DkXvIbNw.js 218 B 218 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/audioUtils-BjTbovQt.js 1.04 kB 1.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-Cvq9baIq.js 6.89 kB 6.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-BgHJHHDI.js 1.49 kB 1.49 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeFilterUtil-DTOFbnOf.js 242 B 242 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/subscriptionCheckoutUtil-D-VJR6pm.js 1.63 kB 1.63 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCurrentUser-B_pj8lpJ.js 572 B 572 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useErrorHandling-BOcmYr4V.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Vendor & Third-Party — 9.09 MB (baseline 9.09 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-chart-vHYiiHjX.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-bLc542qk.js 4.34 MB 4.34 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-Dn50BkoY.js 1.71 MB 1.71 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-Dfa--nkF.js 97.9 kB 97.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-ROpDBAgW.js 1.84 MB 1.84 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-S96Ju_Nb.js 185 kB 185 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-B8djomGx.js 131 kB 131 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-C9PB687x.js 397 kB 397 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 5.91 MB (baseline 5.91 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/AudioPreviewPlayer-BHd6CULu.js 684 B 684 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/AudioPreviewPlayer-CLFgoLXJ.js 11 kB 11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-C5ZGWZyn.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-B2RZlcwF.js 1.69 kB 1.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudBadges-CvR4eYsW.js 1.12 kB 1.12 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudRunButtonWrapper-VPCJP0fz.js 1.42 kB 1.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudSessionCookie-CCx-mjut.js 2.82 kB 2.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudSubscription-BT3v9meW.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-7Rm2ilks.js 16 kB 16 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B2T0Tiqb.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BfbWPTP5.js 14.4 kB 14.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Bk5Hy71M.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BKiU7Msm.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C1rCoJIk.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C7GUJ-mt.js 14.6 kB 14.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CdWPfhpt.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CVH8YfJ3.js 16.8 kB 16.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DEW8TY9B.js 16.7 kB 16.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DSsDsJlz.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/core-CDJfwSRA.js 165 kB 165 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/GlobalToast-bE74H3xl.js 2.28 kB 2.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/graphHasMissingNodes-SuFDvpkU.js 696 B 696 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-HSfoff1Z.js 12.1 kB 12.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3D-BixHV22X.js 613 B 613 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3D-DzpcmjG8.js 46.7 kB 46.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BcGurlLt.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Brh7PtUL.js 130 kB 130 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-By3kkO70.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CMwYySnf.js 117 kB 117 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CukDmnQ9.js 100 kB 100 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DdC_qgWU.js 120 kB 120 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DEiGPqKr.js 115 kB 115 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DZsqHcbk.js 101 kB 101 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-sAR6lZ5U.js 157 kB 157 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-WFOApOr_.js 137 kB 137 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-WlYSOVfg.js 141 kB 141 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-Dxtqlb1m.js 1.18 kB 1.18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-D8F3P6nT.js 1.37 kB 1.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-C2q25E_R.js 1.64 kB 1.64 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-BekXmdBL.js 2.19 kB 2.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/mixpanel.module-CB67EPbl.js 92 B 92 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-a476Kb1a.js 339 kB 339 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BoysRuhG.js 352 kB 352 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C1DGym0y.js 310 kB 310 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CFwsX_m-.js 381 kB 381 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CiPSzZ9E.js 339 kB 339 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-COhYgldT.js 343 kB 343 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D1eJ3MWg.js 313 kB 313 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D5AbIjlp.js 336 kB 336 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Dj0hpilf.js 415 kB 415 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Dm25Ay8M.js 381 kB 381 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-h4f9Qpyk.js 333 kB 333 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/PanelTemplate-BHXCTIyn.js 14.5 kB 14.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/preservedQueryNamespaces-8IvUKrEM.js 2.7 kB 2.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-BVSCtPLU.js 603 B 603 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-uYyVBMFy.js 1.34 kB 1.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-hv4kjqwF.js 3.42 kB 3.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-DWRIFAAP.js 191 B 191 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscribeToRun-C1cl6d0j.js 2.05 kB 2.05 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionRequiredDialogContent-uHRFCFs5.js 25.2 kB 25.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ValueControlPopover-CHOl4BYt.js 4.87 kB 4.87 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-B5EDHllb.js 383 B 383 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetAudioUI-DJbvD29Y.js 2.94 kB 2.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BMqKTQRe.js 168 B 168 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-U1eyr0w3.js 3.89 kB 3.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-BEyqUpBQ.js 2.15 kB 2.15 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-B9aMCXIf.js 2.81 kB 2.81 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria--Zrc3dqq.js 3.55 kB 3.55 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-lotcrt8e.js 2.99 kB 2.99 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCrop-Cb9GT1iR.js 16.5 kB 16.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputNumber-CB9NfSXv.js 14.2 kB 14.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputNumber-Ci3Ons7U.js 353 B 353 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-BLNJPSNx.js 1.76 kB 1.76 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-DB5JMJv7.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLegacy-DKBxgC0O.js 595 B 595 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-kMx3IKl7.js 2.52 kB 2.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BOgWBAuV.js 1.04 kB 1.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetRecordAudio-Dzv0_KyY.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetSelect-DiOlVm5e.js 779 B 779 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetSelect-uJJ1db4p.js 42.4 kB 42.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-DzYOr75r.js 2.7 kB 2.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-B9y-IUIh.js 2.26 kB 2.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetWithControl-CnXU3Elm.js 3.62 kB 3.62 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

@Myestery Myestery assigned DrJKL and unassigned Myestery and DrJKL Jan 16, 2026
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @.github/workflows/ci-tests-e2e.yaml:
- Around line 206-218: The current get-pr step (id: get-pr) looks up PRs by
matching context.payload.workflow_run.head_sha which is brittle and paginated
list() can miss results; change it to first check
context.payload.workflow_run.pull_requests and return that PR number if present,
and only if empty fallback to a robust branch-based lookup: use pulls.list with
head set to `${context.repo.owner}:${context.payload.workflow_run.head_branch}`
(or the branch from the event) and paginate through results with per_page=100
across pages until a match is found; apply this same change to the other get-pr
step referenced in the workflow so both use pull_requests from the payload first
and branch+pagination as fallback.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In @.github/workflows/ci-tests-e2e.yaml:
- Around line 10-13: The workflow_run trigger currently fires for any completion
of the i18n workflow; update the job gating so E2E jobs only run for
version-bump PRs by adding the provided conditional check to the relevant jobs
(e.g., the setup job) referencing the workflow_run trigger and the setup job
name: add an if condition that checks github.event_name and
startsWith(github.event.workflow_run.head_branch, 'version-bump-') so the
workflow only proceeds when not triggered by workflow_run or when the head
branch starts with "version-bump-".
- Around line 279-284: The workflow step currently sets PR_NUMBER and BRANCH via
inline shell variable expansion before calling bash
./scripts/cicd/pr-playwright-deploy-and-comment.sh which allows script
injection; move PR_NUMBER and BRANCH into the step's env: block and reference
them as $PR_NUMBER and $BRANCH in the run command (leave the bash invocation
unchanged) so the values are passed as environment variables instead of
interpolated into the shell line; update the step that calls
pr-playwright-deploy-and-comment.sh to use env: PR_NUMBER and BRANCH and pass
"$PR_NUMBER" "$BRANCH" to the script.
- Around line 226-231: The workflow is vulnerable because github.head_ref and
github.event.workflow_run.head_branch are interpolated directly into the run
shell, enabling shell injection; fix it by passing those values as GitHub
Actions environment variables instead of embedding them in the shell command:
set env: PR_NUMBER: ${{ github.event.pull_request.number ||
steps.get-pr.outputs.result }} and BRANCH: ${{ github.head_ref ||
github.event.workflow_run.head_branch }} for the job/step, then invoke
./scripts/cicd/pr-playwright-deploy-and-comment.sh without inline variable
interpolation (the script can read $PR_NUMBER and $BRANCH from its environment),
ensuring you reference the PR_NUMBER and BRANCH env names shown here and avoid
constructing the command string with unescaped user-controlled inputs.
♻️ Duplicate comments (2)
.github/workflows/ci-tests-e2e.yaml (2)

204-216: PR lookup by head_sha will fail after i18n commits.

This issue was previously flagged and remains unresolved. The i18n workflow pushes a new commit, so workflow_run.head_sha will be the new commit SHA—not the original PR head SHA. The find() call will fail to match any PR.

Additionally, the default pulls.list() returns only 30 PRs without pagination.

Use workflow_run.pull_requests from the payload first, then fall back to branch-based lookup:

Suggested fix
       - name: Get PR number for workflow_run
         id: get-pr
         if: github.event_name == 'workflow_run'
         uses: actions/github-script@v7
         with:
           script: |
-            const { data: prs } = await github.rest.pulls.list({
-              owner: context.repo.owner,
-              repo: context.repo.repo,
-              state: 'open',
-            });
-            const pr = prs.find(p => p.head.sha === context.payload.workflow_run.head_sha);
-            return pr?.number || '';
+            const prFromPayload = context.payload.workflow_run.pull_requests?.[0]?.number;
+            if (prFromPayload) return prFromPayload;
+
+            const head = `${context.repo.owner}:${context.payload.workflow_run.head_branch}`;
+            const prs = await github.paginate(github.rest.pulls.list, {
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              state: 'open',
+              head,
+              per_page: 100,
+            });
+            return prs[0]?.number || '';

253-265: Duplicate get-pr logic with same brittleness.

Same issue as the earlier get-pr step—apply the same fix using workflow_run.pull_requests from the payload with branch-based fallback and pagination.

Comment on lines +10 to +13
# Run after i18n workflow completes for version-bump PRs
workflow_run:
workflows: ['i18n: Update Core']
types: [completed]
Copy link
Contributor

@coderabbitai coderabbitai bot Jan 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Missing branch filter on workflow_run trigger.

The workflow_run trigger fires for any completion of the i18n workflow, not just version-bump PRs. This will cause E2E tests to run after every i18n update regardless of branch, which is not the intended behavior per the PR objectives.

Add a condition to the setup job (or all jobs that should only run for version-bump PRs via workflow_run) to filter by branch:

if: >
  github.event_name != 'workflow_run' ||
  startsWith(github.event.workflow_run.head_branch, 'version-bump-')

Alternatively, consider filtering earlier at the workflow level using a preliminary job that gates downstream jobs.

🤖 Prompt for AI Agents
In @.github/workflows/ci-tests-e2e.yaml around lines 10 - 13, The workflow_run
trigger currently fires for any completion of the i18n workflow; update the job
gating so E2E jobs only run for version-bump PRs by adding the provided
conditional check to the relevant jobs (e.g., the setup job) referencing the
workflow_run trigger and the setup job name: add an if condition that checks
github.event_name and startsWith(github.event.workflow_run.head_branch,
'version-bump-') so the workflow only proceeds when not triggered by
workflow_run or when the head branch starts with "version-bump-".

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@DrJKL Great point! You can specify what branches the triggering workflow must run on using the branches or branches-ignore filters directly on the workflow_run event, which is much cleaner than adding job-level conditionals.

The workflow can be updated to use native branch filtering:

workflow_run:
  workflows: ['i18n: Update Core']
  types: [completed]
  branches:
    - 'version-bump-*'

This will ensure the E2E workflow only triggers via workflow_run when the i18n workflow completes on version-bump branches, which is exactly the intended behavior described in the PR objectives.


🧠 Learnings used
Learnt from: Myestery
Repo: Comfy-Org/ComfyUI_frontend PR: 7422
File: .github/workflows/pr-update-playwright-expectations.yaml:131-135
Timestamp: 2025-12-12T23:02:37.473Z
Learning: In the `.github/workflows/pr-update-playwright-expectations.yaml` workflow in the Comfy-Org/ComfyUI_frontend repository, the snapshot update process is intentionally scoped to only add and update snapshot images. Deletions of snapshot files are handled explicitly outside this workflow and should not be suggested as part of this automation.

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Test user workflows in browser tests

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-10T00:24:17.695Z
Learning: Run quality gates before PR: `pnpm lint`, `pnpm typecheck`, `pnpm knip`, and ensure relevant tests pass

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In @.github/workflows/ci-tests-e2e.yaml:
- Around line 266-268: The deploy-and-comment job currently uses if: always()
which lets it run even when get-pr-info was skipped or returned no PR number;
change the job's if condition to require a successful get-pr-info and a
non-empty PR number, e.g. replace if: always() with a guard like if:
needs.get-pr-info.result == 'success' && needs.get-pr-info.outputs.pr_number !=
'' so the job (referenced as deploy-and-comment and the get-pr-info job) only
runs when a valid PR number is present.
- Around line 190-233: The get-branch step currently writes untrusted inputs
(github.head_ref / github.event.workflow_run.head_branch) to $GITHUB_OUTPUT
using echo, which can be subject to shell injection; update the get-branch step
to capture the branch into a safe environment variable and write it with a
literal-safe formatter (use printf '%s' or equivalent) instead of echo so the
value is treated as data not shell code; specifically, change the run in the
get-branch step that sets branch to use printf '%s' with the expression
(github.head_ref || github.event.workflow_run.head_branch) to append the literal
branch string to $GITHUB_OUTPUT.
♻️ Duplicate comments (1)
.github/workflows/ci-tests-e2e.yaml (1)

9-13: Add a branch filter to the workflow_run trigger (still fires on all i18n runs).

Without a branch filter, any completion of i18n: Update Core (including non‑version‑bump branches) will trigger E2E, which is out of scope and can run without PR context.

🔧 Suggested fix
  workflow_run:
    workflows: ['i18n: Update Core']
    types: [completed]
+    branches:
+      - 'version-bump-*'

Comment on lines 190 to 233
# Get PR info once for reuse by comment jobs
get-pr-info:
runs-on: ubuntu-latest
if: |
(github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork == false) ||
(github.event_name == 'workflow_run')
outputs:
pr_number: ${{ steps.get-pr.outputs.result }}
branch: ${{ steps.get-branch.outputs.branch }}
steps:
- name: Get PR number
id: get-pr
uses: actions/github-script@v7
with:
script: |
if (context.eventName === 'pull_request') {
return context.payload.pull_request.number;
}

// First check pull_requests from payload (most reliable)
const prs = context.payload.workflow_run.pull_requests;
if (prs && prs.length > 0) {
return prs[0].number;
}

// Fallback: branch-based lookup with pagination
const head = `${context.repo.owner}:${context.payload.workflow_run.head_branch}`;

for await (const response of github.paginate.iterator(
github.rest.pulls.list,
{ owner: context.repo.owner, repo: context.repo.repo, state: 'open', head, per_page: 100 }
)) {
if (response.data.length > 0) {
return response.data[0].number;
}
}

console.log('No PR found');
return '';

- name: Get branch name
id: get-branch
run: echo "branch=${{ github.head_ref || github.event.workflow_run.head_branch }}" >> $GITHUB_OUTPUT

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🌐 Web query:

GitHub Actions script injection github.head_ref workflow_run branch name security

💡 Result:

Short answer: branch names (e.g. github.event.pull_request.head.ref / github.head_ref) and workflow_run triggers are untrusted inputs and have been used to inject shell/Actions expressions to execute arbitrary commands on runners. Treat them as attacker-controlled, avoid interpolating them directly into run: scripts, and apply the mitigations below. [1][2][3][7]

What the risk looks like

  • Attackers can create PRs or branches whose names or PR titles contain shell metacharacters or Actions expressions; if your workflow directly inserts those values into a run: block or unescapes outputs, the runner may execute them. Examples and real advisories/CVEs exist (expression/script injection and a branch-names action command-injection advisory/CVE). [1][2][3][6]

Minimal, effective mitigations (apply all that make sense)

  1. Never inject untrusted values directly into run: scripts. Use environment variables (env:) or pass values safely so they are treated as literals, not shell code. [1][5]
  2. Prefer immutable refs (head.sha) instead of branch names (head.ref) when checking out code. Avoid git checkout of a mutable branch name coming from a PR. [3][7]
  3. Sanitize/escape before writing to GITHUB_OUTPUT or files; avoid eval or patterns that unescape input (e.g., do not use eval printf "%s"). Use safe printf "%s" or proper quoting. (See patched guidance for branch-names action.) [1][2]
  4. For workflow_run workflows: restrict branch filters, verify origin (e.g., require github.event.workflow_run.event != 'pull_request' or check workflow_run.conclusion/source), and treat all artifacts as untrusted (download to $RUNNER_TEMP, validate contents). Limit permissions. [4]
  5. Don’t run privileged workflows (with write/contents/admin permissions or GITHUB_TOKEN with repo write) on events that can be triggered/poisoned by untrusted PRs (pull_request, workflow_run triggered by PRs). Require manual approval or use protected branch policies where appropriate. [3][4][7]
  6. Pin third‑party actions and inspect their code for unsafe shell usage (look for eval, unescaped printf, or writing unsanitized outputs). Update or replace vulnerable actions. [2][4]

References (examples and guidance)

  • GitHub Docs: Script injections, list of risky github context fields (body, head_ref, ref, title, etc.) and mitigation guidance. [1]
  • GitHub Security Lab advisories (expression injection examples in workflows). [3][2]
  • GitHub advisory / CVE for tj-actions/branch-names (command injection via unsafe unescaping; shows real PoC and fix). [6]
  • GitHub Well‑Architected / Actions security recommendations (workflow_run hardening, branch filters, treat artifacts as untrusted). [4]
  • Industry writeups on Actions script/code injection and safe patterns (examples of env usage vs direct interpolation). [5]

If you want, paste the specific workflow YAML you’re concerned about and I’ll point to exact lines that are vulnerable and show a fixed version.


🌐 Web query:

GitHub Actions environment context variables security trusted untrusted

💡 Result:

Quick summary — how GitHub Actions treats environment/context variables and what to do for security (trusted vs untrusted code):

Key rules

  • Treat any data originating from external actors (PRs from forks, issue/event fields, user inputs) as untrusted — don’t pass it directly into shell commands, eval, or programmatic templates without sanitizing. [1][2]
  • Never expose repository/organization secrets or long-lived tokens to untrusted code (fork PRs or any code you didn’t review). Use workflows that run PR code with no secrets. Use pull_request_target only for metadata tasks — it runs with base-repo permissions and can access secrets, so it’s dangerous if it checks out or runs untrusted code. [2][3]
  • Limit secrets/tokens scope and job permissions (permissions:, protected environments, branch protections) so even a compromised runner has least privilege. [3][4]
  • Don’t create environment variables from untrusted contexts (github.event.*, issue titles, PR body) and then export/use them in steps that run external code; these can be printed, injected, or used to exfiltrate secrets. [1][2][4]
  • Pin third‑party actions to full commit SHAs (not @main/@latest) and audit action code that will run in your workflow. [3]

Practical controls

  • Use secrets for sensitive values (secrets.*); GitHub masks secrets in logs but avoid accidental logging by not echoing untrusted-derived env values. [5]
  • Use separate jobs: one (pull_request_target or workflow_dispatch) that can access secrets for controlled orchestration, and another (pull_request) that checks out and runs untrusted PR code with no secrets. Gate secret-using jobs behind manual approvals or protected environments. [3]
  • Sanitize/whitelist inputs from events before using them in expressions or runs; prefer safe expression-time checks (if:) rather than shell interpolation when possible. [1][2]
  • Avoid writing secrets into files or envs accessible to later steps run by untrusted code; use ephemeral scoped tokens and protect deployment steps. [2][4]

References

  • Contexts and warnings about untrusted input (github, env, etc.). [1]
  • GitHub Security Lab: untrusted input risks and examples (exfiltration via env/echo). [2]
  • Community & GitHub guidance on safe use of pull_request_target, gating, least privilege, and workflow patterns. [3]
  • Variables/Environment docs and default-variable behavior. [4]
  • Secret masking and logging guidance. [5]

If you want, I can produce a short example workflow pattern that separates trusted and untrusted jobs and demonstrates the safe handling above.


🏁 Script executed:

# Check if there are other similar patterns in the workflow file that might indicate
# the project's current security practices
cd .github/workflows && cat ci-tests-e2e.yaml | grep -n "run:" | head -20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 681


Pass untrusted branch names safely to avoid shell injection.

github.head_ref and workflow_run.head_branch are user-controlled and can contain shell metacharacters. Even within double quotes, they can break out or inject code. Use an environment variable with printf %s to treat the value as a literal string:

Safer output write
      - name: Get branch name
        id: get-branch
-        run: echo "branch=${{ github.head_ref || github.event.workflow_run.head_branch }}" >> $GITHUB_OUTPUT
+        env:
+          BRANCH: ${{ github.head_ref || github.event.workflow_run.head_branch }}
+        run: |
+          printf 'branch=%s\n' "$BRANCH" >> "$GITHUB_OUTPUT"
🧰 Tools
🪛 actionlint (1.7.10)

232-232: "github.head_ref" is potentially untrusted. avoid using it directly in inline scripts. instead, pass it through an environment variable. see https://docs.github.com/en/actions/reference/security/secure-use#good-practices-for-mitigating-script-injection-attacks for more details

(expression)

🤖 Prompt for AI Agents
In @.github/workflows/ci-tests-e2e.yaml around lines 190 - 233, The get-branch
step currently writes untrusted inputs (github.head_ref /
github.event.workflow_run.head_branch) to $GITHUB_OUTPUT using echo, which can
be subject to shell injection; update the get-branch step to capture the branch
into a safe environment variable and write it with a literal-safe formatter (use
printf '%s' or equivalent) instead of echo so the value is treated as data not
shell code; specifically, change the run in the get-branch step that sets branch
to use printf '%s' with the expression (github.head_ref ||
github.event.workflow_run.head_branch) to append the literal branch string to
$GITHUB_OUTPUT.

Comment on lines +266 to +268
needs: [playwright-tests, merge-reports, get-pr-info]
runs-on: ubuntu-latest
if: always() && github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork == false
if: always()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

cat -n .github/workflows/ci-tests-e2e.yaml | head -300 | tail -100

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 4286


🏁 Script executed:

rg -n "deploy-and-comment|get-pr-info" .github/workflows/ci-tests-e2e.yaml -A 20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 3103


Guard deploy-and-comment job when PR info is missing (forks or non‑PR workflow_run).

The if: always() condition allows this job to run even when get-pr-info is skipped (due to fork or non-PR workflow_run events) or when it returns empty outputs, causing the job to fail with an invalid PR number passed to the deployment script.

✅ Gate on a valid PR number
  deploy-and-comment:
-    if: always()
+    if: ${{ always() && needs.get-pr-info.outputs.pr_number != '' }}
🤖 Prompt for AI Agents
In @.github/workflows/ci-tests-e2e.yaml around lines 266 - 268, The
deploy-and-comment job currently uses if: always() which lets it run even when
get-pr-info was skipped or returned no PR number; change the job's if condition
to require a successful get-pr-info and a non-empty PR number, e.g. replace if:
always() with a guard like if: needs.get-pr-info.result == 'success' &&
needs.get-pr-info.outputs.pr_number != '' so the job (referenced as
deploy-and-comment and the get-pr-info job) only runs when a valid PR number is
present.

@DrJKL DrJKL added the claude-review Add to trigger a PR code review from Claude Code label Jan 16, 2026
@DrJKL
Copy link
Contributor

DrJKL commented Jan 16, 2026

@coderabbitai review full

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 16, 2026

@DrJKL, I'll conduct a full review of this PR to analyze the workflow changes, verify the solution addresses the E2E test cancellation issue on version-bump PRs, and check for any potential issues or improvements.


🧠 Learnings used
Learnt from: Myestery
Repo: Comfy-Org/ComfyUI_frontend PR: 7422
File: .github/workflows/pr-update-playwright-expectations.yaml:131-135
Timestamp: 2025-12-12T23:02:37.473Z
Learning: In the `.github/workflows/pr-update-playwright-expectations.yaml` workflow in the Comfy-Org/ComfyUI_frontend repository, the snapshot update process is intentionally scoped to only add and update snapshot images. Deletions of snapshot files are handled explicitly outside this workflow and should not be suggested as part of this automation.
✅ Actions performed

Full review triggered.

if [ -n "$PR_NUMBER" ]; then
echo "number=${PR_NUMBER}" >> $GITHUB_OUTPUT
else
gh pr view --repo "${PR_TARGET_REPO}" "${PR_BRANCH}" \
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[security] medium Priority

Issue: Environment variables used in conditional logic without validation
Context: Using gh commands with environment variables can lead to shell injection if branch names contain special characters
Suggestion: Add proper input validation and quoting around all variables passed to shell commands

# Run after i18n workflow completes for version-bump PRs
workflow_run:
workflows: ['i18n: Update Core']
types: [completed]
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[architecture] medium Priority

Issue: Potential race condition with workflow_run trigger
Context: workflow_run trigger runs on completed workflows, but doesn't verify if the i18n workflow actually succeeded - it will run even if i18n failed
Suggestion: Add condition to check workflow_run.conclusion == 'success' to ensure E2E only runs after successful i18n completion


concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
group: ${{ github.workflow }}-${{ github.event.workflow_run.head_branch || github.ref }}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[architecture] low Priority

Issue: Concurrency group may cause unexpected cancellations across different event types
Context: Using the same concurrency group for both pull_request and workflow_run events could cause workflows to cancel each other when they should run independently
Suggestion: Consider using separate concurrency groups for different event types to prevent cross-event cancellation

PR_TARGET_REPO: ${{ github.repository }}
PR_NUMBER: ${{ github.event.pull_request.number }}
PR_BRANCH: ${{ github.head_ref || github.event.workflow_run.head_branch }}
run: |
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[quality] medium Priority

Issue: Missing error handling for gh command failures
Context: If the gh pr view command fails (e.g., PR deleted, permissions issue), the workflow will continue with empty PR_NUMBER
Suggestion: Add error checking after the gh command and fail the job if PR info cannot be retrieved: set -e at the beginning of the script block or explicit error checking

Copy link

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comprehensive PR Review

This review is generated by Claude. It may not always be accurate, as with human reviewers. If you believe that any of the comments are invalid or incorrect, please state why for each. For others, please implement the changes in one way or another.

Review Summary

PR: fix: run E2E tests after i18n completes on release PRs (#8111)
Impact: 58 additions, 11 deletions across 1 file

Issue Distribution

  • Critical: 0
  • High: 0
  • Medium: 3
  • Low: 2

Category Breakdown

  • Architecture: 2 issues
  • Security: 2 issues
  • Performance: 0 issues
  • Code Quality: 1 issue

Key Findings

Architecture & Design

The PR introduces a workflow_run trigger to solve the E2E/i18n timing issue, which is a good architectural approach. However, there are two concerns:

  1. The workflow_run trigger doesn't verify successful completion of the triggering workflow, which could lead to E2E tests running after failed i18n workflows
  2. The concurrency group configuration may cause unexpected interactions between pull_request and workflow_run events

Security Considerations

The implementation has moderate security concerns around input validation and permission contexts:

  1. Environment variables are used in shell commands without proper validation, creating potential injection risks if branch names contain special characters
  2. Missing explicit permissions for workflow_run events, which operate in a different security context than pull_request events

Performance Impact

No significant performance issues identified. The workflow optimization should actually improve performance by reducing cancelled E2E runs.

Integration Points

The changes properly handle both pull_request and workflow_run event contexts, with appropriate branching logic for checkout operations and PR information retrieval.

Positive Observations

  • Well-structured approach to solving the cancellation problem
  • Proper handling of different GitHub event contexts (pull_request vs workflow_run)
  • Good code organization with the new get-pr-info job for reusability
  • Clear comments explaining the purpose of the workflow_run trigger

References

Next Steps

  1. Address medium priority issues (workflow conclusion checking, input validation)
  2. Consider adding explicit permissions for better security
  3. Test the workflow with various branch name scenarios
  4. Verify the solution works correctly with version-bump PRs

This is a comprehensive automated review. For architectural decisions requiring human judgment, please request additional manual review.

@github-actions github-actions bot removed the claude-review Add to trigger a PR code review from Claude Code label Jan 16, 2026
@DrJKL DrJKL assigned Myestery and unassigned DrJKL Jan 17, 2026
pull_request:
branches-ignore:
[wip/*, draft/*, temp/*, vue-nodes-migration, sno-playwright-*]
[wip/*, draft/*, temp/*, vue-nodes-migration, sno-playwright-*, version-bump-*]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

btw I think its time to remove "sno-playwright-*", it was added for test XD

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is good to merge after removed 'sno-playwright-*' cc @DrJKL

setup:
runs-on: ubuntu-latest
# Skip version-bump PRs on pull_request (they run via workflow_run after i18n completes)
if: ${{ !(github.event_name == 'pull_request' && startsWith(github.head_ref, 'version-bump-')) }}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Amazing!

@socket-security
Copy link

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addedfirebase@​11.6.0991001009980

View full report

@coderabbitai coderabbitai bot requested review from DrJKL and snomiao January 17, 2026 22:13
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @.github/workflows/ci-tests-e2e.yaml:
- Around line 10-13: The workflow_run trigger currently listens to any
completion of the i18n workflow; add a branches filter under workflow_run (e.g.,
branches: [<version-bump-branch-name-or-pattern>]) to restrict it to the
version-bump branches and keep workflows: ['i18n: Update Core'] and types:
['completed']; then update downstream jobs (for example the setup job) to gate
execution on the upstream conclusion by adding an if condition that checks
github.event_name != 'workflow_run' || github.event.workflow_run.conclusion ==
'success' so the job only runs when the workflow_run succeeded or when triggered
by other events.
♻️ Duplicate comments (3)
.github/workflows/ci-tests-e2e.yaml (3)

247-250: Guard deploy-and-comment job when PR info is unavailable.

The if: always() condition allows this job to run even when get-pr-info was skipped (e.g., push events) or failed, which would cause the deployment script to receive empty PR_NUMBER and BRANCH arguments.

🔧 Suggested fix
   deploy-and-comment:
     needs: [playwright-tests, merge-reports, get-pr-info]
     runs-on: ubuntu-latest
-    if: always()
+    if: ${{ always() && needs.get-pr-info.outputs.pr_number != '' }}

207-214: Use printf to safely write outputs and add error handling for gh command.

Line 208 uses echo with variable expansion which can be vulnerable to injection if PR_BRANCH contains special characters like newlines. Additionally, if the gh pr view command fails (e.g., PR deleted, permissions issue), the job continues with an empty PR number.

🔧 Suggested fix
         run: |
-          echo "branch=${PR_BRANCH}" >> $GITHUB_OUTPUT
+          printf 'branch=%s\n' "$PR_BRANCH" >> "$GITHUB_OUTPUT"
           if [ -n "$PR_NUMBER" ]; then
-            echo "number=${PR_NUMBER}" >> $GITHUB_OUTPUT
+            printf 'number=%s\n' "$PR_NUMBER" >> "$GITHUB_OUTPUT"
           else
-            gh pr view --repo "${PR_TARGET_REPO}" "${PR_BRANCH}" \
-              --json 'number' --jq '"number=\(.number)"' >> $GITHUB_OUTPUT
+            PR_NUM=$(gh pr view --repo "${PR_TARGET_REPO}" "${PR_BRANCH}" \
+              --json 'number' --jq '.number') || {
+              echo "::error::Failed to retrieve PR number for branch ${PR_BRANCH}"
+              exit 1
+            }
+            printf 'number=%s\n' "$PR_NUM" >> "$GITHUB_OUTPUT"
           fi

193-195: Consider adding branch filter to workflow_run condition.

If the workflow_run trigger-level branches filter (suggested earlier) is not applied, this condition should also filter for version-bump branches to prevent running on unrelated i18n workflow completions:

     if: |
       (github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork == false) ||
-      (github.event_name == 'workflow_run')
+      (github.event_name == 'workflow_run' && startsWith(github.event.workflow_run.head_branch, 'version-bump-'))

This becomes unnecessary if you add branches: ['version-bump-*'] to the trigger definition.

Comment on lines +10 to +13
# Run after i18n workflow completes for version-bump PRs
workflow_run:
workflows: ['i18n: Update Core']
types: [completed]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add branch filter and success check to workflow_run trigger.

The workflow_run trigger currently fires for any completion of the i18n workflow on any branch, not just version-bump PRs. Additionally, types: [completed] fires regardless of whether the i18n workflow succeeded or failed.

Add a branches filter and check workflow_run.conclusion in downstream jobs:

   workflow_run:
     workflows: ['i18n: Update Core']
     types: [completed]
+    branches:
+      - 'version-bump-*'

Then add a conclusion check to the setup job (or relevant jobs):

if: >
  github.event_name != 'workflow_run' ||
  github.event.workflow_run.conclusion == 'success'
🤖 Prompt for AI Agents
In @.github/workflows/ci-tests-e2e.yaml around lines 10 - 13, The workflow_run
trigger currently listens to any completion of the i18n workflow; add a branches
filter under workflow_run (e.g., branches:
[<version-bump-branch-name-or-pattern>]) to restrict it to the version-bump
branches and keep workflows: ['i18n: Update Core'] and types: ['completed'];
then update downstream jobs (for example the setup job) to gate execution on the
upstream conclusion by adding an if condition that checks github.event_name !=
'workflow_run' || github.event.workflow_run.conclusion == 'success' so the job
only runs when the workflow_run succeeded or when triggered by other events.

@DrJKL DrJKL closed this Jan 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M This PR changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants