Skip to content

ci: 三条 live e2e 以 non-required lane 进 CI——真后端来自已发布的 rc.2 制品 (#2835) - #3325

Merged
xuyushun441-sys merged 2 commits into
mainfrom
claude/issue-2835-live-e2e-ci
Aug 4, 2026
Merged

ci: 三条 live e2e 以 non-required lane 进 CI——真后端来自已发布的 rc.2 制品 (#2835)#3325
xuyushun441-sys merged 2 commits into
mainfrom
claude/issue-2835-live-e2e-ci

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

Fixes #2835

做了什么

e2e/live/** 的 20+ 条 Playwright spec 覆盖行操作、弹窗、主从、screen flow 等交互关键路径,但 CI 从不运行它们——framework#3528(懒加载 suspension 拆掉宿主 dialog,只有真浏览器+真后端能复现)就是这么漏出去的。本 PR 按 #2835 维护者裁决(含 2026-08-03 追加裁决)给 CI 一个真后端,并以 non-required 信息性 lane + 三条 allowlist 起步。

1. 新 workflow .github/workflows/live-e2e.yml(信息性,不阻塞合并)

  • 后端 = 已发布制品objectstack dev --seed-admin --fresh,依赖全部来自 npm 上已发布的 @objectstack/*@17.0.0-rc.2(与本仓 pnpm-lock.yaml 解析的 @objectstack/spec 版本配对,避免测错配组合);showcase 元数据从 framework 仓 release tag @objectstack/cli@17.0.0-rc.2 指向的 commit(89d2a4eb)稀疏检出。零源码构建——每个 PR 都在跑一次「本 console × 已发布 rc.2 后端」的集成冒烟。pin 集中在 e2e/live/ci/backend.env,与 framework 仓 .objectui-sha 的 console vendoring 互为镜像。
  • console = 生产构建 + vite previewVITE_BASE_PATH=/ 使 SPA fallback 对深链接可用;preview.proxy 继承 server.proxy,代理链路已本地实测)。
  • allowlist 起步:仅 screen-flow / action-modal / master-detail(根脚本 test:e2e:live:ci)。扩量方式:逐条证明稳定后加进该脚本,不要一次放开 20+ 条继承存量 flake。
  • non-required,两层保证:① 新 workflow 的新 check 默认不在 branch protection 的 required checks 里,本 PR 不改任何 required 配置;② job 级 continue-on-error: true——失败不置红 workflow run,因此既不进合并门槛,也不会因 AGENTS.md「全绿才合」惯例事实上阻塞并行 agent(objectstack#4850 前科:新 lane 的 flake 把无关 PR 逐出合并队列)。失败仍可见:红 step + live-e2e-artifacts(Playwright report + 后端/preview 日志)+ job summary。另挂 nightly schedule 在 main 上积累稳定性记录,作为将来转 required 的依据。

2. 删除 stale 的 dev-server job(ci.yml)

apps/dev-server 早已不在树中(apps/console/README.md 明确记录已移除),pnpm --filter @object-ui/dev-server build 匹配不到任何包、静默退出 0——该 job 长期「空转绿」。按裁决直接删除,其守护意图由本 lane 接替(且换成了真后端)。

3. 为什么动了 packages/plugin-dashboard 的 designMode 测试

这不在「live e2e 进 CI」的直观落点里,但在裁决明文范围内#2835 裁决评论将 DashboardRenderer.designModedescribe.skipTODO(#ci-hang),2026-05-01 至今)「纳入同一波清理的范围核查」——它和本单是同一类病:存在于磁盘、保护着零的测试。核查结果:在今日依赖树(spec 17.0.0-rc.2)上单跑 24/24 全过、8.31s、无挂起;当年的挂起归因于传递依赖,依赖树已整体换代。予以解禁;本 PR 自己的 4 个 sharded Test job(required)就是全量语境的把关——若复发,失败签名是 Test job 撞 timeout-minutes,红在本 PR 上而非 main,届时回退 skip 并按注释里的指引 bisect。

验证

本地验证被容器两次重启打断(PM 已裁定 push-first);完成的轮次与实测输出如下,未凑够的以本 PR 的 live-e2e lane 实跑为准——这个 workflow 本身就是对自己的验证

结果
后端从已发布 rc.2 包冷启动(start-backend.sh,本地) [live-backend] ready: seeded sign-in answered on :4210POST /api/v1/auth/sign-in/email → 200
console 生产构建(VITE_BASE_PATH=/ ✓ built in 15.68s
preview 代理链路(:5290 → :4210) ✅ 伪 token 请求经代理返回 401(后端应答)
designMode 解禁单跑(pnpm exec vitest run …designMode.test.tsx Test Files 1 passed / Tests 24 passed,8.31s
allowlist 三条 spec 本地轮次 ⚠️ 0/2 轮完成——第 1 轮在共享验证锁上排队时被容器重启杀掉,第 2 轮未及启动。以本 PR 的 Live E2E lane 实跑为准;红了在本分支修
仓根全量 vitest / type-check / lint / build ⚠️ 本地 run 被重启打断。由本 PR 的 required CI(Test ×4 shards / Type Check / Lint / Build & E2E)把关

影响面与共享文件

后续(不在本 PR)

  • rc pin 前进(rc.3 已上 npm):在 bump console @objectstack pin 的同一 PR 里同步 bump e2e/live/ci/backend.env(两个 pin 必须同 PR 走,理由见 backend.env 头注)。
  • allowlist 扩量与转 required:依据本 lane(含 nightly)的稳定记录另行裁决。

🤖 Generated with Claude Code

https://claude.ai/code/session_01NVPjPzmmAJ2Ngtvgg5MSRa


Generated by Claude Code

claude added 2 commits August 3, 2026 19:26
…nd (#2835)

- New non-required informational lane (.github/workflows/live-e2e.yml):
  objectstack dev booted from published @objectstack/*@17.0.0-rc.2 (pins in
  e2e/live/ci/backend.env, matched to pnpm-lock.yaml's @objectstack/spec),
  showcase metadata sparse-checked-out at the release-tag commit, console
  served as a production build via vite preview. Allowlist: screen-flow,
  action-modal, master-detail (root script test:e2e:live:ci).
- Remove ci.yml's stale dev-server job (apps/dev-server left the tree;
  the filter matched nothing and the job was green by vacuity).
- Re-enable DashboardRenderer.designMode (skipped since 2026-05-01 as
  TODO(#ci-hang)) — passes standalone and in the full root run on today's
  dependency tree; scope check mandated by the #2835 ruling.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NVPjPzmmAJ2Ngtvgg5MSRa
…alone green, PR shards gate the full run

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NVPjPzmmAJ2Ngtvgg5MSRa
@vercel

vercel Bot commented Aug 4, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Aug 4, 2026 12:01am

Request Review

@xuyushun441-sys
xuyushun441-sys marked this pull request as ready for review August 4, 2026 00:03
@xuyushun441-sys
xuyushun441-sys added this pull request to the merge queue Aug 4, 2026
Merged via the queue into main with commit d6e5589 Aug 4, 2026
14 of 16 checks passed
@xuyushun441-sys
xuyushun441-sys deleted the claude/issue-2835-live-e2e-ci branch August 4, 2026 00:03
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 28.1 KB 350 KB
Entry file index-BTW2X0u4.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.47KB 3.09KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 18.38KB 4.49KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 3.65KB 1.42KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.25KB 0.53KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 476.66KB 104.69KB
core (index.js) 2.25KB 0.80KB
create-plugin (index.js) 9.28KB 2.98KB
data-objectstack (index.js) 136.23KB 34.75KB
fields (index.js) 224.93KB 55.15KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.46KB 0.96KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 5.37KB 1.72KB
i18n (useObjectLabel.js) 26.14KB 6.07KB
i18n (useSafeTranslation.js) 3.26KB 1.44KB
layout (index.js) 38.53KB 10.71KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.74KB
mobile (index.js) 1.50KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.05KB 1.53KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 44.98KB 12.37KB
plugin-charts (index.js) 60.54KB 17.13KB
plugin-chatbot (index.js) 180.09KB 42.72KB
plugin-dashboard (index.js) 112.01KB 28.86KB
plugin-designer (index.js) 210.51KB 42.51KB
plugin-detail (index.js) 230.56KB 56.80KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 111.54KB 26.97KB
plugin-gantt (index.js) 162.25KB 39.55KB
plugin-grid (index.js) 185.08KB 49.04KB
plugin-kanban (index.js) 47.89KB 13.18KB
plugin-list (index.js) 104.94KB 25.32KB
plugin-map (index.js) 16.81KB 5.24KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.55KB 10.59KB
plugin-timeline (index.js) 25.76KB 7.33KB
plugin-tree (index.js) 8.34KB 2.82KB
plugin-view (index.js) 83.67KB 20.43KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 19.28KB 6.38KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.02KB 0.55KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 2.46KB 1.21KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 0.20KB 0.18KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The live e2e suite never runs in CI — 20+ specs are effectively manual, and that is how framework#3528 shipped

2 participants