发行与验收¶
MoonSmith 的四个模块共用一个版本号。发布从已合入 main 的固定提交构建,工具链及宿主依赖见
安装要求。预编译程序覆盖 macOS arm64 与 Linux x86_64,分别在 macOS 15
与 Ubuntu 24.04 的官方 runner 上构建。
工作流职责¶
文件名前缀只表示触发条件。ci 监听 push、pull_request 和 merge_group,其中 push 可以省略。
ce 使用定时或手动触发。cd 可以包含与 CI 相同的检查,其余触发用于发版,例如推送版本标签。
policy 和 automation 不受这三项限制,触发也可以与 CI 相同。
| 工作流 | 职责 |
|---|---|
| CI - Static Checks | 仓库静态门禁与 CodeQL |
| CI - Tests | 行为测试、覆盖率与双平台固定旧工具链的历史复现 |
| CD - Publish | PR 与标签的构建、包验收和打包;标签推送时完成种子 0–99 的完整验收后发布,再核对已发布产物 |
各工作流的检查结果和验收材料由对应运行保存。All Required Checks Passed (Tests) 和 All Required Checks Passed (Static Checks) 分别汇总对应工作流的上游 job,任一结果为 failure 时失败。合并规则还要求 All Required Checks Passed (Policy)。
推送版本标签后,构建和完整验收都通过才执行发布。
CD 不调用测试或历史复现工作流。
PR 发布构建¶
每个指向 main 的 PR 创建、更新或重新打开时,都会触发 CD 的双平台 build job。
它与正式发布共用 native release 构建、CLI 打包、解包启动检查、四模块打包检查和包验收。
种子 0–99 的完整验收、publish 和已发布产物核对只在推送版本标签时执行。
PR 产物文件名包含版本、PR 编号与实际检出提交的短 SHA,例如
moonsmith-0.0.1-pr.49-COMMIT-macos-arm64.tar.gz。默认检出 GitHub 的 PR 合并测试提交,
完整提交身份写入 build.json,便于区分 PR 更新及基线变化。
两个平台的 CLI 与模块 zip 包保存为 Actions artifacts,保留 21 天。
构建只需要只读权限,也适用于 fork PR;凭据只属于标签发布 job。
重跑使用相同构建步骤,不修改模块版本、Git 标签或 registry。 产物按 workflow run 隔离,同一运行重跑时替换该平台的同名 artifact; PR 的新提交取消该 PR 的旧构建,正式发布之间继续串行执行。
产品验收¶
CD - Publish 在指向 main 的 PR 上执行包验收。推送 vVERSION 标签时,同一验收额外执行种子 0–99
的完整验收;任一平台失败则不发布。PR 上的验收结果不能代替该标签上的完整验收。
包验收参考 MoonBit 官方 x 的工作流, 直接使用 MoonBit 命令在两个平台验证:
- 通过
moon work sync检查内部依赖版本,打包四模块后解包到仓库外。 README、许可证和模块清单与原文件一致;类型检查和全部原生行为测试使用解包后的源码与 C 文件。 测试所需固定案例和任务配置另行复制,不将仓库产品源码混入包验收。 - 公开库示例可以生成等价组并调用 Engine;CLI 可以从解包模块安装。
- 安装后的程序执行种子 42 的五配置普通任务和等价任务;搬迁材料后重放仍成功, 原始文件保持不变,新执行及组记录追加。
- 标签上的完整验收额外执行种子 0–99 的五配置等价检查,记录每份源码、配置、原始观察和任务汇总。
- 当前编译器分别执行种子 1272、3745、6968;存在独立确认材料时再次重放,保存实际结果。
静态检查、覆盖率和性能基准由各自 CI/CE 负责。CI - Tests 用 0.10.18 构建 MoonSmith,再分别调用
0.10.14+7d59c7ec9 和 0.10.11+6ff76a5f9。0.10.14 在仓库外验证三例构建异常的自动归约、独立确认和重放;
入口见贡献指南。
本地可直接使用工作流中的 MoonBit 命令检查解包模块,或对已安装程序运行共享的入口:
bash scripts/check-installed.sh /absolute/path/to/moonsmith /tmp/moonsmith-installed-check
输出目录必须尚不存在,用于保留执行日志、原始材料和重放结果。该入口由包验收与已发布产物验收共用, 读取公开 CLI 配置,依赖 Bash、jq 和 SHA-256 工具。 验收不维护自定义 Python 框架。
正式发布¶
正式发布前由维护者确认具体提交和版本。通过 GitHub 仓库的安全入口配置
MOONCAKES_CREDENTIALS,其内容为拥有四模块发布权限的 Mooncakes 凭据 JSON。
推送该提交的 vVERSION 标签后,CD - Publish 同时进行构建和完整验收,二者都通过后才发布:
- 核对标签指向检出提交、提交属于
main、四模块版本与标签一致,并存在对应发行说明。 - 在两个平台执行与 PR 相同的 native release 构建、打包、解包启动和模块归档检查。
- 在两个平台执行包检查、历史种子重放和种子 0–99 的五配置等价验收。任一平台失败则不创建 Release,
也不执行
moon publish。 - 创建或复用该标签的 Draft Release,按 contracts → engine → moonbit → CLI 顺序直接运行
moon publish。任一模块失败即停止后续发布。 - 为两份 CLI 附件生成
SHA256SUMS,上传附件并公开 GitHub Release。 - 下载已公开的两份 CLI 附件并校验摘要,再从 Mooncakes 安装精确版本,验证库消费、CLI、材料搬迁和重放。 这一步失败不会撤回已经公开的 Release 或已发布的模块。
发布沿用官方 async
和 x 的 moon publish 入口。
凭据只在发布步骤临时写入 MOON_HOME/credentials.json,权限为 0600,
步骤结束时清除。已经公开的 Release 不作为 Draft 覆盖。部分模块发布成功后发生失败时,成功版本
仍保留在 Mooncakes;先核实 registry 状态再处理剩余发布,流程不会自动跳过或覆盖已存在版本。
产物与材料¶
| 文件或位置 | 内容 |
|---|---|
moonsmith-VERSION-macos-arm64.tar.gz |
macOS arm64 CLI、许可证、README 及构建身份 |
moonsmith-VERSION-linux-x86_64.tar.gz |
Linux x86_64 CLI、许可证、README 及构建身份 |
Release 中的 SHA256SUMS |
上述两份 CLI 附件的 SHA-256 |
CD - Publish 的 acceptance-PLATFORM artifact |
模块包、解包测试、历史种子与安装重放;标签运行还包含种子 0–99 |
CI - Tests 的历史证据 artifact |
固定旧工具链的异常复现、归约、确认和重放记录 |
CD - Publish 的 distribution-PLATFORM artifact |
已发布二进制与 registry 安装的验收材料 |
下载 CLI 附件后,macOS 使用 shasum -a 256 -c SHA256SUMS,Linux 使用
sha256sum -c SHA256SUMS 校验。校验和列出两个平台附件,完整校验时应一并下载。
验收材料使用标准 tar 归档并由 GitHub Actions artifact 保存,构建缓存不入包。
历史异常的生成 C 文件随历史证据保存。执行记录可能包含当时的绝对路径,重放时使用实际解包位置。
组内材料关联使用相对路径,可随所属案例一起搬迁:
moonsmith replay /absolute/path/to/case-directory
moonsmith replay /absolute/path/to/group-directory
原万例实验与人工调查材料已附于 0.0.1 Release,
其摘要见历史材料清单,
可在历史压缩包所在目录使用 jq 和 shasum 校验:
jq -r '"\(.sha256) \(.file)"' /absolute/path/to/moonsmith/.github/release-evidence.json |
shasum -a 256 --check -
该 Release 还包含双平台历史编译器复现和发行安装材料;来源及范围见附件
EVIDENCE.md,
五个证据包使用 SHA256SUMS-EVIDENCE 校验。后续需要长期公开的材料由维护者附到对应 Release。
适用版本与原始结果见规模验收、归约演示
和构建异常分析。
已发布产物验收¶
发布公开后,CD - Publish 以只读权限在该标签的提交上继续核对已发布产物。它下载两份 CLI
附件并校验摘要,在各自平台解包运行五配置普通任务与等价任务,再从 Mooncakes 安装精确版本,
验证库消费、CLI、材料搬迁和重放。结果与失败材料保留在该次运行中,不撤回已经完成的发布。
0.0.1 的双平台发行安装、库消费与重放结果见CLI 安装验收, 实际安装入口见README。后续版本发布后按相同流程核对,再更新安装说明。