Repository navigation
[v2] 定时任务资源选择与运行历史接入 - #224
Conversation
ObsisMc
left a comment
There was a problem hiding this comment.
审查 head b218b8a1b34f10bc8ada254a15187c92cf087a32(merge-base main bad9e4d7)。
核对
- 改动都在
frontend-v2/和v2-server/下,都是交付物(代码、测试、OpenAPI、README、orval 配置),描述写了「v2,不涉及 specs」。 v2-server/schedule-actions.openapi.json、schedule-history.openapi.json和 #217(1252db82)、#221(fe50af80)head 上的文件内容一致;orval.schedule-runtime.config.ts指向正确的契约,CI 的api:check:schedules会重新生成三个客户端,漂移有保障。- 之前移除的参数解析、自定义 resolver、引用目标写入契约、
SourceTask和工作流 mock 都没有回来;旧工作流/任务目标在前端只读,服务端写入返回 503。 - 历史排序:按
recorded_at DESC, id DESC展示,b218b8a1用 BigInt 纳秒保住亚秒顺序,再按小写 UUID 字符串比较,和 PostgreSQL uuid 顺序一致;多页合并按 id 去重,nextCursor || undefined正确结束分页,"加载更多"和 3s 轮询不会重复或漏项。 - 表单提交的字段和服务端校验一致(无项目必须选目录里的模型;有项目时
executorId的modelId要和模型一致)。 - head 上 CI 全绿。本次只做了静态审查,没有在本地跑测试和 e2e。
非阻塞建议
- (建议合并前改)一次轮询失败就清空已加载的数据。
page.tsx:42(资源)、page.tsx:52(配置)、schedule-detail.tsx:25(历史)都写成isError ? 空 : data。TanStack Query 在 refetch 失败时会保留旧 data,这里却丢掉了,再加上retry: false和 30s/3s/窗口聚焦的轮询,一次失败就会:- 资源下拉变空、保存提示项目或模型不可用;
- 打开的详情变成"任务当前无法读取",面板卸载、状态丢失;
- 历史
rows变空,occupied(schedule-detail.tsx:34)变 false,运行还在进行时"立即运行"就可以点了,服务端随后会多记一条previous_unfinished的跳过记录。
历史错误提示写的是"既有记录未被清除",和实际行为也对不上。建议有 data 时继续展示旧数据,只额外显示错误。
runtime.ts:18的错误文案缺 #217 会返回的execution_busy(409)、invalid_execution_request、execution_unsupported(400),会落到"运行请求失败,请重试同一请求";后两个是 400,重试同一请求不会成功。错误响应里的params.occurrenceId也没有用上,界面不会选中已经记下的那条记录。- 历史列表按钮改用
aria-pressed后不再有activeclass,但schedules.css:157只给.sp-history-list button.active加了背景,选中行没有高亮了。改成[aria-pressed="true"]即可。 schedule-detail.tsx:28的observed取rows[0]和exact.data中计划时间较晚的一条;exact查询在记录出现在rows后就停用,exact.data不再更新。手动运行之后紧接着有一条定时记录时,列表可能一直显示手动运行的旧状态。可以改成优先用rows里同 id 的那份。- 取消成功后调用
output.refetch(),TanStack v5 的refetch()不看enabled: false,没有executionRef时会发一个无用的结果请求。 - 删除来源选择器、工作流列表和演示 store 后,
schedules.css里留下了无人引用的样式:sp-source-*、sp-workflow-list、sp-workflow-option、sp-demo-options、sp-target-title、sp-flow-inputs。Run类型里的projectName、output、target现在总是空或复制值,也可以去掉。 orval.schedules.config.ts的clean: true作用在src/features/schedules/api/上,单独跑这份配置会删掉api/actions和api/history。组合脚本会紧接着重新生成,只在单独运行时有影响。
结论:没有阻塞问题,契约和 #217、#221 一致,可以在两者之后合并;第 1 条建议合并前处理,是否等改完由 owner 决定。
ObsisMc
left a comment
There was a problem hiding this comment.
复审 head fb1ca14d32d7092873df688b7d1518c41983da58。相对上次 Approve 的 b218b8a1,多了两个提交:
4a4d9886merge main(cloud#237)。我在本地重做了这次合并,只有v2-server/README.md冲突,其余文件和自动合并一致;README 保留了本 PR 的资源接口和"职责与旧引用兼容"两节,也保留了 main 的新内容。这个提交上 CI 失败了:main 装配真实 runtime 后会暴露 Fixture 模型,旧的 e2e 断言不再成立。fb1ca14d按装配后的环境改了两份 e2e:建任务时选 Fixture 模型,"立即运行"改为可用;无 Node 资产时执行器列表为空,选 Demo 项目加 Fixture 后显示"暂无匹配的执行器"。改法和现在的真实行为一致。
CI 全绿,可合并性 CLEAN。
小问题:task-schedules.spec.ts 的用例名(unavailable target kinds…)和截图名 resources-unavailable-mobile.png 还是"资源不可用"的说法,但模型现在是可用的,可以顺手改名。上次的 7 条非阻塞建议仍然有效,第 1 条(轮询失败清空已加载数据)建议合并前处理。
ObsisMc
left a comment
There was a problem hiding this comment.
复审 head bdf38fe6fe2534e42469036bbfee02cf9444ed90。相对上次 Approve 的 fb1ca14d,新增的 298487a0 和 bdf38fe6 两个提交处理了我上次的建议,我都核对过:
- 轮询失败保留旧数据:资源、配置、历史三处都改成"有 data 就继续展示,错误另行提示"。表单在资源刷新失败但已有目录时仍然可用;历史保留后,
occupied不会因为一次失败变成 false,"立即运行"不会被误放开。 - 错误码:补齐了
execution_busy、execution_target_unavailable、invalid_execution_request、execution_unsupported的文案。错误响应里的occurrenceId会被选中。400、execution_busy、execution_target_unavailable这类终态拒绝会清掉存着的 requestId,下次运行用新键;按钮也不再显示"重试运行请求"。和 #217 新的 409 映射一致。 observed:只有exact的记录还不在rows里时才用它,否则用rows里同 id 的最新数据。- 取消后刷新结果:只在有
executionRef时才调用output.refetch()。 - 清理:选中高亮改用
[aria-pressed="true"];删掉了遗留样式、Run的废弃字段和sampleTasks/sampleOutput;e2e 用例名和截图名已对齐。page.test.tsx补了轮询失败保留数据和错误码定位的测试。
CI 全绿。
…owup # Conflicts: # frontend-v2/package.json # v2-server/README.md # v2-server/internal/server/server.go
ObsisMc
left a comment
There was a problem hiding this comment.
复审 head ddd11d4e(上次 Approve 在 bdf38fe6)。
这次只是合进了 main 117d16d0(含 cloud#217/#221/#241)。我在本地用 bdf38fe6 重新合并了一次,冲突只有 package.json、v2-server/README.md、server.go 三处,其余文件和实际合并结果完全一致:
server.go:只多了schedule-resources一条路由,main 的历史/结果/操作路由都在。package.json:api:generate:schedules串上了 runtime 客户端生成,api:check:squads用的是 main 的collaboration路径。- 相对 main 只剩页面、资源和配置接入自身的增量,
schedule-actions/schedule-history两份契约已不在 diff 里。旧枚举的升级和测试沿用 main 的修复。 - 删除 task/workflow 演示 store、picker 这些文件,在上次审过的
bdf38fe6里就有,不是这次合并带进来的。
CI 全绿,没有阻塞问题,Approve。
建议合并前顺手修(都只是 v2-server/README.md 的文档):
- 第 80 行"专用 HTTP 集成测试按此候选 OpenAPI 验证响应……"和第 105 行重复,是合并留下的,删掉一处即可。
- 本 PR 已把页面接上运行操作,第 237 行"前端按钮尚未接入"和第 243 行"配置页面尚未连接运行操作"已经过时。
非阻塞:
- main 上
v2-server/schedule-history.md:21还写着"新底座将旧admission_unknown升级为该状态……",cloud#217 删掉升级后这句已不成立。它不在本 PR 的 diff 里,可以一起顺手修。 - e2e 仍点"开发者登录"。按 owner 在 #796 的说法,W2(cloud#240)合入后再改用
signIn()。
Summary
资源和页面消费:真实资源薄投影、对话绑定、操作/历史客户端;工作流/任务旧引用仅只读兼容。
本轮同步 #221 的复合游标历史契约、合入最新
main(b3b875d7),并补齐页面轮询容错与操作回执交互:execution_busy、execution_target_unavailable、invalid_execution_request、execution_unsupported中文提示,消费错误响应中的params.occurrenceId自动选中已写入记录,并在终态拒绝时释放本地requestId;无executionRef的取消不再发起冗余结果查询;observed优先读取列表同id新状态。.sp-history-list button[aria-pressed="true"]选中高亮,移除旧演示遗留的未引用样式与Run死字段,同步对齐e2e/task-schedules.spec.ts用例与截图命名。本 PR 依赖与审查范围: 消费 #217 和 #221 的操作/历史契约,代码可并行审查。
Evidence
bdf38fe6fe2534e42469036bbfee02cf9444ed90。CI:https://github.com/ora-space/cloud/actions/runs/41164811031 (server/frontend/e2e全绿)。npm run api:check:schedules、npm run lint、tsc -b --noEmit、Vitest 定时任务测试(16/16)、vite build及 PostgreSQLgo test -race -count=1 ./internal/server。Merge Danger
Door: two-way
Blast Radius: v2
v2,不涉及 specs。
Refs ora-space/circus#796