ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

k0s 贡献者测试指南:从本地验证到集成测试(Smoketest)的完整实践

k0s 贡献者测试指南:从本地验证到集成测试(Smoketest)的完整实践 云原生容器编排边缘计算【免费下载链接】k0sk0s - The Zero Friction Kubernetes项目地址https://gitcode.com/gh_mirrors/k0/k0s点击查看免费下载导读本文是 k0sThe Zero Friction Kubernetes仓库面向贡献者的测试实战指南覆盖从提交 PR 前的本地静态检查、单元测试、基础集群冒烟测试到基于 Docker bootloose 的集成测试inttest / smoketest的完整流程。读完本文你将掌握 k0s 贡献者标准化的验证命令make lint、make check-unit、make check-basic等、集成测试的架构与运行方式、测试失败时的日志与 support bundle 调试技巧以及 CI 与本地工作区的清理方法。k0s 的测试体系与 PR 门槛k0s 使用 GitHub Actions 在 pull request 上自动运行测试。工作流只有在 k0s maintainer 批准之后才会执行而且一个 PR 只有在所有测试全部通过后才会被合并。这意味着贡献者提交 PR 前应当先在本地把测试跑一遍以免 PR 在漫长的 CI 队列中等待、甚至因低级错误而过期go stale。从仓库结构看k0s 的测试分为两大类单元测试与源码同目录的*_test.go文件覆盖cmd/、pkg/、internal/、static/、hack/等目录见 Makefile 中的GO_CHECK_UNIT_DIRS定义集成测试inttest / smoketest位于inttest/目录真正拉起 k0s 集群进行端到端验证见 inttest/README.md。提交前的本地验证Local Verifications在提交代码之前请依次运行以下风格与格式化检查命令并修复、提交产生的变更。这些命令能拦截格式问题与常见错误对于它们覆盖不到的更深层问题可以参考 k0s 代码规范该文档对代码规模、注释、错误消息、日志级别、跨版本兼容性、测试写法等给出了详细约定。1. Lintingk0s 使用golangci-lint做风格验证。在仓库根目录直接执行make lint无需手动安装golangci-lint构建系统会自动处理。从 Makefile 可以看到lint目标由两部分组成lint-copyright调用hack/copyright.sh检查 SPDX 版权头lint-go通过go install安装并运行golangci-lint同时使用lint-invisible-unicode检查源码中是否混入零宽空格、不间断空格等不可见 Unicode 字符这类字符极易导致 CI 失败且肉眼难查。2. Go 格式化go fmt ./...3. 文档检查如果改动涉及文档请按照 本地测试文档的说明 验证变更。k0s 文档基于 mkdocs 构建仓库提供了 Docker 化的一键预览make docs-serve-dev文档将发布到 http://localhost:8000。若 8000 端口被占用可以换端口例如make docs-serve-dev DOCS_DEV_PORT9999详见 docs/contributors/docs.md。4. 提交前的飞行检查Pre-submit Flight Checks在仓库根目录下确保以下命令全部成功make build git diff --exit-code验证构建可用且生成的源码如 API 代码生成产物与仓库中已提交的内容完全一致。这一点对 k0s 尤为重要因为 Makefile 中定义了基于controller-gen、register-gen、client-gen的代码生成流程改动pkg/apis/下的 API 定义后必须重新生成并提交zz_generated.*.go与static/_crds/下的 CRD 清单make check-unit验证所有单元测试通过。该目标在 amd64/arm64 上会额外启用-race竞态检测arm/riscv64 除外见 Makefilemake check-basic验证基础集群功能——使用 1 个 controller 和 2 个 worker 拉起完整集群make check-hacontrolplane验证 controller 的加入join机制即多控制器 HA 控制面是否正常工作。其中最后一个测试容易出现偶发失败flaky偶尔失败一次可能并非你的代码问题但如果它持续失败就需要深入排查代码找到真正的问题根源。全部通过后就可以放心地向 k0s 上游仓库提交 pull request 了。集成测试inttests / smoketests集成测试位于inttest/目录在 CI 中作为 smoketests 运行。这些测试使用Docker和bootloose 节点在本地拉起真实的 k0s 集群详见 inttest/README.md。测试设计架构从源码看inttest 采用 Go testing testify 的 suite 概念构建见 inttest/common/bootloosesuite.go 的BootlooseSuite定义Suite 级 SetupSetupSuite负责创建测试基础设施——即通过 bootloose 启动一组虚拟机节点等待 SSH 可达并可选地启动 HAProxy 负载均衡、镜像仓库registry等辅助组件Suite 级 TeardowncleanupSuite负责销毁基础设施并在测试失败时收集各节点的日志与 support bundle节点按固定命名规则生成controller0..N、worker0..N还支持lb0负载均衡、etcd0外部 etcd、registry0镜像仓库等角色套件通过 SSHroot 用户 bootloose 私钥在节点上执行k0s命令例如InitController调用k0s controller、GetJoinToken调用k0s token create --role...、GetKubeConfig调用k0s kubeconfig admin从而驱动真实集群的启动与验证。以 inttest/basic/basic_test.go 为例TestBasicSuite定义了ControllerCount: 1, WorkerCount: 2然后在TestK0sGetsUp中依次验证自定义>make check-name示例make check-basic make check-ap-airgapcheck-前缀后面的名字会由 inttest 的 Makefile 自动解析为对应的测试包目录取目标名的最长目录前缀并最终执行类似go test -count1 -v -timeout TIMEOUT github.com/k0sproject/k0s/inttest/package的命令。完整的可用目标清单定义在 inttest/Makefile.variables涵盖 addons、airgap、backup、calico、dualstack、etcd、kine、kubectl、metrics、nllb、patches、reset、stackapplier 等数十个场景例如make check-backup make check-calico make check-dualstack-calico make check-etcdmember make check-kine make check-network-conformance-calico镜像包image bundle部分测试如 airgap、IPv6 相关需要镜像包。当你运行make check-...时Makefile 会自动构建并接入这些镜像包底层涉及两个环境变量见 Makefile 与 inttest/MakefileK0S_IMAGES_BUNDLEairgap 镜像包由k0s airgap list-images/k0s airgap bundle-artifacts生成对应airgap-image-bundle-linux-arch.tarK0S_EXTRA_IMAGES_BUNDLEIPv6 测试镜像包对应ipv6-test-image-bundle-linux-arch.tar。这两个环境变量在 inttest/common/bootloosesuite.go 中被读取用于把镜像包 bind-mount 进测试节点若未设置相关测试会直接报错提示。另外部分重量级测试通过TIMEOUT变量单独延长了超时默认 6 分钟见 inttest/Makefile例如check-addons为 10 分钟、check-configchange为 8 分钟、check-kubeletcertrotate与网络一致性测试为 15 分钟、check-nllb*系列为 20 分钟。保留测试环境便于调试有时尤其是调试失败时希望测试结束后环境不被销毁。inttest 支持环境变量K0S_KEEP_AFTER_TESTS控制该行为见 inttest/README.md 与 inttest/common/bootloosesuite.go不设置或K0S_KEEP_AFTER_TESTSnever无论测试结果如何测试环境都不保留K0S_KEEP_AFTER_TESTSalways无论测试结果如何测试环境都保留K0S_KEEP_AFTER_TESTSfailure仅当测试失败时保留环境。当环境被保留时测试输出会给出手动清理命令形如TestNetworkSuite: bootloosesuite.go:138: bootloose cluster left intact for debugging. Needs to be manually cleaned with: bootloose delete --config /tmp/afghzzvp-bootloose.yaml调试完成后按提示执行bootloose delete --config 路径手动清理即可。调试本地测试失败当测试失败时套件会把日志和 support bundle 写入临时目录由os.TempDir()决定典型文件包括/tmp/controller*.out.log、/tmp/controller*.err.log/tmp/worker*.out.log、/tmp/worker*.err.log/tmp/support-bundle.tar.gz从 inttest/common/bootloosesuite.go 的cleanupSuite实现可以看到收集逻辑测试失败时会通过 SSH 在每个非辅助节点上执行日志导出dumpNodeLogs按节点写出node.out.log/node.err.log并从 controller0 上执行troubleshoot-k0s-inttest.sh脚本收集 support bundle 到/tmp/support-bundle.tar.gz。调试时先从日志入手也可以使用sbctltroubleshoot 生态的命令行工具配合 support bundle 检查测试结束时测试集群的状态。调试 CI 失败当 CI 运行失败时上述文件会作为 job artifacts 上传并附加到失败的任务上。在 GitHub Actions 界面中打开失败的任务job下载并解压该测试对应的 artifact命名形如smoketest-name-arch-files用与上一节完全相同的方式日志 sbctl support bundle分析提取出的文件。在自己的 fork 上运行 CIk0s 的 GitHub Actions 工作流在可行的情况下尽量使用 GitHub 官方托管的 runner因此你可以在自己的 fork 上运行同一套 CI只需向 fork 的 main 分支推送或在 fork 上发起 pull request 即可触发确保 fork 仓库已启用 GitHub Actions。需要注意的是fork 仓库无法访问 k0s 专用的 ARMv7 runner因此所有 ARMv7 相关的工作流运行会被跳过。在 fork 上跑 CI 往往比向 k0s 仓库提 PR 更快获得反馈原因在于对 k0s 仓库的 PR工作流必须经过 k0s maintainer 批准才会执行而在 fork 上你可以随意摆弄测试与工作流来调试问题。如果你无法在本地运行 smoketest这尤其有用。清理本地工作区构建与测试会在本地产生大量中间产物执行以下命令统一清理make clean它会清理 k0s 构建过程中创建的所有中间文件和目录包括k0s二进制、.bins.*stamp、embedded-binaries-*.zip、Go 构建缓存build/cache、API 代码生成 stamp、airgap / IPv6 镜像包、docs 与 inttest 的产物等见 Makefile。注意不能直接使用git clean -X甚至rm -rf清理因为 Go modules 缓存会把自己的所有子目录设置为只读。如果手动删除工作区时遇到权限问题可以这样做chmod -R uw /path/to/workspace rm -rf /path/to/workspace总结k0s 的测试体系可以用一条清晰的提交前路径概括先用make lint与go fmt ./...做静态与格式把关再用make build git diff --exit-code确认代码生成产物一致接着用make check-unit跑单元测试最后用make check-basic、make check-hacontrolplane等 smoketest 验证真实集群行为。一旦测试失败优先查看/tmp下的节点日志与 support bundle必要时用K0S_KEEP_AFTER_TESTSfailure保留环境深入排查CI 失败则下载 job artifact 复用同样的调试手段。这套流程既保证了 k0s 上游代码质量也让贡献者能在提交前自测、在 fork 上自由调试真正做到零摩擦地参与 k0s 开发。赞分享云原生容器编排边缘计算【免费下载链接】k0sk0s - The Zero Friction Kubernetes项目地址https://gitcode.com/gh_mirrors/k0/k0s点击查看免费下载相关推荐TorchTitan 贡献指南从环境搭建、Loss 验证到集成测试的完整贡献路径TorchTitan 贡献指南从环境搭建、Loss 验证到集成测试的完整贡献路径 TorchTitan 是 PyTorch 原生的生成式模型训练平台仓库的人工智能大模型预训练分布式训练强化学习PocketPal 贡献者实战指南从本地调试到 CI 验证的完整开发闭环PocketPal 贡献者实战指南从本地调试到 CI 验证的完整开发闭环 本文基于 PocketPal 官方贡献指南 CONTRIBUTING.md http人工智能AI 应用大模型本地部署移动开发语音Playnite 使用指南把 Steam、Epic、GOG 的游戏收进同一个窗口Playnite 使用指南把 Steam、Epic、GOG 的游戏收进同一个窗口 Playnite 把 Steam、Epic、GOG 上散落的几百款游戏收进同桌面应用游戏开发上一篇url_launcher_platform_interface 深度解析Flutter 联邦插件公共平台接口的设计与实现下一篇突破云存储壁垒Syncthing混合云同步方案全攻略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进