# 发布候选与受限资源验收 ## 质量门 PR 的 `Quick verify` 工作流只执行 `make check`,覆盖全部 Go 包、React、前端构建、OpenAPI 生成一致性、Lint、类型检查和单元/集成测试,不构建容器镜像。涉及界面或浏览器行为的发布变更按[浏览器验收清单](./browser-acceptance.md)另行记录实际结果;本地发布检查和 CI 均不执行浏览器验收。推送 Release Tag 后,`Release image` 工作流重新执行质量门,再在原生 amd64、原生 arm64 执行 Delivery Index benchmark、构建镜像、容器 smoke 和并发 `1` 的图片处理 benchmark。只有全部验证成功的同一镜像才会推送对应平台标签;两个架构都成功后才创建版本与 `latest` manifest。 图片处理 benchmark 每个架构总计 `16` 个请求,容器限制为 1 CPU、768 MiB 和 256 PID,并强制要求全部请求成功、无 busy 响应、p95 不超过 20 秒且 cgroup 峰值不超过 512 MiB。 Release smoke 还会验证: - 公开标准 URL 和别名的 Range、条件请求、HEAD 与相同 ETag。 - 固定 `10001:10001`、exec-form ENTRYPOINT 和内置健康检查。 - 只读 `/data` 能给出明确权限错误。 - 运行镜像不存在 Node、Go、编译器、源码、测试素材和 libvips 开发文件。 - 少量串行读、巡检和索引重建后,临时文件为零,goroutine 与文件描述符没有持续增长。 - SIGTERM 在超时内以退出码 `0` 完成。 ## 多架构 OCI manifest 推送符合语义版本格式的 Git tag,例如 `v1.0.0-rc.1`。`Release image` 只能由该 tag push 自动触发,不接受手动运行;标签提交必须属于 `origin/main`,所有 release 全局串行。工作流以 fail-closed 方式查询 GHCR,在两个原生 runner 分别构建和 smoke,验证镜像中的提交 revision,再使用两个平台 digest 创建版本 OCI manifest。版本 manifest 验证成功后,同一组 digest 会更新可变的 `latest`;旧版本任务重跑时若检测到更晚提交的 release tag,则不会回滚 `latest`。同一 tag 的同一提交重跑时会核对 content tag、平台 digest 和版本 manifest,内容完全一致则幂等通过,任何不一致都拒绝覆盖。 发布后再次确认: ```bash docker buildx imagetools inspect ghcr.io/willxup/imagesilo:v1.0.0-rc.1 docker buildx imagetools inspect ghcr.io/willxup/imagesilo:latest ``` 输出必须同时包含 `linux/amd64` 和 `linux/arm64`。 ## 外部 amd64 主机受限验收 远程验收严格使用规范化后的空 `/var/tmp/imagesilo-*` 独立目录,默认只占 `0.5` CPU、`256m` 内存、`128` PID,处理并发固定为 `1`。脚本只要求 Docker、curl、Python 3、base64 和系统哈希工具,不要求安装 jq。默认连续运行 10 分钟,所有请求串行: ```bash ssh cd /var/tmp/imagesilo-acceptance-src IMAGE=ghcr.io/willxup/imagesilo:v1.0.0-rc.1 \ WORK_DIR=/var/tmp/imagesilo-acceptance-v1.0.0-rc.1 \ CPU_LIMIT=0.5 MEMORY_LIMIT=256m DURATION_SECONDS=600 \ bash scripts/remote-release-acceptance.sh ``` 脚本不会删除 `WORK_DIR`。结果、日志、测试图片、SQLite 和正式文件全部归拢在该目录;只会移除临时容器。验收记录包含 cgroup 当前/峰值内存、goroutine、文件描述符和实际串行轮次。 ### v0.1.0-rc.1 验收记录 提交 `b866eebcd411a38fba2365786a1fa05ed4cc443d` 已在外部原生 amd64 共享主机上完成: - 构建器限制为 CPU 0、1 CPU quota、1 GiB 内存;镜像内 vips 测试通过后删除 builder。 - 候选镜像大小 `94,845,421` 字节,固定 `10001:10001`、exec-form ENTRYPOINT 和内置健康检查。 - 运行限制为 0.5 CPU、256 MiB、128 PID、处理并发 1,连续 600 秒完成 118 轮串行校验。 - cgroup 当前内存 `14,135,296` 字节、峰值 `35,938,304` 字节;goroutine `10 → 8`、FD `10 → 10`。 - 启动 RSS `20,402,176` 字节;上传后概览 RSS `43,679,744` 字节,结束 RSS `26,570,752` 字节。 - SIGTERM 正常退出,测试容器、builder 和临时候选镜像已删除。 - 源代码、构建元数据、失败前置检查和最终验收结果保留在 `/var/tmp/imagesilo-v0.1.0-rc.1-phase7-20260730`,总计约 2.0 MiB。 ### v0.1.0-rc.1 发布记录 - 标签提交:`976a4a495e415de042ecb6d9758222b4ba5daf0d`。 - 自动流程:[Release image run 30505989284](https://github.com/Willxup/imagesilo/actions/runs/30505989284),事件为 tag `push`,质量门、原生 amd64/arm64 构建、完整容器 smoke 和 manifest 校验全部成功。 - GitHub:[ImageSilo v0.1.0-rc.1 Pre-release](https://github.com/Willxup/imagesilo/releases/tag/v0.1.0-rc.1)。 - GHCR:`ghcr.io/willxup/imagesilo:v0.1.0-rc.1`,匿名 registry 请求返回 HTTP 200。 - OCI manifest:`sha256:573233d00455ab6e8dad9d875ad0ede7f770436ce24bb05f6d21bc02fac053cc`。 - amd64:`sha256:ee410a57912c125234e5547520a1f5b38a253649cfeec88aec34d53903838ad8`。 - arm64:`sha256:a5437e2348e74a9aaa53e0ac7f685c379153d9183362651e1a88a077f9f9452d`。