docs(xingbang): 适配项目开发流程并建立经验驱动预审新版文档
verify / test-and-build (push) Canceled after 0s

This commit is contained in:
2026-09-28 17:02:33 +08:00
parent 4d5a420671
commit 9d2399feed
26 changed files with 1164 additions and 266 deletions
+41 -115
View File
@@ -1,143 +1,69 @@
# 阶段 ⑦ 交付与发布(Delivery & Release)
# 阶段 ⑦ 交付与发布
> **定义**:让当前结果在**真实交付边界**被接受——真实的评审、必需的 CI、合并、发布——且高风险动作有风险匹配的审批、副作用有可用的回滚/恢复路径。本地测试与 agent 一句"done"属于阶段 ⑥,不属于交付。
> **输入**:⑥ 已通过的实现(验证记录 + 门禁结果 + 审查结论)。
> **输出**:已接受的修订 + 构建/安装包 + 发布记录 + 审计。
> **进入下一阶段(⑧ 学习与沉淀)**:交付边界接受完成、发布记录落档。
输入:验证通过的修订及证据。输出:实际目标分支/环境接受记录、产物和回滚路径。备份、合并、镜像推送、云端部署是四个不同边界。
---
## 1. 要求与DoD
## 1. 要求(Requirements)
- [ ] 明确本次是源码备份、文档交付、代码合并还是部署,不能混称上线。
- [ ] 验证绑定最终源码修订;未通过时不发布镜像。
- [ ] 外部/生产/共享状态变更有任务授权及可核验记录;已有授权无需重复确认。
- [ ] 分支/镜像/数据资源有明确恢复路径和owner。
- [ ] 目标环境实际观测成功;未观测项标Unobserved。
### 1.1 进入条件
- 阶段 ⑥ 全部质量门通过,无未解决阻塞项。
## 2. 规则
### 1.2 完成条件(DoD)
- [ ] 真实接受边界(合并/发布/部署)绑定到**当前修订**,有修订级决策证据(不是"跑过 CI"而是"这个 revision 合并了/发布了")
- [ ] 每个高风险动作(发布、删除、生产数据、外发、签名)在副作用**之前**获得所需审批并留审计
- [ ] 实际副作用有风险匹配的回滚/恢复路径(回滚、恢复、重试、补偿、幂等重放、安全中止之一)且含 owner 与后置条件
- [ ] 发布记录(版本、变更、产物、验证)落档
---
## 2. 规则(Rules)
### 2.1 接受边界
| 编号 | 规则 |
| ID | 规则 |
|---|---|
| R-7.1 | **真实边界证据**:把真实接受决策绑定到当前修订与目标分支/环境。本地测试、自测、agent 完成声明均不是交付证据;外部边界打不开时记 `Unobserved`,不编造缺失的 PR/部署。 |
| R-7.2 | **合并路径**:改动经默认分支可比较的 diff 进入(分支/PR 或等价受控路径);直接在默认分支开发、无可评审 base diff 属交付缺陷。 |
| R-7.3 | **必需检查绑定**:合并前必需检查对最终修订全绿,且与本地命令一致或有明确差异说明。 |
| R-7.1 | 真实边界证据绑定revision:远程分支SHA、合并记录、镜像摘要、目标健康检查分别记录;本地通过不能冒充部署 |
| R-7.2 | 改动通过可比较的分支/PR进入默认分支;本项目当前main,操作前核对;不直接覆盖main |
| R-7.3 | 必需检查绑定最终源码修订;验证之后有行为变化须重验相关检查 |
| R-7.4 | 删除、生产数据、模型外发、镜像发布和部署须在副作用前具有相应用户/策略授权;不足时明确具体阻塞点 |
| R-7.5 | 审计记录谁、何时、何操作、作用资源、授权来源和结果;日志不含凭据 |
| R-7.6 | 无高风险操作的项标N/A并说明;纯文档不能被误当成必须部署 |
| R-7.7 | 恢复方式绑定具体提交、镜像和数据资源,owner与恢复后检查明确 |
| R-7.8 | 可用性以安全验证支持,不能为证明回滚去破坏当前运行;未演练标未演练 |
| R-7.9 | 失败/超时也须可恢复;代码回退不等于数据恢复,迁移不得依靠删库回退 |
### 2.2 高风险审批
## 3. 本项目执行路径
| 编号 | 规则 |
|---|---|
| R-7.4 | 破坏性/特权/外部/不可逆/共享状态/凭据/发布/生产动作,在效果发生**前**取得所需的人或策略 owner 决策;安全拒绝 + 可用升级路径是正确的控制行为,不是失败。 |
| R-7.5 | 高风险动作留审计:谁、何时、什么、批准人/策略、审计引用。 |
| R-7.6 | 确认无高风险动作时记 `N/A`(须经检查证明),不允许无理由的 N/A 阻塞结果。 |
### 3.1 源码备份
### 2.3 回滚与恢复
先git status/log确认用户改动→检查新增凭据/运行数据→显式暂存选定文件→在codex/备份分支提交→推送已确认origin→git ls-remote比对SHA。备份可保存未完成状态,必须注明测试状态,不充当发布候选。
| 编号 | 规则 |
|---|---|
| R-7.7 | 每个实际副作用有风险比例匹配的回滚/恢复路径,且绑定到受影响资源/入口/owner/后置条件。 |
| R-7.8 | 回滚/恢复须可验证(安全模拟、演练、可比的保留任务或实际恢复结果);禁止仅为提高证据强度而执行破坏性回滚。 |
| R-7.9 | 恢复路径对失败与超时也要可运行(清理不得只在成功路径执行)。 |
不提交.env、server-deploy.conf、.docker-codex、会话/数据库/日志、Office锁文件;代码内样例须标演示。已跟踪文件不因.gitignore自动移出历史,迁移时另外检查。恢复用新目录克隆指定分支,不重置用户现有目录。
---
### 3.2 合并前验证
## 3. 输出规范
仓库根目录使用项目虚拟环境:
### 3.1 发布流程(本仓)
> 发布链唯一权威:`docs/release-process.md`(ci-local 门禁 / release.mjs / 四包发布 / pack-audit / install-acceptance / 签名 / OTA);签名细节 `docs/release-signing.md`;本地最短路径 `docs/local-build-quickstart.md`。以下为阶段 ⑦ 在本仓的落地步骤,任一步非零即中止。
```text
Step 0 离线门禁(提交/合并/发布前必过)
Windows: build\ci-local.ps1 · macOS/Linux: build/ci-local.sh → run-local-ci.mjs 八步:
① 删 release/ → ② npm ci 离线干净安装 → ③ npm run ci:check
(build:verify:runtime → vitest 全量 → build)→ ④ playwright E2E(不重构建)
→ ⑤ electron-builder --publish never 打安装包 → ⑥ package:audit
(asar 禁 dist/mac-*、release/、.map/.d.ts/.ts;体积预算 140 MiB)
→ ⑦ verify-packaged-app(extraResources 五件断言 + 真启动 5s 冒烟)
→ ⑧ write-build-report(逐产物 SHA-256 → build-report + SHA256SUMS)
Step 1 版本与变更(SDK 四包发布时)
node scripts/release.mjs --registry <内网源URL> [--bump patch|minor|major]
[--skip-publish] [--dry-run]
九步编排:install → build(拓扑序 api→agent-sdk→account→web-ui)
→ sync-web-ui-dist(dist/renderer → packages/web-ui/dist,断言 index.html 字节一致)
→ test → pack-audit → bump(四包+根 lockstep,dk-* 互引钉新版,再生 lockfile)
→ publish-sdks.mjs 逐包 npm publish 内网源 → install-acceptance
→ npm run package
日常验证用 --dry-run --skip-publish(shouldPublish 独立纯函数,零副作用有测试断言)
Step 2 构建安装包 + 产物审计
npm run package = build + electron-builder --publish never + package:audit + pack:sdks
审计(scripts/pack-audit.mjs):tarball 顶层 ⊆ {dist, bin, README, LICENSE, package.json};
零测试产物;dk-account 防误发(registry 锁内网 GitLab);公开三包无 /account/ 路径泄漏
安装验收(scripts/install-acceptance.mjs):spawn dk-web → listening banner →
GET /health 200 + GET / 200 含 <div id="root"> + 入口 JS 200
Step 3 签名与公证(对外发布 / CI 打 Git tag 触发)
build/sign-local.sh(mac/Linux)/ build/sign-local.ps1(Windows)→ run-signing-build.mjs
(仅 darwin/win32;保留 APPLE_*/CSC_* 变量且不设断网)
npm ci → build → electron-builder --config.forceCodeSigning=true → package:audit
→ 验签:mac codesign --verify --deep --strict;win Get-AuthenticodeSignature 双件 Valid
→ 有 APPLE_APP_SPECIFIC_PASSWORD 时 DMG 公证 + stapler 装订 → 冒烟 + 构建报告
Step 4 OTA 更新(走 OTA 通道时)
npm run ota:manifest(scripts/ota/generate-manifest.mjs):扫 release/ 安装包算 SHA-256
→ scripts/ota/latest.json;强制单一版本、单平台唯一;缺平台填全 0(运行侧 A6 守卫拒绝)
Step 5 发布记录落档
build-report + SHA256SUMS(产物校验值)· 版本与变更(release.mjs bump)·
验证摘要(⑥ 门禁结果绑定修订)· 审批人/审计引用(高风险动作)
```powershell
.\backend\venv\Scripts\python.exe scripts/verify.py
```
> 合并/发布边界绑定:改动经默认分支(`build`)可比较的 diff 进入;必需检查(ci-local 全链)对最终修订全绿。本仓无 CHANGELOG/RELEASE_NOTES 文件,版本与变更由 `scripts/release.mjs` 编排。
报告位于test-evidence/<run-id>/REPORT.md。PR至少一人评审,目标分支和最终SHA明确。Gitea runner和必需检查未核验时如实说明,不借GitHub YAML宣称已有Gitea门禁。
### 3.2 交付记录模板
### 3.3 镜像与部署
```text
目标边界: 分支 / 环境 / 发布通道
修订绑定: 合并/发布的 revision 与决策证据(PR 号 / 发布记录)
高风险动作: 动作 | 审批人/策略 | 时间 | 审计引用
回滚路径: 受影响资源 | 路径 | owner | 后置条件 | 验证方式
验证摘要: ⑥ 的门禁结果绑定
残余风险: 未覆盖边界、需人工确认项
```
现有入口:Dockerfile、docker-entrypoint.sh、docker-compose.yml、deploy/docker-compose.aliyun.yml;发布脚本scripts/publish-acr.ps1和scripts/publish-acr.sh;部署脚本scripts/deploy-aliyun.sh。
### 3.3 交付物清单
- 合并/发布证据(绑定修订)
- 构建产物 + 审计记录(build-report / SHA256SUMS / package:audit 结果)
- 发布记录(版本/变更/验证/审批)
- 回滚路径文档(高风险动作必填)
只有授权发布时才运行。发布前复查脚本参数与目标,因为当前配置是旧版资源。先verify→构建→使用不可变Git标签和镜像摘要→推ACR→目标拉取→Compose up→检查前端、/api/xingbang/health和关键业务操作→保存服务器结果。实际脚本若不足以执行某门禁,应补齐并测试后再宣称机制成立。
---
当前云端Compose仅绑定127.0.0.1;保持授权访问边界,公网开放需要另行定义身份、TLS和访问控制。使用示例环境文件准备实际配置,密钥经受控渠道配置;文档不存真实值。
## 4. 反模式
### 3.4 v2隔离
- **本地验证冒充交付**:只有本地测试支持交付声明。
- **先斩后奏的审批**:效果发生了才补审批,或自查自批。
- **回滚路径悬空**:有"看起来像回滚"的文件/命令,但连不上实际资源/修订/权限/后置条件(文件名匹配不算证据)。
- **只走发布后自动化**:仅在推到默认分支/发布时跑的检查不算接受时验证。
- **无边界的高危可达性**:默认路径能触达生产/凭据/破坏性命令而无边界。
v2必须独立目录、Compose项目、容器名、卷、镜像和宿主端口。未完成隔离时不得直接用旧版Compose部署新版。数据库迁移先备份并演练;不运行down -v或清理脚本删除旧业务数据。配置和脚本存在不代表隔离已验证。
---
## 4. 交付记录模板
## 5. 轻量路径(小改动)
目标边界;源码SHA/分支;验证命令与日志;镜像标签/摘要(如适用);环境与数据资源;授权来源;接受证据;回滚方式与owner;尚未验证的范围。通过率/模型效果须有业务评估,不能写成部署成功的附带结论。
- 内部改动:合并路径 + 必需检查即可,无发布/回滚部分(记 N/A 需检查证明)。
- 任何触达发布/生产/凭据的动作:审批与审计条款不可省略。
## 5. 轻量路径
---
纯文档:链接/编号/格式/事实检查、独立提交、所需远程备份核验;镜像/部署N/A。源码恢复快照记录原样保留的检查失败,但不能因此发布。行为变更仍执行阶段⑥和AGENTS规定的verify。
## 6. 相关文档
- 输入:阶段 ⑥ [06-validation.md](06-validation.md)
- 发布链唯一权威与签名:`docs/release-process.md`、`docs/release-signing.md`(本仓无 CHANGELOG/RELEASE_NOTES 文件,版本与变更由 `scripts/release.mjs` 编排)
- 本地/CI 补充:`docs/local-build-quickstart.md`、`docs/ci-runner-setup.md`、`docs/architecture/reproducible-build-baseline.md`
- 完成后进入:阶段 ⑧ [08-learning.md](08-learning.md)
[验证](06-validation.md) · [学习](08-learning.md) · [当前部署和Gitea](../v2/07-deployment-and-gitea.md) · [本次交付](../v2/10-delivery-record.md)。
变更:XB-1.0 / 2026-09-28,改为Gitea+Docker+ACR/ECS流程,未执行云端部署。