mcpp index

自動更新

由索引儲存庫的 docs/automatic-updates.md 轉譯而來 —— 單一真實來源,沒有第二份會走樣的副本。

openxlings/xpkgindex-update 每天 02:17 UTC(日本时间 11:17)检查已声明的包;GitHub 的定时任务可能延迟。 在默认分支手动运行同一 workflow 也会执行完整更新流程,可用 package 输入限定一个 namespace:name。

workflow 下载新版本资源、计算 SHA256,每轮最多由 github-actions[bot] 创建三个新 PR, 随后显式触发各 PR 分支上的候选、消费者、站点和 openkal 检查。 候选测试必须真实构建、运行新版本并核对锁文件;普通消费测试同时覆盖其原来选择的版本。 升级失败会保留为 PR CI 的失败结果,交由维护者处理;不会自动合并。

为包声明自动更新

新增或维护包时,满足以下条件就应添加 package.extensions.autoupdate:

  • 公共 GitHub release 或数字 tag 能确定包版本。
  • 下载 URL 有稳定模板,已声明平台的资源均存在。
  • 更新版本不需要修改构建配方、hook 或依赖策略。
extensions = {
    autoupdate = {
        tag = "v${version}",
        url = "https://github.com/acme/foo/archive/refs/tags/${tag}.tar.gz",
    },
},

tag 必须且只能包含一个 ${version}。URL 可使用 ${tag}、${version}、 ${version:dash},可全平台共用,也可按平台声明。 仅当 GLOBAL/CN 资源均已存在且字节一致时,才能声明镜像模板;工具不创建镜像。 即使历史版本有镜像,新版本也可以只声明 GitHub 来源。 URL 不能识别 GitHub 仓库时,回退使用 package.repo。

commit 快照、独立的源码/包版本映射、预发布版本、非 GitHub 来源,以及需要修改配方的升级, 应保留手工维护,在 PR 中说明原因,不要猜测更新规则。当前 xim adapter 不推进 latest.ref。

验证声明

使用 workflow 固定的已 review 工具提交(Python 3.11+):

python -m xpkgindex_update inspect --package compat:foo
python -m xpkgindex_update check --package compat:foo --output plan.json
# 如发现新版本,在干净 worktree 中查看补丁:
python -m xpkgindex_update apply --plan plan.json --package compat:foo

check 必须能解析声明并给出真实上游结果;已经最新时保留该结果,不虚构候选版本。 新增版本须通过候选构建、运行和锁文件检查。上游未来改变 API 或源码布局时,仍可能需要人工适配。

只追加新版本;历史定义、URL、mirror、哈希与注释保留原样。 全平台资源相同时,新 URL/SHA256 前置定义一次,由各平台引用;不同资源分别保留。

workflow 与认证

扫描和构建 job 只有读取权限。只有默认分支的 propose job 获取 contents: write、pull-requests: write、actions: write、statuses: write, 使用固定 CLI 消费原始扫描 artifact,不依赖本地用户 token 或长期 secret。 组织和仓库须允许 GitHub Actions 创建 PR。GitHub 的对应开关也允许审批, 但此 workflow 不会审批或合并 PR。

根据 GitHub 的触发规则, GITHUB_TOKEN 无法提供无人值守的普通 PR 事件 CI,因此提 PR 后显式 dispatch 各 workflow。 消费者和 openkal 的 dispatch 会校验 PR 已打开、属于本仓 bot、head SHA 完全一致、 目标为默认分支且只修改一个描述符,再选择受影响成员。 不带 update_pr 的普通手动消费者验证仍为全量回归。

每包最多保留一个打开的更新 PR;已有人工 PR 修改同一描述符时,也不重复提案,继续使用普通 PR CI。 已关闭的候选不会重新打开。 下一轮能为已有 bot PR 补齐未成功发出的 CI dispatch,不重复提 PR;已有运行(包括失败)不会被静默重跑。 中央配置 的 max_prs 限制每轮新 PR 数量。 更新分支上的 CI 不会递归创建 PR。

提案 job 等待四类 dispatch CI 的真实结果,并将 xpkgindex-update/ci 汇总状态写到 PR 的同一 head。 只有四类均成功才标绿;失败、取消、超时或 head 不一致均不能通过。PR 中的状态链接指向含各 CI 运行链接的提案报告。 GitHub 自动产生的原生 PR 审批请求无需批准;验证使用显式 dispatch 和该汇总状态。

暂时保留 wellwei/libmysqlclient 源故障豁免:扫描错误仍记录,受影响消费者标为 NOT TESTED,不计为成功构建。

普通包 PR 的范围

一般只改描述符、消费测试和必要的 workspace 登记,符合条件就补上自动更新声明; 不适用时在 PR 中说明。站点会从描述符发现包,普通包 PR 不向两份根 README 追加包介绍、 示例或更新记录,也不修改站点配置。只有文档整理或用户明确要求时才调整 README。