agilelabs-fx-docs main reference/drone-ci-cd.md

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 配置要不要写死在通用页里?” 不要。通用页只说明需要显式配置这些依赖,具体值应放到项目页或示例页。

相关页面