纯标准库实现,对齐 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:冒烟验证快照→部署成功→部署失败→回滚全流程。
3.2 KiB
3.2 KiB
一键部署编排 + 回滚引擎(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%)。
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)。
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% 可用率目标)。
测试
python -m unittest discover -s deploy/orchestration/tests -p "test_*.py" -v
覆盖正常 + 边界 + 错误(30 用例):4 步计划构造、顺序约束、全成功/各类失败、 回滚检查点判定、action 异常、dry_run、空计划、快照压栈/FIFO、回滚成功/失败/ 多版本/空栈/异常、健康检查契约校验、values 漂移、报告序列化。