贡献 HAMi
HAMi 是一个 CNCF Sandbox 项目,为 Kubernetes 带来 GPU 和 AI 加速器虚拟化能力。调度器、device plugin、文档和工具链都由社区贡献者共同构建和维护。
无论你是修复一个错别字,还是实现一个全新的硬件后端,本指南都是你开始贡献的起点。
核心原则
你必须理解自己提交的每一处改动。
使用工具辅助编写代码或文档是可以的,但提交一个你无法解释的改动是不可以的。如果审阅者询问某段代码为什么这样写而你答不上来,这个 PR 就不会被合并。无论改动是如何产生的,这条原则适用于所有贡献。
在 HAMi 中,这一点比大多数项目更重要。管理 GPU 显存、设备调度或加速器生命周期的代码如果出错,可能导致数据损坏、硬件故障或静默的资源错误分配。"看起来是对的"是不够的。
行为准则
所有社区成员都必须遵守 CNCF 行为准则。违规行为请通过 cncf-coc@lists.cncf.io 报告给 CNCF 行为准则委员会。
贡献方式
写代码并不是贡献的唯一方式。
| 贡献类型 | 具体内容 |
|---|---|
| 缺陷报告 | 提交带有复现步骤和环境信息的详细 issue |
| 缺陷修复 | 提交带有覆盖该修复的测试用例的 PR |
| 新功能 | 先开 issue 对齐方案,再提交 PR |
| 文档 | 修正错误、补齐缺失内容、增加示例、提升可读性 |
| 博客文章 | 分享 HAMi 的使用场景、集成方案或版本亮点 |
| 翻译 | 将英文文档翻译为中文,或维护现有的中文翻译 |
| 代码审查 | 阅读开放的 PR 并给出技术反馈 |
| Issue 分类 | 复现缺陷、追问缺失信息、关闭过期 issue |
| 社区支持 | 在 Slack 或 GitHub Discussions 中回答问题 |
社区
| 渠道 | 用途 |
|---|---|
| GitHub Issues | 缺陷报告和功能请求 |
| GitHub Discussions | 提问、想法、设计方案 |
| Discord | 实时聊天(推荐) |
| CNCF Slack #hami-dev | 实时聊天 |
| MAINTAINERS | 当前维护者列表 |
| 社区会议 | 双周 Zoom 会议,周三 16:30 UTC+8。iCal 订阅 |
| Zoom 会议链接 | 加入双周社区会议 |
在提交 issue 或 PR 之前,请先搜索已有的 issue 和讨论,确认是否已有相关工作。
刚接触 HAMi? 加入 Discord 或 CNCF Slack #hami-dev 并自我介绍一下。维护者和现有贡献者都乐意在你提交 PR 之前帮你找一个合适的入门 issue、审阅草稿或回答问题。
前提条件
所有贡献都需要:
- 一个带 Git 的 GitHub 账号
- 能够根据开发者原创声明(DCO)对贡献进行认证
贡献 HAMi 核心代码(Go)需要:
- Go 1.26+
kubectl,以及一个带受支持 GPU 或加速器的 Kubernetes 集群
贡献文档(网站)需要:
- Node.js v20
- npm
环境搭建
Fork 和克隆
在 GitHub 上 fork 目标仓库,然后克隆你的 fork:
export user="your-github-username"
# 贡献 HAMi 核心代码
git clone https://github.com/$user/HAMi.git
cd HAMi
git remote add upstream https://github.com/Project-HAMi/HAMi.git
git remote set-url --push upstream no_push # 防止误推送到 upstream
# 贡献文档网站
git clone https://github.com/$user/website.git
cd website
git remote add upstream https://github.com/Project-HAMi/website.git
npm install
保持同步
在开始新工作之前,让本地 master 分支与 upstream 保持同步:
git fetch upstream
git checkout master
git rebase upstream/master
使用 rebase 而不是 merge,以保持干净的提交历史。
关于完整 Git 工作流程的详细说明,参见 GitHub 工作流程指南。
寻找可以处理的工作
好的起点:
good first issue- 范围明确、文档齐全,对新贡献者友好help wanted- 欢迎贡献,可能需要一些领域知识- 网站仓库中的文档缺口和失效链接
当你决定处理某个 issue 时,请在上面留言。维护者会将其分配给你,以避免重复劳动。
贡献者工作流程
分支命名
使用简短、能反映改动内容的分支名:
git checkout -b fix/gpu-memory-calculation
git checkout -b feat/kunlunxin-multi-card
git checkout -b docs/update-ascend-guide
小改动与大改动
任何新增或改动超过 100 行代码或文档的 PR,都需要先有一个 GitHub issue 或讨论。 先开 issue,说明你想做什么、为什么要做,等待维护者反馈后再开始写代码,之后才提交 PR。
小改动(缺陷修复、错别字修正、100 行以内的文档改进):可以直接提交 PR,无需先开 issue。
大改动(新功能、API 变更、新硬件后端、跨多个包的重构 、超过 100 行的文档新增):
- 开一个 GitHub issue,描述问题和你提议的方案。
- 在投入大量时间之前,先获得维护者的认可。
- 一旦方向明确,尽早开一个草稿 PR,在实现完成前就分享进展。
对于大改动,如果 PR 在没有先开 issue 的情况下提交,会被要求回去先开一个 issue。
推送前先验证
Go 代码:
make verify
make test
文档:
npm run build:fast # 仅英文,约 45 秒,开发过程中使用
npm run build # 全量构建,包含所有语言,约 80 秒,与 CI 一致
代码风格
Go
- 提交前用
gofmt格式化所有代码,未格式化的代码会导致 CI 失败。 - 遵循 Go Code Review Comments 中的风格约定。
- 在合适的地方编写表驱动测试,测试名称应描述场景,而不是函数本身。
- 保持函数短小、专注。如果一个函数需要很长的注释才能说明它在做什么,考虑拆分它。
- 错误信息应为小写,且不以标点结尾(Go 惯例)。
文档
参见文档贡献指南中的写作风格一节。