feat: 完成 issue #8 ⑥ K8s/Helm 部署底座 + 昇腾适配层

This commit is contained in:
2026-08-04 22:04:18 +08:00
parent 691a812fcf
commit e620d4937e
20 changed files with 1013 additions and 0 deletions
+75
View File
@@ -0,0 +1,75 @@
# -*- coding: utf-8 -*-
"""Helm Chart 结构 sanity 检查(无 helm CLI 环境下的离线基本验证)。
检查项:
1. Chart.yaml / values.yaml 均为合法 YAML;
2. templates/ 下所有模板文件存在且非空;
3. 模板中引用的 `.Values.xxx` 键均能在 values.yaml 中找到(防拼写错误);
4. 每个模板文件的 Go template 标记 `{{` / `}}` 数量配平。
用法:python _sanity_check.py
"""
import os
import re
import sys
HERE = os.path.dirname(os.path.abspath(__file__))
TEMPLATES = os.path.join(HERE, "templates")
import yaml # noqa: E402
def load(path):
with open(path, "r", encoding="utf-8") as fh:
return yaml.safe_load(fh)
def values_paths(text):
"""提取模板文本中的 .Values.<a>.<b> 路径集合。"""
return set(re.findall(r"\.Values\.([A-Za-z0-9_]+(?:\.[A-Za-z0-9_]+)*)", text))
def resolve(values, dotted):
node = values
for key in dotted.split("."):
if not isinstance(node, dict) or key not in node:
return False
node = node[key]
return True
def main():
failures = []
chart = load(os.path.join(HERE, "Chart.yaml"))
assert chart.get("apiVersion") == "v2", "Chart.yaml 应为 Helm v2 chart"
assert chart.get("name") == "iaop", "Chart.name 应为 iaop"
values = load(os.path.join(HERE, "values.yaml"))
assert values.get("inference", {}).get("backend") in ("gpu", "npu"), \
"values.inference.backend 应为 gpu|npu"
for name in sorted(os.listdir(TEMPLATES)):
path = os.path.join(TEMPLATES, name)
if not os.path.isfile(path):
continue
text = open(path, "r", encoding="utf-8").read()
if not text.strip():
failures.append(f"{name}: 模板文件为空")
continue
if text.count("{{") != text.count("}}"):
failures.append(f"{name}: Go template 标记 {{/}} 数量不配平")
for dotted in values_paths(text):
if not resolve(values, dotted):
failures.append(f"{name}: 引用了 values.yaml 中不存在的键 .Values.{dotted}")
if failures:
print("FAIL")
for f in failures:
print(" -", f)
sys.exit(1)
print(f"OK: Chart/values 合法,templates/{len(os.listdir(TEMPLATES))} 个模板校验通过")
if __name__ == "__main__":
main()