聚焦 SIG 架构:代码组织

这是 SIG Architecture Spotlight 系列的第三次访谈,该系列将涵盖不同的子项目。我们将介绍 SIG Architecture: 代码组织

在本次 SIG Architecture Spotlight 中,我与代码组织子项目的成员 Madhav Jivrajani (VMware) 进行了交谈。

介绍代码组织子项目

Frederico (FSM):你好,Madhav,感谢你的参与。你能否先简单介绍一下自己,你的角色以及你如何参与 Kubernetes 的吗?

Madhav Jivrajani (MJ):你好!我叫 Madhav Jivrajani,我担任 SIG Contributor Experience 的技术主管以及 Kubernetes 项目的 GitHub 管理员。除此之外,我还为 SIG API Machinery 和 SIG Etcd 做出贡献,但最近我一直在帮助 Kubernetes 保持在受支持的 Go 版本上,正是通过这项工作我才参与了 SIG Architecture 的代码组织子项目。

FSM:像 Kubernetes 这样规模的项目在代码组织方面肯定会面临独特的挑战,这个假设是否合理?如果是这样,你认为 Kubernetes 特有的主要挑战有哪些?

MJ:这个假设是合理的!第一个有趣的挑战来自 Kubernetes 代码库的庞大规模。我们有大约 220 万行 Go 代码(感谢 dims 和这个子项目中的其他人,这个数字正在稳步下降!),以及我们直接或间接依赖的 240 多个依赖项,这就是为什么需要一个专门的子项目来帮助进行依赖项管理至关重要:我们需要知道我们引入了哪些依赖项,这些依赖项的版本是什么,以及相应的工具来帮助确保我们以一致的方式管理代码库不同部分的这些依赖项。

Kubernetes 的另一个有趣的挑战是,我们作为 Kubernetes 发布周期的一部分发布了许多 Go 模块,其中一个例子是 client-go。但是,我们作为一个项目也希望拥有一个存储库中的所有内容,以获得使用单体仓库的好处,例如原子提交……因此,由于这个原因,代码组织与其他 SIG(如 SIG Release)合作,自动化从单体仓库发布代码到下游各个存储库的过程,这些存储库更容易使用,这样你就无需导入整个 Kubernetes 代码库!

代码组织和 Kubernetes

FSM:对于刚开始为 Kubernetes 编写代码的人来说,在代码组织方面他们应该考虑哪些主要事项?你如何总结关键概念?

MJ:我认为至少在开始时要记住的关键事情之一是暂存目录的概念。在 kubernetes/kubernetes 存储库中,你会遇到一个名为 staging/ 的目录。此目录中的子文件夹充当一系列伪存储库。例如,发布 client-go 版本的 kubernetes/client-go 存储库实际上是一个 暂存存储库

FSM:那么暂存目录的概念从根本上影响了贡献?

MJ:正是如此,因为如果你想为任何暂存存储库做出贡献,你需要将 PR 发送到 kubernetes/kubernetes 中相应的暂存目录。一旦代码在那里合并,我们就会有一个名为 publishing-bot 的机器人,它会将合并的提交同步到所需的暂存存储库(如 kubernetes/client-go)。这样,我们既可以获得单体仓库的好处,也可以模块化地发布代码以供下游使用。附注:publishing-bot 需要更多人来帮忙!

有关暂存存储库的更多信息,请参阅贡献者文档

FSM:说到贡献,大量的贡献者,包括个人和公司,也一定是一个挑战:子项目如何运作以确保遵循标准?

MJ:当涉及到项目中的依赖项管理时,有一个专门的团队负责帮助审查和批准依赖项更改。这些人员帮助奠定了 Kubernetes 今天用于依赖项管理的许多 工具的基础。此工具帮助确保贡献者可以以一致的方式更改依赖项。该项目还开发了其他工具来显示正在添加或删除的依赖项的统计信息:depstat

除了依赖项管理之外,该项目的另一个关键任务是管理暂存存储库。实现此目的的工具(publishing-bot)对贡献者完全透明,并有助于确保暂存存储库获得提交给 kubernetes/kubernetes 的贡献的一致视图。

代码组织还致力于确保 Kubernetes 保持在受支持的 Go 版本上。链接的 KEP 提供了有关我们为什么需要执行此操作的更多背景信息。我们与 SIG Release 合作,以确保我们在 Go 版本上尽早尽可能严格地测试 Kubernetes,并努力解决作为此过程一部分的破坏我们 CI 的更改。有关我们如何跟踪此过程的示例,请参见此处

发布周期和当前优先级

FSM:在发布周期中是否会有任何变化?

MJ:在发布周期中,特别是在代码冻结之前,通常会有一些更改,这些更改会添加/更新/删除依赖项,修复需要修复的代码,这是我们努力保持在受支持的 Go 版本上的工作的一部分。

此外,其中一些更改也是向后移植到我们支持的发布分支的候选者。

FSM:子项目目前正在进行哪些你想重点介绍的主要项目或主题?

MJ:我认为最近添加的一个非常有趣且非常有用的更改(我借此机会特别强调 Tim Hockin 在此方面的工作)是 将 Go 工作区引入 Kubernetes 存储库。我们当前用于依赖项管理和代码发布的大量工具,以及在 Kubernetes 存储库中编辑代码的体验,都可以通过此更改得到显着改进。

总结

FSM:对该主题感兴趣的人如何开始帮助子项目?

MJ:第一步,就像 Kubernetes 中任何项目的第一步一样,是加入我们的 Slack:slack.k8s.io,然后加入 #k8s-code-organization 频道。还有一个代码组织办公时间,你可以选择参加。时区很困难,因此也请随时查看录音或会议记录,并在 Slack 上跟进!

FSM:太棒了,谢谢!你还有什么想分享的最终评论吗?

MJ:代码组织子项目总是需要帮助!特别是像发布机器人这样的领域,所以请不要犹豫,加入 #k8s-code-organization Slack 频道。