DEV-X-04-001 CI 与镜像构建规范
CI 运行位置、镜像架构与证据归档合同;私有证据门禁首批适用 Studio
镜像与制品只构建 linux/amd64
- Oceanway-AI 各仓库的 Docker 镜像、构建矩阵、发布二进制只构建
linux/amd64,不构建linux/arm64。 - 不使用 QEMU/binfmt 模拟构建其他架构;不新增
ubuntu-24.04-arm等 arm64 runner 矩阵。 - 原因:2026-10-16 在 oceanway4 自托管 runner 上模拟构建 arm64,runner 两次因内存耗尽(OOM)被杀。
- 例外:桌面客户端(如 codex-config)在 macOS/Windows 原生 runner 上产出的本机安装包不受此条约束;它们不在 oceanway4 上构建。
自托管 runner 使用
- PR 与 main 检查运行在 oceanway4 的仓库专属 runner(标签
self-hosted, linux, x64, oceanway4, <仓库>)。 - 多个仓库共用同一主机:避免同时触发多个重型任务(Next.js 构建、镜像构建、E2E);服务容器使用随机宿主端口。
证据质量与存储后端
本节私有证据合同首批正式适用于 oceanway-studio 的 Runtime 首期收口。其他仓库保持各自已接受的检查和发布范围,迁移必须逐仓配置、验证并登记;共享 oceanway4 Runner 不代表所有项目已经采用同一归档后端,也不要求文档站额外增加签名或 SBOM job。
测试、构建计算与证据持久保存分别验收。证据后端不限定 GitHub Artifact,优先复用现有私有存储和异机副本;GitHub 保留调度、检查状态、日志和安全索引。能看到 Actions 日志或 Step Summary,不能代替测试报告、截图、Runtime 回执和发布文件的完整归档。
- 每份证据绑定实际
repository/sourceSha/runId/runAttempt/job/artifact;PR 使用实际被验 head,不能将 merge SHA、旧源码或前一次 attempt 的成功记给当前任务。只重跑失败 job 时,保留复用的原成功 job 来源。 - Manifest 记录每个文件的相对路径、大小和 SHA256,外部 Manifest 与归档内部原件逐字一致;拒绝路径穿越、链接、重复或未列成员,不截断文件凑成成功。
- 主存储与独立异机副本都必须完整读回,核对整个归档和清单内每个文件的大小/SHA256。只有两份均通过才返回成功回执;远端存在、HEAD 请求或远端自报 hash 均不足以替代实际读回。
- 同一来源引用不可覆盖;重试沿同一源码/运行/attempt/job 及原文件字节,冲突或损坏必须关闭门禁。后端写入、完整性、权限或副本失败都不能通过
continue-on-error变成绿灯。 - 成功与失败证据均按适用任务尽力归档,原测试失败保持。可选的“测试未执行因而无浏览器诊断”必须显式声明;Runtime、镜像和签名等必需证据须存在且非空,可选输入不豁免后端故障。
- 回执与公开索引只包含来源、私有定位及校验值,不输出凭据、客户数据或签名 URL。首期全量保留,不自动删除历史;容量不足时归档失败,后续清理须有明确范围和保留副本。
Runner 权限与实际执行环境
归档代码、配置和主机密钥信任由 root 保护;Runner 使用各自独立身份与0700目录,归档/私钥0600,远端身份只接受受限内容寻址保存和读取。复用当前服务已允许的写入范围,不为归档放宽 systemd/SSH 全局权限。迁移目录必须保留旧配置、旧对象和主目录代际索引;不因当前配置变化丢失旧私有引用的定位。
验收必须覆盖实际 Runner 服务挂载环境和 UID,执行完整仓库 CLI:来源判定、文件采集、受保护客户端、主/异机读回、原始回执、GITHUB_OUTPUT 和 GITHUB_STEP_SUMMARY。仅在服务外切换 UID 的 canary 不能证明服务内可写;进入 mount namespace 的合成验证也不等于复制服务 seccomp/cgroup,正式流水线仍是独立门禁。归档发布前分别检查主、副目标文件系统的20%空闲水位及本次写入余量,不通过删除未知文件或降低证据质量绕过容量保护;该检查不对同盘其他写入方设置配额。
不可变镜像与发布证据
Studio 镜像摘要通过任务输出交接,并从镜像仓库重新读取验证。发布使用不可变 OCI digest,核对实际源码 revision 与平台 linux/amd64;签名和 SPDX SBOM attestation 绑定同一最终 digest,在 registry 验真,验证结果与构建 metadata、最终 manifest、SBOM 一同纳入上述私有归档。不得用本机 image ID、可变 tag、旧镜像签名或未校验的上传回执替代。
依赖缓存、type=gha Buildx cache 与验收证据是不同用途。缓存可以命中、失效或重建,不能充当证据副本;更换证据后端不表示所有 GitHub 存储服务都已取消。本节不要求为了私有证据迁移而同时更换仍在使用的缓存。
规范与实现边界
本页约束门禁质量,仓库维护说明记录实现和命令。Studio 固定源码f3d57c0的 CI 维护说明不能自行放宽本页要求,也不能把镜像工作流成功表述为已部署、已恢复或已灰度。
私有宿主实现索引为 Infrastructure PR30,已合入 5e77c06ea26598e3f1e17f966b25e0b74541cb89;该 main 的正式检查39022275198通过57项纯合同测试。此处固定实现来源,不代表 Studio 或其他项目全部 CI 已绿。本轮 Studio 正式运行、完整证据归档、最终镜像、预发布/备份恢复和仅原验收账号灰度的完整终态,仍须在 PROC-02-005分项登记;工作包保持未结项时,不以本规范或基础设施代码检查代验。