# -*- 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.. 路径集合。""" 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()