结果:已合并 (2026-10-17 16:45, helm/helm-www#2307), 确认已于同日反映在 helm.sh 文档中。 实际上,这些内容取自 GitHub 的 PR、审查、检查与时间线记录,helm-www 源码(PR 的基准提交
faf08ad0),Helm 源码(标签 v3.22.1 及 v4.3.1), 以及贡献记录草稿。时间均为韩国时间。
目录
- 一句话总结
- 1. 问题所在:我们看到的文段
- 2. 原因分析:源码的哪一行出了问题
- 3. 做了什么更改:diff 要点
- 4. 反应:1 小时 19 分钟获批,15 小时 54 分钟合并
- 5. 收获:开源贡献要领
- 链接
一句话总结
| PR | helm/helm-www#2307 docs: lookup only runs for template, install and upgrade |
| 修改内容 | 当前文档与 Helm 3 版本文档各一个相同段落。新增 10 行,删除 8 行 |
| 反应 | 无审查机器人及行内评论。一位维护者使用 /lgtm 批准,随后合并了 main 分支重新运行检查并合并 |
| 结果 | PR 公开 10-17 00:50 → 批准 02:09 → 合并 16:45,耗时约 15 小时 54 分钟。Squash 合并(我们的账户为作者,维护者为共同作者) |
1. 问题所在:我们看到的文段
首先坦白说明。这次 TT Lab 并没有发生任何故障。并不是跟着文档操作时卡住了,而是在阅读文档时发现有一个文段
与源码不符。贡献记录中并未单独记载是如何发现这段话的。不过,该草稿与 2 篇 Grafana 图表
PR 在同一天、使用相同的 Helm 版本 (v3.18.2) 作为同一批次进行准备的。正如在 第 2 篇中所见,该图表的随机
密码依赖于 lookup ,而在使用 helm template 进行渲染的 Argo CD 等工具中, lookup 不会返回任何内容。为了确认该行为,
在阅读 Helm 文档的 lookup 章节时似乎遇到了它。
Helm 공식 문서 「Template Functions and Pipelines」 의 lookup 章节末尾有这样一个段落(当前文档与 Helm 3 版本文档相同)。
To test
lookupagainst a running cluster,helm template|install|upgrade|delete|rollback --dry-run=servershould be used instead
这是将五个命令用 | 连起来写成的一句话。此类列表如果不逐个运行验证,是无法得知其是否正确的. 实际上运行后会发现第四个和
第五个命令有所不同。
| 命令 (Helm v3.18.2) | 结果 |
|---|---|
helm template d ./chart |
lookup 返回空映射,导致通过 nil pointer evaluating interface {}.name 渲染失败 |
helm template d ./chart --dry-run=client |
相同 |
helm template d ./chart --dry-run=server |
found: "kube-system" 通过 |
helm rollback --dry-run=server |
Error: invalid argument "server" for "--dry-run" flag: strconv.ParseBool: parsing "server": invalid syntax |
渲染 (lookup "v1" "Namespace" "" "kube-system").metadata.name 测试图表仅仅是在一个模板中绘制 =server ,而集群是 TT Lab 的小型
集群。上面三行用于验证文段前半部分(template 仅在
helm uninstall --dry-run=server 时才查看集群)是正确的,而最后一行则是文段后半部分
错误的证明。这些值与 PR 正文中的完全一致,未单独保留输出原始文件(草稿在贡献记录中)。
未进行运行测试,仅通过源码中的标志定义进行了确认(第 2 节)。
2. 原因分析:源码的哪一行出了问题 faf08ad0 文档行号以 PR 的基准提交
为准, Helm 源码以编写 PR 时的最新 Helm 3 发布标签 v3.22.1 为准。
- 文档侧
docs/chart_template_guide/functions_and_pipelines.mdx当前文档 - Helm 3 판 문서
versioned_docs/version-3/chart_template_guide/functions_and_pipelines.md271–274 行
246–249 行 --dry-run 这两处都把在 --dry-run=server 时不连接 API 服务器的命令,
当作了用 lookup 测试
lookup 的命令,列出了相同的五个命令。
- 仅存在于渲染引擎内部
lookup引擎中存在pkg/engine/funcs.go的占位符。 67–71 行lookup的默认nil pointer返回空映射。第 1 节前两行的.metadata.name正是试图从该空映射中 提取 - 时发生的错误。
lookup真正的pkg/engine/engine.go仅在向引擎提供集群连接信息时才会嵌入(235–237 行pkg/action/action.go)。 是否提供该连接信息由 128–142 行renderResources的interactWithRemote决定为helm template,注释中也写着「--dry-run不应与远程集群交互,且当false·none·server时才尝试连接」。 - install 是
pkg/action/install.go第 256–258 行, upgrade 会pkg/action/upgrade.go第 271–273 行 设定此值并 调用renderResources。helm template因为将 install 操作以 dry-run 运行(cmd/helm/template.go第 53、86–92 行), 所以走的是同一条路。
rollback 和 uninstall 不走这条路
- rollback 不会重新渲染 Chart,而是直接获取要回滚的版本中保存的清单。
pkg/action/rollback.go第 156 行 的Manifest: previousRelease.Manifest,并且该文件中没有renderResources调用。 - uninstall 会拆分已保存发布版本的清单以生成要删除的资源列表(
pkg/action/uninstall.go第 214 行). - )。
标志的形态也不同。install 的
--dry-run是一个字符串标志,如果使用时不带值,则会变成client(cmd/helm/install.go第 183–184 行)。 rollback(cmd/helm/rollback.go第 79 行)和 uninstall(cmd/helm/uninstall.go第 75 行)是BoolVar,因此尝试将=server读取为布尔值时会产生第 1 节中的ParseBool错误。
Helm 4 도 확인했습니다. v4.3.1 의 uninstall 은 여전히 참/거짓 플래그입니다(pkg/cmd/uninstall.go 第 78 行)。
虽然 rollback 改为使用与其他命令相同的 dry-run 标志(pkg/cmd/rollback.go 第 103 行)
=server ),但它仍然获取已保存的清单(pkg/action/rollback.go 第 207 行)。
即使接收了标志,也不会调用 lookup ,因此修改后的句子适用于两个版本。我没有在 Helm 4 中亲自运行测试(未实测)。
总结来说,原句有两个错误。一个是“可以用这两个命令测试 lookup ”的含义是错误的(没有要渲染的模板),
另一个是在 Helm 3 中直接运行这些命令会导致标志错误。
3. 更改了什么:diff 摘要
在两个文件的同一段落中删除了 delete|rollback ,并补充了一句话说明删除的原因。段落的其余部分保持不变。
# docs/chart_template_guide/functions_and_pipelines.mdx (versioned_docs/version-3 의 같은 문단도 같게)
-Keep in mind that Helm is not supposed to contact the Kubernetes API Server during
-a `helm template|install|upgrade|delete|rollback --dry-run` operation. To test `lookup`
-against a running cluster, `helm template|install|upgrade|delete|rollback --dry-run=server`
-should be used instead to allow cluster connection.
+Keep in mind that Helm is not supposed to contact the Kubernetes API Server during
+a `helm template|install|upgrade --dry-run` operation. To test `lookup` against a
+running cluster, `helm template|install|upgrade --dry-run=server` should be used
+instead to allow cluster connection. `helm uninstall` and `helm rollback` do not
+render templates, so `lookup` is not called by these commands.
旧行尾的空格也被一并删除了,因此删除的行数看起来比句子数要多。PR 正文中包含旧句子的引用、这两个命令需要被移除的原因(源码文件和
标志定义)、第 1 节的表格以及 ParseBool 错误,以及没有做到的两点。分别是「yarn build 没有在本地运行,只是修改了一个段落的
文字更改」与「i18n/ 下方的译本未作修改」。正文末尾加入了在 AI 的协助下编写并经过人工审查的语句。我们在提交中附带了 helm-www 的 CONTRIBUTING 所要求的 DCO 签名(Signed-off-by)以及 SSH 签名。
4. 反应:批准耗时 1 小时 19 分,合并耗时 15 小时 54 分
| 时间(10-17) | 日 |
|---|---|
| 00:43 | 提交(DCO 签名·SSH 签名) |
| 00:50 | 公开 PR。大小机器人打上 size/S 标签,DCO 通过 |
| 00:50 | 拼写检查(typos)工作流 在没有任何任务的情况下失败结束 |
| 00:52 | Netlify 网站预览已就绪 |
| 02:09 | 维护者以 /lgtm 批准,1 分钟后打上 has one approval 标签 |
| 16:42 | 其他贡献者的文档 PR(#2306)率先被合并 |
| 16:43 | 维护者将 main 合并到我们的分支 → DCO、typos、预览重新运行并通过 |
| 16:45 | Squash 合并 |
机器人只有大小标签和预览,没有审查机器人或行内评论。维护者的留言是 /lgtm 简短的一句话。
值得注意的是 00:50 的失败。GitHub 仅将这次运行显示为「似乎因工作流文件问题而失败」,并且没有启动任何任务,因此也没有日志。基础提交的 typos.yml 是普通的两步式,在合并前夕合并 main 之后,同样的工作流在 7 秒内通过了。在此期间进入 main 的两个提交仅修改了文档。原因未确认(未证实)。虽然这似乎与我们的更改无关,但老实说,我们并未将此失败记录在案,也没有单独作出应对。记录的状态全程都是「等待审查」。由于维护者合并了 main 并重新运行了检查,因此在绿灯亮起后被合并。
合并提交 dc74ea9b 的作者是我们的账号,
信息是在我们的提交信息后附上了 PR 编号以及维护者的 Co-authored-by 这一行。因为合并了 main 的提交是以维护者的名字进入分支的。经确认,2026-10-17 打开 helm.sh 的对应文档页面时,可以看到修改后的语句。
5. 学到的经验:开源贡献要领
a|b|c|d|e逐一展开清单。 将多条命令打包在一起编写时,最初编写的人往往只确认其中代表性的几条,其余的很容易顺手写在同一行。花几分钟一条一条地运行这五条命令,只要其中一条报错,它就会成为 PR 的第一行。- 标志的类型,源码比帮助文档更准确。
--dry-run这样相同的名称在不同的命令中既可能是字符串,也可能是布尔值。StringVar与BoolVar展示这两行,维护者就无需单独确认了。 - 拥有多个版本的文档应在每个版本中进行修改,并说明未修改的部分。 同时修改了当前文档和 Helm 3 版本文档,并在正文中说明未对译本进行修改。在 2026-10-17 通过 GitHub 代码搜索可以发现,旧语句(
delete|rollback)依然原封不动地保留在包含韩语在内的 11 处译本中。这是下一个可以贡献的地方,但目前尚未提交。 - 即使检查失败与我无关,也应当看一看。 此次失败似乎与我们的更改无关,且维护者帮忙整理好了。即便如此,如果提交 PR 的人能先留下一句「这次失败似乎是没有执行任务的工作流问题」,维护者就会少走一些弯路。记录的追踪脚本是否没有漏掉此类失败,这值得重新审视。
- 批准与合并之间可能会花费一些时间。 批准在 1 小时 19 分钟后到来,但合并是在维护者顺手处理其他 PR 的时候进行的。在此期间没有必要催促。
Titi 的一句话。 上面有一张便条写着:“问这五个朋友就行了!”但第四个和第五个朋友是听不到这个问题的。我把他们一个个叫来,第五个朋友反问了一句:“什么是 server?”我从便条上划掉了这两个名字,并写了一行理由,然后得到了一个“赞”的印章。我还得记住,其他十一张外语便条依然原封不动。
链接
所有资料均查阅于 2026-10-17。
- PR: helm/helm-www#2307 (合并提交
dc74ea9b) - 修订的文档(基于提交):
functions_and_pipelines.mdx,version-3/.../functions_and_pipelines.md,CONTRIBUTING.md - 反映的文档: https://helm.sh/docs/chart_template_guide/functions_and_pipelines/
- Helm 소스(v3.22.1):
pkg/engine/funcs.go,pkg/engine/engine.go,pkg/action/action.go,pkg/action/rollback.go,pkg/action/uninstall.go,cmd/helm/install.go,cmd/helm/rollback.go,cmd/helm/uninstall.go - Helm 소스(v4.3.1):
pkg/cmd/uninstall.go,pkg/cmd/rollback.go,pkg/action/rollback.go - 同组准备的 PR: 第 2 篇,grafana-community/helm-charts#896