媒体外置
PR 打开或同步时,media-offload Action 会把本次新增/变更的 jpg / png / webp(单文件 ≤ 8MB)上传到 Vercel Blob(public),并把 Markdown 图片 URL 以及 Frontmatter 的 cover、卡牌 front / back 改成外链,然后从 feature 分支 删除这些二进制。
成功态(DEV-MED-01)
- 已是
http(s)://的引用会被跳过,不重新上传。 - 无本地二进制、无需改写时直接成功,不产生空提交。
- Action 只回写当前 PR 头分支,不会推
main/master。 - 仓库需要配置 Actions secret:
BLOB_READ_WRITE_TOKEN(只引用 secret 名,仓内无明文 token)。 - 一次 PR 运行:全部校验 + 全部上传成功后,才改写 Markdown 并删除本地二进制(原子提交)。
失败态(DEV-MED-02)
脚本先 收集全部校验错误再退出,不会先上传第一张再死在第二张。任一失败:exit 1、不提交、工作区还原(没有半改写的 md、没有被删掉的二进制)。
| 情况 | CI | 日志要点 | 上传 | 改写 / 删除 / 提交 |
|---|---|---|---|---|
| 单文件 > 8MB | 红 | 文件名 +「超过 8MB」 | 否 | 否;文件留在分支 |
禁格式(.svg .gif .bmp .tiff .mp4 及非 jpg/jpeg/png/webp 的图片) | 红 | 列出文件 | 否 | 否 |
缺 BLOB_READ_WRITE_TOKEN 且本次有待外置本地图 | 红 | 提示缺 secret;不打印 token/secret 原文 | 否 | 否 |
| 上传半失败(第 2 张失败) | 红 | 上传失败;已上到 Blob 的对象可保留 | 中断 | 不改 md、不删任何本地文件、不提交 |
PR 新增 jpg/png/webp 未被 cover/front/back/![]()/<img> 引用(孤儿图) | 红 | 「未引用」;不允许只上传不挂钩 | 否 | 否 |
| md 引用了相对路径图片但文件不存在 | 红 | 指出引用与缺失文件 | 否 | 否 |
| 回写目标是 main/master | 红 | 拒绝写默认分支 | — | 不推 main |
| 无需改写/删除 | 绿 | skip | 否 | 不产生空提交 |
单元测试:node scripts/check-media-offload.mjs(在临时目录生成 svg / 用 size 夹具测 >8MB,不把禁格式或超限二进制写进本 PR 树)。
站点 Vercel 产线部署属于 DEV-MED-03 / AC-M10,本仓库此阶段不实现。