本文档用步骤化的方式说明 merge-values 和 template 的主要执行链路,方便排查“为什么最终值是这个结果”。
读取:
CHART--values/-p--set/-s--output/-o
由 cli/values.Options.MergePaths() 完成:
- 处理绝对路径 / 相对路径
- 处理
~开头的 home 路径 - 检查路径是否存在
由 cli/values.Options.MergeValues() 完成,使用 Helm strvals 语法把 --set 转成嵌套 map。
internal/pkg/util.MergeChartValues() 会先加载 chart 自带的 values.yaml。
对每个 values path:
- 读取
global.yaml - 读取 charts 同名 yaml(按
type_name/func_name/ chart 名解析) - 记录
modules/*.yaml
当前实现的同 key 优先级:
--set- 服务级同名 yaml(后 path 优先)
- chart 默认值
global.yaml(后 path 优先)- 已启用模块(后 path 优先)
最终 values 会被序列化为 YAML 并写到目标路径。
读取:
CHART(这里是 chart 根目录)--values/-p--set/-s--output/-o
调用 internal/pkg/noncloudnative.LoadConfig():
- 递归扫描 values path
- 找到
deploy.yaml - 加载
world_id、zone_id和proc_desc
对 proc_desc 里的每个实例:
- 按
instance_count展开实例 - 计算实例号
instance_id - 计算
bus_addr
对每个实例,会组装:
- 实例专属
type_id global.*命令行覆盖(扁平化后作用于所有实例)<实例名>.*命令行覆盖(只作用于对应实例)- 由
deploy.yaml派生的world_id/zone_id/instance_id/bus_addr
继续叠加:
- chart 默认值
global.yaml- 服务级同名 yaml
- 已启用模块
- 实例级运行时值
- 命令行覆盖值
template 命令不会直接输出 templates/_*.tpl 这样的 helper。
当前实现主要会把 chart 中的普通 .tpl 文件作为输出目标,常见是:
cfg/*.yaml.tplbin/*.sh.tplbin/*.bat.tpl
这些模板文件内部可以继续 include 其他 helper。
每个实例会:
- 生成独立的输出目录
- 按
bus_addr给输出文件加后缀 - 写出配置文件和脚本
如果发现最终输出与预期不一致,推荐按这个顺序查:
--set是否写到了正确路径- 服务级同名 yaml 文件名是否与
type_name/func_name对齐 - chart 默认值是否已经在
values.yaml中定义了更高优先级的同名 key - 模块是否真的被启用,且模板里是否做了存在性保护
deploy.yaml是否来自你预期的那一个 pathtemplate输出目录和文件名是否带上了正确的bus_addr
不是。当前实现中,chart 默认值优先于 global.yaml 的同名 key。
不是。模块更像默认补齐层。
不是。当前实现里它是 chart 根目录,实例名会再拼接到这个路径下面。
不是。atdtool template 当前主要围绕 .Values 工作,.Release / .Capabilities 不会完整模拟 Helm 发布上下文。