开发
🚧 正在进行中 🚧
本页面旨在为贡献者提供有关开发 kind 项目的介绍。
内容 🔗︎
概述 🔗︎
KIND 提供了各种用于开发的实用程序,这些实用程序都封装在 make
中。
大多数脚本或多或少只需要主机上的 make
+ bash
,并且通常坚持使用 POSIX 实用程序。一些脚本使用 docker
,例如用于构建镜像或使用包含特殊工具的 docker 镜像。
本指南将向您介绍重要的 make 目标及其用法。
构建 🔗︎
构建 kind
🔗︎
调用 make build
,bin/kind
将在成功构建后包含新构建的 kind
二进制文件。
与其他目标一样,此目标会自动管理正确的 .go-version
,并且不需要您安装任何工具(只需 make
/ bash
)。我们使用 hack/third_party/gimme
中的 gimme 副本来实现这一点。
构建基础镜像 🔗︎
注意:大多数开发不需要更改基础镜像,但是如果您的更改确实需要,以下是构建和测试它的方法。
要构建用于开发的“基础镜像”,请在 images/base
目录中使用 make quick
命令:make -C images/base quick
默认情况下,基础镜像将被标记为 kindest/base:$(date +v%Y%m%d)-$(git describe --always --dirty)
格式。如果您想更改它,可以设置 TAG
环境变量。
TAG=v0.1.0 make -C images/base quick
对于“生产”基础镜像,维护者之一将运行 make -C images/base push
,该命令会为所有架构交叉编译并推送到注册表。
您通常不需要在开发过程中进行交叉构建,并且目前交叉构建必须被推送到注册表而不是加载到本地,这是由于 docker buildx
的限制(TODO:链接到上游问题)。
要测试您的更改,请使用 make quick
构建的镜像,并在运行 kind build node-image
/ 构建节点镜像时将其用作 --base-image
标志。然后,您可以使用此节点镜像创建集群(kind create cluster --image=kindest/node:latest
)
对于“生产”基础镜像更新,维护者之一将更新 pkg/build/nodeimage/defaults.go
中的 DefaultBaseImage
,使其指向新推送的镜像。
构建节点镜像 🔗︎
更新生成的代码 🔗︎
您可以使用 make generate
重新生成签入的生成源代码。KIND 不使用太多生成的代码,但确实使用了一点。具体来说,kind 使用 [deepcopy-gen
] 为 API 类型生成 DeepCopy
方法。
还有一个 make update
目标,旨在涵盖所有自动代码生成
- 格式化(
gofmt
)。
测试 🔗︎
- 运行
make test
以运行所有测试(单元测试 + 集成测试)。 - 运行
make unit
以仅运行单元测试。 - 运行
make integration
以仅运行集成测试。
与其他目标一样,这些目标会自动管理正确的 .go-version
,并且不需要您安装任何工具(只需 make
/ bash
)。
端到端测试 🔗︎
🚧 更多内容即将推出 … 🚧
简而言之:hack/ci/e2e.sh
将针对您本地的 Kubernetes 检出运行端到端测试。
根据您的更改,您可能需要进行端到端测试。
将来,我们计划进行更便宜的端到端冒烟测试,这些测试不需要构建 Kubernetes。
代码风格检查 🔗︎
您可以使用 make verify
一次运行所有代码风格检查。
代码风格检查包括
- 检查生成的代码是否是最新的
- 您可以使用
hack/make-rules/verify/generated.sh
仅运行此检查
- 您可以使用
- golangci-lint,使用自定义配置(
hack/tools/.golangci.yml
)来检查 Go 源代码- 您可以使用
make lint
仅运行此检查 - 此代码风格检查器本质上是许多 Go 代码风格检查器的优化组合
- 您可以使用
- shellcheck,用于检查我们的 shell 脚本(通过 docker 调用,因此您不需要安装它)
- 您可以使用
make shellcheck
仅运行此检查
- 您可以使用
文档 🔗︎
我们的文档使用 hugo 构建,就像 kubernetes.io 一样。
我们提供了一个用于开发的 Makefile,它会自动管理 go 工具链,并使用它来构建和运行 hugo。您只需要安装 make
、bash
和 curl
或 wget
。
Markdown 内容位于 site/content/
下,其结构与本网站镜像。
静态文件位于 site/static
下(例如,图像位于 site/static/images/
下)。
对于简单的内容更改,您也可以直接编辑 markdown 源代码并发送拉取请求。netlify 将创建构建预览,您可以通过单击 GitHub 上拉取请求底部 deploy/netlify
状态旁边的“详细信息”链接来浏览它。
这些也是可预测的,例如 https://deploy-preview-$PR_NUMBER--k8s-kind.netlify.app/
,只需将 $PR_NUMBER
替换为您的拉取请求的编号。
对于更复杂的网站/文档开发,您可以从 kind 存储库中运行 make -C site serve
,以运行文档的本地实例,可以在 https://127.0.0.1:1313 上浏览。
此网站在 site/layouts
和 site/assets
下有一个自定义的 hugo 主题。它大多比较简单,但有一些额外的功能
- 主题布局在页面 前置 matter 中接受
description
参数- 这将呈现您在页面标题下方看到的引用块,在本页面上,文本为
本页面旨在为贡献者提供有关开发 kind 项目的介绍。
- 这将呈现您在页面标题下方看到的引用块,在本页面上,文本为
- 我们有一些有用但简单的自定义简码
简码 🔗︎
简码 是 hugo 的一项功能,kind 文档使用以下自定义简码
-
absURL
– 当您需要绝对 URL(例如,对于kubectl apply -f $URL
)时,此简码会将输入 URL 转换为绝对 URL。用法:{{< absURL "some/URL" >}}
-
securitygoose
– 这是一个用于有趣的安全通知的特殊简码。它会包装内部 markdown 内容。用法:{{< securitygoose >}} 这里有通知 markdown 内容 {{</ securitygoose >}}
-
codeFromFile
– 从文件创建带有复制按钮的漂亮代码块。用法:{{< codeFromFile file="static/examples/config-with-mounts.yaml" lang="yaml" >}}
-
codeFromInline
– 从内联代码片段创建带有复制按钮的漂亮代码块。用法:{{< codeFromInline lang="go" >}} func main() {{</ codeFromInline >}}
-
readFile
– 用于内联文件内容。用法:{{% readFile "static/examples/ingress/contour/patch.json" %}}
CI 🔗︎
KIND 项目在 Kubernetes 的自定义 CI“prow”(prow.k8s.io)中/上运行。这对于 KIND 存储库中的 CI 和 Kubernetes 存储库中使用 kind 测试 Kubernetes 的 CI 都是如此。
需要注意的是,我们在 kind 存储库中运行更大、更慢的 Kubernetes 端到端测试,以模拟我们在 Kubernetes 存储库中运行的测试。这是因为 Kubernetes 使用 kind 在 HEAD 进行测试,以获得运行最新 Kubernetes 的最新修复程序。我们确保测试在合并任何代码更改之前继续在 kind 存储库中运行。
我们还对 GitHub Actions 进行了一些有限的实验,目前仅用于测试 kind 中对 podman
或 nerdctl
的支持。
配置 🔗︎
我们存储库的 prow 配置位于 https://git.k8s.io/test-infra/config/jobs/kubernetes-sigs/kind
GitHub Actions 在 kind 存储库中的 .github/workflows
中配置。