106 lines
3.3 KiB
Python
106 lines
3.3 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""用户手册 / 部署手册(issue #91)文档一致性检查。
|
||
|
||
检查项:
|
||
1. 两份手册必备章节齐全;
|
||
2. 关键红线 / 验收关键词存在(PRD §5.6 / §7.7 / §9 NFR);
|
||
3. 跨文档引用与配套资产路径存在;
|
||
4. 角色画像 / 场景流关键词存在(PRD §2 角色画像)。
|
||
|
||
用法:python _check_user_deploy_manual.py
|
||
"""
|
||
import os
|
||
import sys
|
||
|
||
HERE = os.path.dirname(os.path.abspath(__file__))
|
||
USER_DOC = os.path.join(HERE, "用户手册.md")
|
||
DEPLOY_DOC = os.path.join(HERE, "部署手册.md")
|
||
|
||
USER_SECTIONS = [
|
||
"## 1. 平台简介",
|
||
"## 2. 角色与权限(RBAC)",
|
||
"## 3. 登录",
|
||
"## 4. 场景 A:实时监控与告警处置",
|
||
"## 5. 场景 B:工艺优化",
|
||
"## 6. 场景 C:LLM 自然语言助手",
|
||
"## 7. 交接班报告",
|
||
"## 8. 常见问题(FAQ)",
|
||
]
|
||
|
||
DEPLOY_SECTIONS = [
|
||
"## 1. 部署目标与边界",
|
||
"## 2. 环境要求(前置条件)",
|
||
"## 3. 一键部署(Quick Start)",
|
||
"## 4. 配置点速查(values.yaml)",
|
||
"## 5. 健康巡检(可用性 ≥ 99.8%)",
|
||
"## 6. 灰度发布与回滚",
|
||
"## 7. 升级流程",
|
||
"## 8. 故障排查(SOP)",
|
||
]
|
||
|
||
USER_KEYWORDS = ["可溯源", "敏感度", "DLP", "交接班", "驾驶舱"]
|
||
DEPLOY_KEYWORDS = [
|
||
"inference.backend", # 后端可切换配置点
|
||
"nvidia-5090",
|
||
"ascend-910b",
|
||
"99.8%", # 可用性验收口径
|
||
"helm install",
|
||
"helm rollback",
|
||
]
|
||
|
||
# 必须存在的配套资产路径(相对仓库根)
|
||
ASSET_PATHS = [
|
||
"deploy/k8s/helm/iaop/README.md",
|
||
"deploy/k8s/helm/iaop/values.yaml",
|
||
"deploy/k8s/healthz/probe_availability.py",
|
||
]
|
||
|
||
|
||
def main() -> int:
|
||
failures = []
|
||
repo_root = os.path.dirname(HERE)
|
||
|
||
if not os.path.isfile(USER_DOC):
|
||
failures.append("用户手册不存在:用户手册.md")
|
||
if not os.path.isfile(DEPLOY_DOC):
|
||
failures.append("部署手册不存在:部署手册.md")
|
||
|
||
user_text = open(USER_DOC, "r", encoding="utf-8").read() if os.path.isfile(USER_DOC) else ""
|
||
deploy_text = open(DEPLOY_DOC, "r", encoding="utf-8").read() if os.path.isfile(DEPLOY_DOC) else ""
|
||
|
||
for sec in USER_SECTIONS:
|
||
if sec not in user_text:
|
||
failures.append(f"用户手册缺少章节:{sec}")
|
||
|
||
for sec in DEPLOY_SECTIONS:
|
||
if sec not in deploy_text:
|
||
failures.append(f"部署手册缺少章节:{sec}")
|
||
|
||
for kw in USER_KEYWORDS:
|
||
if kw not in user_text:
|
||
failures.append(f"用户手册缺少关键词:{kw}")
|
||
|
||
for kw in DEPLOY_KEYWORDS:
|
||
if kw not in deploy_text:
|
||
failures.append(f"部署手册缺少关键词:{kw}")
|
||
|
||
# 部署手册必须正确引用用户手册(跨文档链接)
|
||
if "用户手册.md" not in deploy_text:
|
||
failures.append("部署手册缺少对『用户手册』的引用链接")
|
||
|
||
for rel in ASSET_PATHS:
|
||
if not os.path.isfile(os.path.join(repo_root, *rel.split("/"))):
|
||
failures.append(f"配套资产缺失:{rel}")
|
||
|
||
if failures:
|
||
print("FAIL")
|
||
for f in failures:
|
||
print(" -", f)
|
||
return 1
|
||
print("OK: 用户手册/部署手册 章节齐全、关键词与配套资产校验通过")
|
||
return 0
|
||
|
||
|
||
if __name__ == "__main__":
|
||
sys.exit(main())
|