如何在本地 Kubernetes 集群构建并部署修改后的 Dapr 运行端到端测试?
【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/dapr
你修改了 Dapr 的源码,想验证改动是否影响 sidecar 注入、pub/sub、actor 等核心行为。Dapr 仓库自带一套 e2e 测试框架:它会从你本地的构建产物打出 Docker 镜像,推送到你的容器镜像仓库,部署到本地 Kubernetes 集群,然后部署一批测试应用并调用 Dapr API 验证功能。本文按 E2E 测试指南 说明这条"构建 → 部署 → 跑测试"的完整路径,适用于已经按 开发环境文档 准备好工具链、并有本地集群(如 Minikube)的场景。
准备条件
按 设置 Dapr 开发环境 的要求准备:
- Git、Docker(Linux 上需配置 Docker 免
sudo运行,否则构建脚本无法工作); - Go 1.26.6 或更高版本;
- Helm v3;
- Make(Linux 安装
build-essential,macOS 运行xcode-select --install,Windows 通过 Chocolatey 安装 MinGW 和 make); - 一个本地 Kubernetes 集群;
- 一个容器镜像仓库账号:可以是 Docker Hub(需要创建 Docker Hub ID),也可以是 Azure Container Registry、GitHub Container Registry 等。
然后在 dapr 仓库根目录设置环境变量:
# 使用 Docker Hub 时: export DAPR_REGISTRY=docker.io/your_dockerhub_id # 也可以用其他镜像仓库,例如: # export DAPR_REGISTRY=myregistry.azurecr.io export DAPR_TAG=dev export DAPR_NAMESPACE=dapr-tests export DAPR_MTLS_ENABLED=true # 想给 daprd 容器开启 debug 日志时设置 # export DEBUG_LOGGING=true # 想针对 Windows 或 arm 的 Kubernetes 集群跑测试时设置 # export TARGET_OS=linux # export TARGET_ARCH=amd64 # 交叉编译时(在 MacOS/Windows 上构建、部署到 Linux Kubernetes 集群,或反过来) # export GOOS=linux # export GOARCH=amd64 # 想使用单个 `dapr` 镜像(而不是 sentry、injector、daprd 等独立镜像)时设置 # export ONLY_DAPR_IMAGE=true # 仅在 Minikube 环境设置这一项,非 Minikube 集群不要设置 export DAPR_TEST_ENV=minikube # 使用 Minikube 时,设置其 control plane 的 IP 地址 export MINIKUBE_NODE_IP=your_k8s_master_ip其中your_dockerhub_id替换为你自己的 Docker Hub ID,your_k8s_master_ip替换为 Minikube control plane 的实际 IP(可用minikube ip查看)。如果测试应用镜像要推送到与DAPR_REGISTRY不同的仓库,还可以设置DAPR_TEST_REGISTRY和DAPR_TEST_TAG。使用私有仓库拉取镜像时,用下面这条命令生成DAPR_TEST_REGISTRY_SECRET(把四个占位变量换成你的仓库地址和凭证):
DOCKER_REGISTRY="<url of the registry, such as myregistry.azurecr.io>" DOCKER_USERNAME="<your username>" DOCKER_PASSWORD="<your password>" DOCKER_EMAIL="<your email (leave empty if not required)>" export DAPR_TEST_REGISTRY_SECRET=$( kubectl create secret docker-registry --dry-run=client docker-regcred \ --docker-server="${DOCKER_REGISTRY}" \ --docker-username="${DOCKER_USERNAME}" \ --docker-password="${DOCKER_PASSWORD}" \ --docker-email=${DOCKER_EMAIL} \ -o json | \ jq -r '.data.".dockerconfigjson"' )方式一:一条命令完成构建、部署和测试
如果集群里是干净环境,先卸载已有的 release。以下命令会删除DAPR_NAMESPACE下已有的 Dapr 及测试依赖,执行前确认DAPR_NAMESPACE已正确设置:
helm uninstall dapr dapr-kafka dapr-redis dapr-postgres -n $DAPR_NAMESPACE再删除测试命名空间(该命令会执行kubectl delete namespace,删除整个命名空间内的资源):
make delete-test-namespace注意文档特别提醒的顺序问题:必须先用helm uninstall卸载 release,再删除命名空间。如果反过来先删命名空间再重新部署 Dapr 控制面,sidecar injector 会因 "bad certificate" 失败;已经踩坑的集群可以用helm uninstall恢复。
然后从构建到跑完测试一步到位:
make e2e-build-deploy-run这个目标在 tests/dapr_tests.mk 中定义为init-build-deploy + setup-test-components + build-e2e-app-all + push-e2e-app-all + test-e2e-all,其中init-build-deploy依次执行create-test-namespace、setup-3rd-party(安装 redis、kafka、zipkin、postgres 等 helm 依赖)、build-deploy(build、docker-push、docker-deploy-k8s)。
方式二:分步执行,便于局部迭代
改动集中在某个环节(比如只改了测试应用或只重新编译了 runtime)时,用单独的目标更省时间。
创建命名空间并安装测试依赖
make create-test-namespace为状态存储、pub/sub 和 bindings 安装 redis、kafka、postgres(依赖 Helm 仓库先初始化):
make setup-helm-init make setup-test-env-redis make setup-test-env-postgres # 这一步可能耗时几分钟;如果测试不用 bindings,可以跳过 kafka 安装 make setup-test-env-kafka构建并部署本地修改的 Dapr
# 构建 Linux 二进制 make build-linux # 用 Linux 二进制构建 Docker 镜像 make docker-build # 推送镜像到你的 Docker Hub 仓库(需要先完成 docker login) make docker-push # 把 Dapr runtime 部署到你的集群 make docker-deploy-k8sdocker-deploy-k8s底层是 Makefile 中的helm upgrade --install,带--wait --timeout 5m0s,会阻塞到部署完成,并用DAPR_REGISTRY、DAPR_TAG、DAPR_NAMESPACE、DAPR_MTLS_ENABLED等环境变量渲染 Helm chart。如果想关闭 mTLS,可以额外执行:
make setup-disable-mtls注册测试用的组件配置
make setup-test-components该目标把 tests/config 下的 state store、pubsub、secret store、bindings、subscription 等 YAML 应用到DAPR_TEST_NAMESPACE,结尾会输出kubectl get components和kubectl get configurations的结果,方便确认组件已注册。
构建并推送测试应用
# 构建 tests/apps/ 下所有 e2e 应用镜像 make build-e2e-app-all # 推送到镜像仓库 make push-e2e-app-all运行端到端测试
# 运行全部 e2e 测试 make test-e2e-all只跑其中一部分时,用DAPR_E2E_TEST指定测试名(多个用空格分隔),取值为tests/e2e目录下的文件夹名:
DAPR_E2E_TEST="actor_reminder" make test-e2e-alltest-e2e-all由 gotestsum 驱动,带-timeout 20m -p 3 -tags=e2e参数执行./tests/e2e/...;hotreloading、scheduler、job这几个包与测试套件共享集群状态,会在第二轮单独串行执行(见 tests/dapr_tests.mk 中DAPR_E2E_SERIAL_PACKAGES的说明)。任意一轮失败整个目标都会以非零码退出,并生成test_report_e2e.json、test_report_e2e.xml等报告文件。
验证部署与测试结果
判断改动是否生效、测试是否通过,可以看三类输出:
控制面 Pod 状态。部署完成后列出命名空间内的 Pod,确认
dapr-placement、dapr-operator、dapr-sidecar-injector等都处于1/1 Running(命令形式见 开发指南 中的验证步骤,命名空间换成你的DAPR_NAMESPACE):kubectl get pod -n dapr-tests开发指南中给出的示例输出(文档示例,Pod 名称和 AGE 以你集群实际输出为准):
NAME READY STATUS RESTARTS AGE dapr-operator-86cddcfcb7-v2zjp 1/1 Running 0 4d3h dapr-placement-5d6465f8d5-pz2qt 1/1 Running 0 4d3h dapr-sidecar-injector-dc489d7bc-k2h4q 1/1 Running 0 4d3h组件注册结果:
make setup-test-components结尾打印的kubectl get components/kubectl get configurations列表。测试报告:
make test-e2e-all退出码为 0 且 gotestsum 输出中没有失败用例;需要复查失败细节时看test_report_e2e.json/test_report_e2e.xml。
清理本地环境
测试结束后,如果要彻底移除 Dapr、测试依赖和残留的 e2e 测试应用,先确认DAPR_NAMESPACE设置正确,再执行(这些命令会卸载 release、删除 zipkin 部署和整个命名空间):
helm uninstall dapr -n $DAPR_NAMESPACE || true helm uninstall dapr-kafka -n $DAPR_NAMESPACE || true helm uninstall dapr-redis -n $DAPR_NAMESPACE || true helm uninstall dapr-postgres -n $DAPR_NAMESPACE || true kubectl delete deployment dapr-zipkin -n $DAPR_NAMESPACE || true # 删除测试命名空间 make delete-test-namespace本地的测试产物用make test-clean清理。注意它会删除本地文件:./tests/e2e/*/dist、./tests/perf/*/dist以及test_report_*.json/test_report_*.xml,执行前确认没有还想留存的报告:
make test-clean清理时同样保持"先helm uninstall、后删命名空间"的顺序,否则下次重新部署控制面时 sidecar injector 可能出现 "bad certificate" 故障。
相关文档
- Running End-To-End Tests:本地环境、GitHub Actions、Azure AKS 与 tailscale 三种运行方式的完整说明
- Write E2E test:如何新增自己的测试应用与测试驱动
- Setting up Dapr development environment:工具链安装
- tests/dapr_tests.mk 与 Makefile:各 make 目标的具体实现
【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/dapr
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考