feat(#60): 一键部署编排与回滚引擎

纯标准库实现,对齐 PRD 5.6「⑥ 部署底座」(不真执行 k8s/helm,模拟编排):

- deploy_plan.py:DeployStep(4 类:pre_check/deploy/health_check/post_check)
  + DeployPlan(顺序约束自动校验,default_helm_release 默认 4 步计划)+
  DeployOrchestrator(按序执行,必需步骤失败即中止并标记 needs_rollback,
  deploy/health_check 为回滚检查点,pre_check 失败无需回滚)+
  HealthCheckContract(对齐 deploy/k8s/healthz 99.8% 目标)。
- rollback.py:RollbackPoint(部署前快照,values_hash SHA1 检测漂移)+
  RollbackManager(快照栈 + rollback_to_latest/rollback(n),失败压回栈顶
  保持一致性,FIFO 淘汰,支持回滚后健康检查)+ RollbackResult(4 状态)。
- tests:30 用例覆盖计划构造/顺序约束、全成功/各类失败、回滚检查点判定、
  action 异常、dry_run、空计划、快照压栈/FIFO、回滚成功/失败/多版本/空栈/
  异常、健康检查契约、values 漂移、报告序列化。
- _sanity_check.py:冒烟验证快照→部署成功→部署失败→回滚全流程。
This commit is contained in:
2026-08-05 05:32:27 +08:00
parent 2afea16005
commit 97fbbfa7b2
8 changed files with 1250 additions and 0 deletions
+66
View File
@@ -0,0 +1,66 @@
# 一键部署编排 + 回滚引擎(Issue #60 / PRD 5.6)
> 父 Issue「⑥ 一键部署脚本与回滚机制 · 0.5d」
把一键部署与回滚落为**可测试的纯标准库编排引擎**——不真执行 k8s/helm,但模拟
完整编排序列(pre_check → deploy → health_check → post_check)+ 部署前快照 +
失败回滚。对齐 `deploy/k8s/helm/iaop`(Chart)与 `deploy/k8s/healthz`(探针)。
## 1. 部署编排(`deploy_plan.py`)
- `DeployStep` —— 声明式步骤:`kind`(pre_check/deploy/health_check/post_check)
+ `name` + `action` 回调(返回 `(ok, detail)`,默认模拟成功)。
- `DeployPlan` —— 步骤序列 + 发布元信息(release/namespace/chart/version);
`default_helm_release()` 生成默认 4 步 Helm 发布计划;步骤顺序约束
(pre_check < deploy < health_check < post_check)自动校验。
- `DeployOrchestrator` —— 按序执行,任何必需步骤失败即中止并标记回滚
(`DeployOutcome.needs_rollback`),产出 `DeployReport`(逐步结果 + 日志 +
可解释 reason)。deploy/health_check 是回滚检查点;pre_check 失败无需回滚。
- `HealthCheckContract` —— 健康检查契约(端点/超时/重试/可用率目标,对齐
`deploy/k8s/healthz` 的 99.8%)。
```python
from deploy_plan import DeployPlan, DeployOrchestrator
plan = DeployPlan.default_helm_release(release="iaop", backend="gpu")
report = DeployOrchestrator(plan).execute()
if not report.succeeded and report.outcome.needs_rollback:
print("需回滚:", report.outcome.reason)
```
## 2. 回滚引擎(`rollback.py`)
- `RollbackPoint` —— 部署前快照(release/namespace/version/chart/values_hash/
created_at,不可变)。`values_hash`(SHA1)检测配置漂移。
- `RollbackManager` —— 快照栈 + 回滚执行:`snapshot(plan)` 部署前压栈;
`rollback_to_latest()` / `rollback(n)` 失败时回滚到稳定版本。回滚失败把目标压回
栈顶(保持栈一致性);支持回滚后健康检查。FIFO 淘汰防内存膨胀。
- `RollbackResult` —— 回滚结果(SUCCESS/FAILED/NO_TARGET/SKIPPED + 可解释 reason)。
```python
from deploy_plan import DeployPlan, DeployOrchestrator
from rollback import RollbackManager
mgr = RollbackManager()
mgr.snapshot(plan) # 部署前快照
report = DeployOrchestrator(plan).execute()
if not report.succeeded:
result = mgr.rollback_to_latest(reason=report.outcome.reason)
print(result.status.value, result.detail)
```
## 与现有部署资产的关系
- 真实环境把 `action` / `restore_action` 注入为 `helm upgrade` / `helm rollback`
等真回调即可;本引擎只做编排与状态管理,不耦合 k8s 客户端。
- 健康检查契约对齐 `deploy/k8s/healthz/probe_availability.py`(99.8% 可用率目标)。
## 测试
```bash
python -m unittest discover -s deploy/orchestration/tests -p "test_*.py" -v
```
覆盖正常 + 边界 + 错误(30 用例):4 步计划构造、顺序约束、全成功/各类失败、
回滚检查点判定、action 异常、dry_run、空计划、快照压栈/FIFO、回滚成功/失败/
多版本/空栈/异常、健康检查契约校验、values 漂移、报告序列化。