9 Commits
Author SHA1 Message Date
xuyueandClaude Opus 5.5 f1c4e89ec5 chore(部署): push origin 就由开发机编好传上去,不再绕道海外,晚上也是一分钟左右上线
Deploy / deploy (push) Failing after 37s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 11:08:03 +08:00
xuyueandClaude Opus 5.5 bcadab40b2 chore(部署): 同步到服务器少传约 20%,线路断了自动续传,不再一直卡着
Deploy / deploy (push) Canceled after 0s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 10:50:42 +08:00
xuyueandClaude Opus 5.5 b046af4ba0 chore(部署): push 后先过检查再部署;判题机重启那几秒交的题不再变成系统错误;worker 挂了看得出来
Deploy / deploy (push) Canceled after 0s
按外部分析报告(reports/analysis)挑出来做的几条:
- CI 在编完前端之后跑 `bunx vp run verify`,有一项不过就不部署(必须排在编前端之后:
  前端类型检查要的 auto-imports.d.ts / components.d.ts 是 vite build 时才生成的)
- 连不上判题机(连接被拒、解析不到、被重置)时,正式判题等 2/5/10 秒重试,不再当场记成
  系统错误;超时、判题机回错、页面上的运行和自测不重试
- worker 每 10 秒刷一次「还活着」,compose 加 `oj2-api healthcheck --worker`,deploy.sh 起栈后
  也等 worker 健康(docker 不会因 unhealthy 自动重启,只是看得见、部署时拦得住)
- 三套 compose 的容器日志限 10MB × 3
- `/public/%` 这类畸形编码回 404 而不是 500;找不到的接口回统一的 JSON 错误
- 删掉没人用的「停用判题机」接口,契约不再给 task_number / is_disabled(列留在库里)
- 删掉腐化的 apps/web/tests/submitButtonState.test.ts;契约包 zod 范围对齐到 ^4.6.6
- 修几处和实际对不上的注释与文档(表数、编译并发、AST 语言数、deploy.sh 流程、校验处数)

⚠️ 改了 compose 的日志配置,这次部署会把 postgres / redis / 判题机也重建一遍,各停几秒

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 20:59:19 +08:00
xuyueandClaude Opus 5.5 eb0309ae35 chore(构建): Bun 锁到 1.4.4,CI 和镜像不再跟 latest;后端类型检查换成 bun check
单二进制把运行时一起打进去,CI 装的是几线上就是几,之前三处都不锁(@types/bun latest、
setup-bun latest、oven/bun:1),1.4.x 每版都有破坏性变更会悄悄上线。
顺带 bunfig 加 minimumReleaseAge = "3d",@types/bun 除外。
后端 typecheck 从 tsc 换成 bun check,1.9s → 0.26s,报错一致。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 09:13:21 +08:00
xuyueandClaude Opus 5.5 2b4676ae34 ci(部署): 推 origin 时 Gitea 也会拿这份工作流再部署一遍,改成只在 GitHub 上跑
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 00:04:16 +08:00
xuyueandClaude Opus 5 64cb7b62ef ci(部署): 手动触发可放行破坏性迁移,push 触发永远不放行
Deploy / deploy (push) Has been cancelled
deploy.sh 现在会在起栈前跑迁移,但 CI 没法传 OJ2_ALLOW_DESTRUCTIVE,
于是任何破坏性迁移都会让自动部署一直红着,且没有出口。

给 workflow_dispatch 加一个 allow_destructive 布尔 input,经 env: 传到
ssh 命令里。push 触发拿不到 inputs,值恒为空 —— 也就是说**自动部署永远
不会执行 DROP TABLE 之类的迁移**,只会停在闸门上把工作流判红。这是有意的:
那种改动得有人先确认备份,不该由一次 git push 顺带完成。

日常的加索引 / 加列属于非破坏性,CI 部署会照常自动执行,无需干预。

留了一条注释标明必须用 `inputs.` 而不是 `github.event.inputs.`:后者会把
布尔字符串化,没勾选时拿到字符串 "false",那是非空字符串、在 `&&` 里为真,
等于每次手动部署都无条件放行。

验证:本机 YAML 解析通过,确认 inputs 定义挂在 workflow_dispatch 下。
表达式三种情况的语义(勾选 → '1'、未勾选 → ''、push 事件 inputs 为空 → '')
是 GitHub 表达式的既定行为,要真的 push 到 github 才跑得起来。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 08:38:47 -06:00
xuyueandClaude Opus 5 66d325d460 ci(部署): rsync 加 --no-owner --no-group,别把 runner 的 uid 搬到服务器
Deploy / deploy (push) Has been cancelled
服务器上 `git pull` 报「检测到可疑的仓库所有权」:

    drwxr-xr-x 9 1001 1001  /root/OJDeploy/OJ2
    drwxr-xr-x 8    0    0  /root/OJDeploy/OJ2/.git

