Drone CI/CD 参考
本页收纳 AgileLabs 项目使用 Drone 组织 CI/CD 的参考做法,重点覆盖前后端混合仓库、多前端构建、ClientApp 产物汇总、容器镜像打包和 Kubernetes 部署。它不是框架级强制规范,而是项目级交付流水线的推荐组织方式。
适用场景
- 使用 Drone 作为持续集成与持续部署平台的项目。
- 同一仓库同时包含 ASP.NET Core 后端和多个前端应用的项目。
- 需要把多个前端构建产物汇总到
ClientApp或发布目录后再统一打包的项目。 - 需要构建 Docker 镜像并部署到 Kubernetes 的项目。
推荐流水线结构
- 先做 runner 侧准备,再进入真正的业务构建步骤。
- 将前端构建拆成多个独立步骤并行执行,避免单个前端失败拖慢整条链路的定位效率。
- 后端发布单独产出发布目录,不把镜像构建和
dotnet publish混在一个步骤里。 - 前端与后端产物都完成后,再执行一次汇总步骤,把前端构建结果同步到发布目录或
ClientApp。 - 最后再做镜像构建、推送和 Kubernetes 滚动更新。
关键阶段
Runner 前置准备
- 提前准备 Docker 凭据、Kubernetes 配置和构建机所需的共享缓存目录。
- 在 Drone 的第一个步骤里验证 Docker 登录和
kubectl连通性,尽早暴露环境问题。 - 如果项目使用私有镜像仓库或私有包源,应在这一层完成认证准备,不要等到中间步骤才失败。
前端构建
- 每个前端应用使用独立步骤执行安装、测试、类型检查和构建。
- Node 构建建议统一容器镜像版本,避免不同前端项目之间漂移。
- 包缓存建议落到共享目录,例如
pnpm store,避免每次全量下载。 - 如果前端项目需要把产物同步回后端宿主,构建步骤只负责生成
dist,同步动作放到后置汇总步骤。
后端发布
- 后端步骤只做
dotnet publish,目标是稳定产出可打包目录。 - NuGet 缓存和 .NET SDK 缓存建议落到构建机共享目录,减少重复恢复。
- 版本号应在后端发布或统一打包前生成,并写入发布目录,供镜像打包和部署步骤复用。
- 如果仓库使用项目级包源,应在
NuGet.config或命令参数中显式指向https://nuget.feinian.net或其 v3 源入口。
产物汇总
- 使用单独步骤汇总所有前端产物和后端发布目录。
- 如果项目采用
ClientApp托管前端,建议把多前端同步逻辑收敛到脚本,不在 Drone YAML 中手工复制大量cp命令。 - 该步骤应只依赖已经完成的前端构建和后端发布,不再承担编译职责。
镜像与部署
- 基于汇总后的发布目录构建 Docker 镜像,避免在镜像构建阶段重新编译应用。
- 推送镜像后再执行 Kubernetes 滚动更新,部署命令和镜像标签保持同源。
- Kubernetes namespace、deployment 名称、镜像仓库地址和 runner 节点名都属于项目环境细节,不应被写成框架默认值。
依赖与产物关系
- 推荐把环境准备步骤作为前端构建和部署链路的共同前置。
- 前端步骤彼此独立时应尽量并行,以缩短总时长。
- 后端发布可以与部分前端构建并行,但产物汇总必须等待所有必要构建完成。
- 镜像打包与部署必须只消费已经准备好的最终发布目录,不应再依赖源码目录里的临时构建状态。
常见问题
- “为什么不直接在一个步骤里完成前端构建、后端发布和部署?” 因为这样会让失败定位、缓存复用和并行执行都变差,流水线也更难维护。
- “前端构建一定要放多个步骤吗?” 不一定,但多前端仓库通常更适合按应用拆分,失败范围更明确。
- “
type: exec和在步骤里运行docker run冲突吗?” 不冲突。前者是 Drone runner 类型,后者只是该 runner 上执行的命令方式。 - “包源、镜像仓库、Kubernetes 配置要不要写死在通用页里?” 不要。通用页只说明需要显式配置这些依赖,具体值应放到项目页或示例页。