跳到主要内容

媒体外置

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,本仓库此阶段不实现。