原因是 `rsync -a` 展开含 `-o -g`(保留属主/属组),接收端又是 root,
所以源端的 uid 会被真写上去 —— GitHub 托管 runner 的 runner 用户是 uid 1001。
而 `.git` 在 --exclude 里,一直是当初手动 clone 时的 root。两者对不上,
git 2.35.2 起的 safe.directory 检查就把服务器上所有 git 操作挡下了。

加 --no-owner --no-group 之后文件落地归 ssh 登录用户(root)所有,不再错位。

注意这只防复发,**不修复已经错位的目录**:rsync 不带 -o/-g 时不会去改已存在
文件的属主。服务器上还要手动跑一次

    chown root:root /root/OJDeploy/OJ2

只改这一个目录,**不要 -R** —— git 的属主检查不递归,而 OJ2/data 下可能是
「自带数据」形态的整个 postgres 数据目录和判题沙箱以别的 uid 建的运行目录,
递归 chown 会让它们起不来。

这个问题一直都在,只是以前没在服务器上跑过 git 命令所以没撞上。

验证:只做了 YAML 语法校验 —— 这条工作流要真的 push 到 github 才跑得起来,
本机验不了。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 08:08:06 -06:00
xuyueandClaude Opus 5 d3365ecb32 ci(部署): actions/checkout v5→v7、actions/cache v4→v6
Deploy / deploy (push) Has been cancelled
`oven-sh/setup-bun` 已经在最新大版本(v2.2.0 属于 v2 线),不动。

**actions/cache v4 → v6** 是这次的实际收益:v4 跑在 **node20** 上,GitHub 正在
退役这个 runtime;v6 是 node24,和另外两个 action 一致。v6.0.0 的改动是「迁到
ESM + 更新依赖」,没有输入输出上的破坏性变更。

  ⚠️ cache v5 起要求 Actions Runner >= 2.327.1。这里 `runs-on: ubuntu-latest`
  是 GitHub 托管的、始终满足;哪天换自建 runner 要留意这条(已写进 yml 注释)。

**actions/checkout v5 → v7**:v5 本来就跑在 node24,运行时没变。两条标了
BREAKING 的改动都打不到这个工作流:

- `allow-unsafe-pr-checkout`(更安全的 pull_request_target 默认值)已经反向
  移植到 v2 到 v6 所有线,v5 上本来就有;
- v7.0.0 的「block checking out fork pr」只影响 `pull_request_target` 和
  `workflow_run`。

本工作流的触发器只有 `push: main` 和 `workflow_dispatch`,两者都不涉及。

版本按仓库原有习惯钉大版本号,没钉到 patch。

验证:只做了 YAML 语法校验 —— **这条工作流要真的 push 到 github 才跑得起来,
本机验不了**。下次 `git push github main` 时留意一下 Actions 那边。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 00:01:28 -06:00
xuyueandClaude Opus 5 6356643cc9 ci(部署): 部署走 GitHub Actions,产物挪到 runner 上编
Deploy / deploy (push) Has been cancelled
服务器性能差,镜像 builder 阶段(1238 个包的 bun install + bun compile +
vite build)首次约 5 分钟,光前端就 160s。改成在 runner 上编好 dist/oj2-api
和 apps/web/dist,rsync 过去,服务器那边只剩几条 COPY。

服务器自己编的能力没有砍掉。Dockerfile 顶部加了全局 ARG ARTIFACTS:

  build(默认)    builder 阶段自己编,只要有 docker 就能手动部署
  prebuilt         用构建上下文里现成的产物,builder 不进构建图

实现是两个 scratch 阶段归一成 /artifacts/ 布局,再用变量阶段名
FROM artifacts-${ARTIFACTS} 选一个,运行时阶段不关心产物是谁编的。

deploy.sh 加 --prebuilt:产物缺失在自检就 die;顺带检测 buildx —— 没装的话
compose 会退回 classic builder,那个不看依赖图、所有阶段挨个跑,产物白编
(结果正确但不省时间),黄字提醒不阻断。

.dockerignore 末尾放行两个产物路径,必须在 dist/ 那些规则之后,
dockerignore 是最后一条匹配说了算。

顺手删掉 apps/web/.github/ —— 从 ojnext 抄来的残留,路径不对(GitHub 只认
仓库根的 .github/workflows/)从来没跑过,内容也是 ojnext 的。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 18:30:22 -06:00