mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-20 16:07:11 +08:00
feat(ql3): close local alpha milestone
This commit is contained in:
@@ -11,6 +11,8 @@
|
||||
|
||||
最新增量证据(2026-08-27):
|
||||
|
||||
- D-413/ADR-0508(已实现,首份真实 milestone artifact 待授权):Local Alpha 不再把两个矩阵 job 各自上传的 amd64/arm64 大归档直接视为阶段版本。新增独立发布期 `local-alpha-milestone` finalizer,只有完整 `QingLong 3.0 CI` 的 19 个 job dependency 全部成功后,才重新下载并离线审计两套 v2 Trial Kit,要求同一 version/source/workflow SHA/run/attempt、精确 `amd64|arm64`、四个不同 Application/operator image ID、两个不同 archive digest 与 verification digest,再上传 `qinglong/alpha-local-milestone@v1` 三文件小型索引。没有 index 的孤立 artifact 明确是失败运行中间文件,不能交付用户。手动门新增 `alpha_artifact_scope=local|cluster|all` 且默认 Local,避免路由/NAS 试用无谓生成八套 Cluster archive;完整测试不因 scope 缩小。显式 milestone 以 run ID 隔离并发域且不被后续普通 push 取消,source 仍绑定触发时 exact SHA。该 finalizer 不新增 workspace package、镜像 layer、设备依赖、daemon、listener、timer、连接池或稳态 RSS;真实可下载产物仍需维护者明确触发 `produce_alpha_artifacts=true + alpha_artifact_scope=local` 后记录 index 与双 bundle digest。
|
||||
|
||||
- D-412/ADR-0507(已实现,真实公开发布待受保护 tag):Public Local Release Set 从“只签 Application、用户旅程却依赖另一个未发布 operator”的断层收敛为一对分别构建、扫描、签名和 multi-arch attestation 的镜像:`local` 是唯一常驻 Application,`local-operator` 只承担 setup/upgrade/recovery 等短生命周期 Owner authority。release candidate 的 Local scope 精确包含两者,并分别要求 Application Edge/Standalone rollout 与 operator `--version`/`setup --help` 门;CI OCI 证据、OS 漏洞策略、release-set、catalog consumption、final tag closure 和 Local selection 均按六镜像总闭包升级。`qinglong/release-set-image-record@v2`、`qinglong/release-set@v4`、`application/vnd.qinglong.release-set.v4+json`、`qinglong/local-compose-release-image@v3` 与 `qinglong/local-compose-image-selection@v3` 失败关闭旧孵化 schema。Compose revision 只保存 operator digest 作为管理 authority,不生成 operator service,所以路由设备稳态仍只有 Application,没有新增进程、listener、timer、端口或 RSS;管理动作才短暂下载/运行 operator。18-package clean build 退出 0,package boundary 保持 18 packages、`singleSourcePackages=[]`、`shallowSourcePackages=[]`;Local Owner CLI 为 301 total / 294 pass / 7 conditional skip / 0 fail,backend 为 1,610 total / 1,608 pass / 2 conditional skip / 0 fail,静态 release workflow 审计 100/100。该切片证明发布机制闭合,不冒充已经存在 GHCR tag 或真实用户可下载 Public Release Set;首份正式可交付物仍需受保护 release tag 的六镜像、签名、catalog-bound Local/Cluster 部署证据和终态 closure。
|
||||
|
||||
- D-411/ADR-0506(已实现,真实 downloadable v2 artifact 待授权):Local Alpha materializer 不再凭调用 `create` 就把九个 gate 无条件写成 `passed`。bundle schema 升为 `qinglong/alpha-local-trial-kit@v2`,新增 `verification-evidence.json`,其 subject 精确绑定版本、source、Tier-1 架构与 Application/operator image ID,workflow 精确绑定 `whyour/qinglong/.github/workflows/ql3-ci.yml@refs/heads/next`、workflow SHA、`workflow_dispatch`、`local-image`、run ID/attempt。CI 静态门固定 `fresh journey → native cancellation → record-verification → create → audit → upload`,evidence 作为第七个闭合文件进入 manifest byte/SHA-256 与 `SHA256SUMS`;create/audit 均拒绝跨源码、跨架构、跨镜像或跨 workflow 复制。旧 v1 bundle 因没有来源证明只保留为工程候选。提交 `4239464a` 的主 CI run `32990652047` 已 40/40,Kubernetes run `32990652416` 与三节点 Security run `32990653482` 同源成功,证明源码的双架构门;但本地 `4239464a` v1 archive 不是 exact CI artifact,仍不能冒充 v2 用户 Alpha。该增强只增加一个小型发布期 JSON,不新增 workspace package、镜像 layer、设备依赖、常驻进程、RSS 或端口;首个真实双架构 v2 下载物仍需维护者显式授权 milestone workflow。
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
# ADR-0508:跨架构 Local Alpha 里程碑闭合
|
||||
|
||||
- 状态:Accepted(首份实际 milestone artifact 待维护者授权)
|
||||
- 日期:2026-08-27
|
||||
- 决策:D-413
|
||||
- 关联:ADR-0503、ADR-0504、ADR-0506、ADR-0507
|
||||
|
||||
## 背景
|
||||
|
||||
Local Alpha workflow 已能在原生 amd64、arm64 runner 上分别生成 Application/operator 双镜像 Trial Kit,但两个矩阵作业各自上传 artifact。只要其中一个架构上传成功,GitHub Actions 页面就会留下一个可下载大归档,即使另一架构、PostgreSQL HA、资源门或其余完整 CI 随后失败。
|
||||
|
||||
这类孤立文件证明一个矩阵作业曾走到上传步骤,不能证明 QingLong 3.0 已形成阶段版本。开发二十天后的阶段产物必须有一个用户可识别的成功终态,而不是让部署者从几十个 job 和零散 artifact 猜测“哪些可以用”。
|
||||
|
||||
原有 boolean 还会同时生成 Local 两套与 Cluster 八套原生归档;只想验证低配路由/NAS 的维护者必须无谓承担 Cluster artifact 的构建归档和存储成本。手动 milestone 与普通 `next` push 共享 `cancel-in-progress` 并发域,也可能在大归档生成过程中被后续提交取消。
|
||||
|
||||
## 决策
|
||||
|
||||
### 1. Local Alpha 必须以跨架构 milestone index 为完成信号
|
||||
|
||||
新增发布期脚本 `ql3-local-alpha-milestone.cjs`。`local-alpha-milestone` job 只有在完整 `QingLong 3.0 CI` 的所有现有 job 成功后才运行,并重新下载、离线审计同一 run/attempt 的 amd64 与 arm64 Trial Kit。
|
||||
|
||||
finalizer 精确要求:
|
||||
|
||||
- 两套 bundle 具有同一版本、完整 source revision、workflow SHA、run ID 与 attempt;
|
||||
- 架构集合恰好为 `amd64|arm64`;
|
||||
- 两个 archive digest、两份 verification digest 和四个 Application/operator image ID 相互分离;
|
||||
- 每套 bundle 自身的七文件闭包、SBOM、manifest、verification evidence 与 checksum 继续由 v2 auditor 通过;
|
||||
- artifact 名称从 source 与架构唯一推导,调用方不能自报。
|
||||
|
||||
成功后只上传三文件小型索引:`manifest.json`、`README.md`、`SHA256SUMS`,schema 为 `qinglong/alpha-local-milestone@v1`。索引绑定两个 artifact 名、各自 bundle manifest digest、archive digest、镜像 ID、verification digest 和 workflow identity。没有该索引的零散 Trial Kit 明确是失败或未闭合运行的中间文件,不是阶段交付物。
|
||||
|
||||
### 2. 手动产物按产品域选择
|
||||
|
||||
保留显式 `produce_alpha_artifacts=true` 授权,并增加 `alpha_artifact_scope=local|cluster|all`,默认 `local`:
|
||||
|
||||
- `local` 只归档两套 Local Trial Kit 并生成 milestone index;
|
||||
- `cluster` 只归档 Cluster Integration Candidate 原生镜像,不生成 Local index;
|
||||
- `all` 同时生成两类。
|
||||
|
||||
无论选择哪个归档 scope,完整 CI 仍执行;scope 只控制大体积 artifact 的物化和上传,不跳过测试门,也不改变 Edge/Standalone/Cluster runtime closure。
|
||||
|
||||
### 3. Milestone run 不由普通 push 取消
|
||||
|
||||
普通 push/PR 继续共享 validation 并发域并允许 newer run 取消旧 run。显式 artifact milestone 使用自身 run ID 作为并发域,`cancel-in-progress=false`;后续 push 不会中断已经授权的双架构产物。checkout、evidence 与 index 仍绑定触发时的 exact SHA,不读取移动后的 branch head。
|
||||
|
||||
## 被拒绝的替代方案
|
||||
|
||||
### 把两个独立 artifact 都称为 Alpha
|
||||
|
||||
拒绝。部分上传、另一架构失败或完整 CI 失败时没有唯一成功信号,部署者无法可靠裁决成熟度。
|
||||
|
||||
### 把两个架构 archive 再复制进一个总 artifact
|
||||
|
||||
拒绝。每位用户只需要自己的架构;总包会重复下载和存储数百 MiB,并对低容量设备无益。小型 index 足以闭合身份和 digest。
|
||||
|
||||
### Local 两个矩阵 job 成功后立即发布 index
|
||||
|
||||
拒绝。同一源码的 backend、资源、供应链、PostgreSQL HA 或 Kubernetes live gate 仍可能失败。阶段版本必须等待完整 CI,而不是只等待镜像局部路径。
|
||||
|
||||
### 赋予 finalizer 删除孤立 artifact 的权限
|
||||
|
||||
拒绝。索引缺失已经能失败关闭,增加 `actions: write` 和删除 authority 会扩大 workflow 权限与事故半径。孤立文件按 30 天 retention 自动过期。
|
||||
|
||||
## 影响
|
||||
|
||||
- 首个真实 Local Alpha milestone 多一次双 artifact 下载和离线复核,只发生在显式里程碑运行;
|
||||
- 普通 push/PR 不生成大归档或 milestone index,CI 成本基本不变;
|
||||
- 默认 Local scope 不再无谓生成八套 Cluster archive;
|
||||
- 新脚本和索引属于发布期仓库工具,不新增 workspace package、设备依赖、镜像 layer、常驻进程、端口、timer、连接池或 RSS;
|
||||
- Public Release Set 仍由受保护 tag、不可变 registry digest、签名、attestation、catalog 和 deployment closure 独立裁决。
|
||||
|
||||
## 验证
|
||||
|
||||
- finalizer 正向测试生成 exact 三文件 index,并复核双架构、run/attempt、四镜像主体与 archive digest;
|
||||
- 负向测试覆盖跨 attempt、跨架构 image identity 复用、index mutation、额外文件和 CLI grammar;
|
||||
- 静态 workflow audit 固定 scope 条件、milestone 独立并发域、19 个完整 CI dependency、双 artifact 下载、`finalize → audit → upload` 顺序和 30 天 retention;
|
||||
- 首份真实 `produce_alpha_artifacts=true + alpha_artifact_scope=local` 产物仍需维护者显式授权,生成后再把 ADR-0503 从 Proposed 转为 Accepted 并记录 index/bundle digest。
|
||||
@@ -511,6 +511,7 @@
|
||||
| [ADR-0505](./ADR-0505-pinned-alpine-openssl-runtime-security-patch.md) | 固定 Alpine OpenSSL 运行时安全补丁 | Accepted |
|
||||
| [ADR-0506](./ADR-0506-source-bound-local-alpha-verification-evidence.md) | 源码绑定的 Local Alpha 验证证据 | Accepted |
|
||||
| [ADR-0507](./ADR-0507-public-local-application-and-operator-release-pair.md) | Public Local Application 与 Operator 发布对 | Accepted(首份真实公开发布待受保护 tag) |
|
||||
| [ADR-0508](./ADR-0508-cross-architecture-local-alpha-milestone-closure.md) | 跨架构 Local Alpha 里程碑闭合 | Accepted(首份实际 milestone artifact 待维护者授权) |
|
||||
|
||||
## 规则
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
# QingLong 3.0 Local Alpha Milestone
|
||||
|
||||
本目录是一次完整 Local Alpha milestone run 的跨架构闭合索引。它本身不包含大体积 Docker archive;`manifest.json` 精确列出同一次 GitHub Actions run 生成并重新审计的 amd64、arm64 Trial Kit artifact。只有该索引 artifact 与对应架构 Trial Kit 同时存在时,才能把那次运行称为阶段性可下载 Local Alpha。
|
||||
|
||||
## 成熟度边界
|
||||
|
||||
- `maturity` 固定为 `alpha_candidate_not_public_release`;
|
||||
- 适用于 fresh、隔离、非生产数据上的 Edge/Standalone 试运行;
|
||||
- 不提供公开 GHCR tag、Cosign 签名、GitHub attestation、catalog、生产升级或长期支持承诺;
|
||||
- Cluster/Kubernetes 仍按独立 Integration Candidate 与 Public Release Set 门验收。
|
||||
|
||||
单个架构 artifact 提前上传并不代表 milestone 成功。没有 `ql3-alpha-<sourceRevision>-local-milestone` 索引、索引 workflow 不是成功终态、run/attempt 不一致或索引审计失败时,已有的大归档只能作为失败运行的中间文件,不得交付用户。
|
||||
|
||||
## 选择并验证下载物
|
||||
|
||||
1. 对本目录执行:
|
||||
|
||||
```sh
|
||||
sha256sum --check SHA256SUMS
|
||||
```
|
||||
|
||||
2. 打开 `manifest.json`,确认:
|
||||
- `schema` 为 `qinglong/alpha-local-milestone@v1`;
|
||||
- `sourceRevision` 是准备试用的完整 40 位提交;
|
||||
- `workflow.event` 为 `workflow_dispatch`,`workflow.job` 为 `local-alpha-milestone`;
|
||||
- GitHub Actions 中对应 `runId/runAttempt` 的整条 `QingLong 3.0 CI` 为成功终态;
|
||||
- `artifacts` 恰好包含 `amd64` 与 `arm64`。
|
||||
3. 根据主机架构下载 `artifacts.<architecture>.artifactName` 指向的 Trial Kit。
|
||||
4. 对 Trial Kit 先执行其 `SHA256SUMS`,再确认其中 `manifest.json` 的 SHA-256 与 milestone 的 `bundleManifest.sha256` 完全一致。
|
||||
5. 按 Trial Kit 自带 `README.md` 完成 Docker archive 加载、镜像 ID 对账和受限资源 smoke。
|
||||
|
||||
若持有同一版本源码与 Node.js 24,可额外审计 milestone 索引:
|
||||
|
||||
```sh
|
||||
node scripts/ql3-local-alpha-milestone.cjs \
|
||||
--mode=audit \
|
||||
--milestone=/absolute/path/to/ql3-alpha-local-milestone
|
||||
```
|
||||
|
||||
该命令验证索引目录的闭合文件集、checksum、双架构记录、镜像主体分离和 workflow identity。对应架构 Trial Kit 仍必须使用它自己的离线 auditor;索引审计不会重新执行 Docker、漏洞扫描或真实用户旅程。
|
||||
|
||||
## 运行与回退
|
||||
|
||||
实际运行只需要匹配主机架构的一套 Trial Kit,不需要同时下载另一架构。低配路由器稳态只运行 Local Application;Operator 只在 setup、upgrade 或 recovery 动作期间短暂运行。停止并删除 Alpha 容器及 fresh 测试目录即可回退,不能把本套件直接指向 2.x 唯一数据目录。
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
本目录是绑定一个 QingLong 3.0 源码提交、一个 Linux 架构和一次显式 GitHub milestone run 的阶段试运行套件,不是公开 release 或生产升级承诺。它同时包含常驻 Application 镜像和短生命周期 operator 镜像;两者共享的 OCI layer 只在同一个 Docker archive 中保存一次。
|
||||
|
||||
一套 Trial Kit 只有被同一 run 的 `ql3-alpha-<sourceRevision>-local-milestone` 跨架构索引收录后才是可交付阶段产物。单个矩阵 job 提前上传、另一架构或完整 CI 随后失败时留下的 artifact 只是中间文件。先按 milestone `manifest.json` 选择本机架构并核对本 bundle manifest digest,再执行下述离线验收。
|
||||
|
||||
## 适用范围
|
||||
|
||||
- `amd64` 或 `arm64` Linux Docker 主机;
|
||||
|
||||
Reference in New Issue
Block a user