live-forum/CI-CD部署文档.md
zpc 442f32a043
All checks were successful
continuous-integration/drone/push Build is passing
feat(deployment): add v1.2.0 database scripts and improve Docker/auth configuration
- Add v1.2.0 complete database upgrade scripts for business and admin databases
- Enhance WeChat login logic to handle OpenId reassociation when user logs in via phone number
- Add UpdatedAt timestamp update in WeChat login record updates
- Configure Docker container permissions for AgileConfig cache file writes
- Add Caddy image tagging to CI-CD deployment documentation
- Update frontend Config.js for deployment configuration management
2026-03-26 22:10:57 +08:00

4.6 KiB
Raw Permalink Blame History

CI/CD 部署文档

本文档描述 LiveForum 论坛社区项目的 CI/CD 流水线配置,基于 Drone CI + Docker + Harbor 私有镜像仓库。

一、整体架构

代码推送 (master) → Drone CI 触发 → 构建 Docker 镜像 → 推送 Harbor → SSH 部署到服务器
组件 说明
CI 平台 Drone CI (192.168.195.25:13080)
镜像仓库 Harbor (192.168.195.25:19900HTTP
部署方式 Docker Compose
部署服务器 192.168.195.15
触发条件 master 分支 push 事件

二、构建的镜像

镜像 说明 Dockerfile 构建上下文
live-forum/webapi 小程序 API.NET 8 server/webapi/LiveForum/LiveForum.WebApi/Dockerfile server/webapi/LiveForum
live-forum/admin-api 后台管理 API.NET 8 server/admin/ZrAdminNetCore/ZR.Admin.WebApi/Dockerfile server/admin/ZrAdminNetCore
live-forum/admin-web 后台管理前端Vue 3 + Nginx server/admin/ZrAdminNetCore/ZR.Vue/Dockerfile server/admin/ZrAdminNetCore/ZR.Vue

每个镜像打两个标签:latest 和 commit SHA 前 8 位(用于回滚)。

三、流水线步骤

.drone.yml 定义了 4 个步骤:

  1. build-webapi — 构建小程序 API 镜像
  2. build-admin-api — 构建后台管理 API 镜像
  3. build-admin-web — 构建后台管理前端镜像
  4. deploy — SSH 部署(等待前三步完成)

三个构建步骤默认并行执行deploy 步骤通过 depends_on 等待全部完成后执行。

四、基础镜像(内网 Harbor

所有 Dockerfile 的基础镜像已切换到内网 Harbor避免依赖外网

基础镜像 内网地址 用途
dotnet/aspnet:8.0 192.168.195.25:19900/library/dotnet/aspnet:8.0 .NET 运行时
dotnet/sdk:8.0 192.168.195.25:19900/library/dotnet/sdk:8.0 .NET 构建
node:18-alpine 192.168.195.25:19900/library/node:18-alpine Vue 前端构建
nginx:alpine 192.168.195.25:19900/library/nginx:alpine 前端运行

如需更新基础镜像在能访问外网的机器上拉取、tag、push

docker pull mcr.microsoft.com/dotnet/aspnet:8.0
docker tag mcr.microsoft.com/dotnet/aspnet:8.0 192.168.195.25:19900/library/dotnet/aspnet:8.0
docker push 192.168.195.25:19900/library/dotnet/aspnet:8.0
docker tag caddy:alpine 192.168.195.25:19900/library/caddy:alpine
 

五、前置条件

5.1 Drone CI Secrets

在 Drone 仓库设置 → Secrets 中配置:

Secret 名称 说明
harbor_username Harbor 仓库用户名
harbor_password Harbor 仓库密码
ssh_username 部署服务器 SSH 用户名
ssh_password 部署服务器 SSH 密码

5.2 Harbor 镜像仓库

  1. 在 Harbor 中创建项目 live-forumlibrary
  2. library 为公开项目存放基础镜像pull 不需要登录)
  3. live-forum 存放业务镜像,推送需要认证
  4. 当前使用 HTTPinsecure: true

5.3 部署服务器192.168.195.15

  1. 安装 Docker 和 Docker Compose
  2. 配置 Docker 信任 HarborHTTP
# /etc/docker/daemon.json
{
  "insecure-registries": ["192.168.195.25:19900"]
}

# 重启 Docker
systemctl restart docker
  1. 登录 Harbor
docker login 192.168.195.25:19900
  1. 部署目录:/disk/docker-compose/live-forum-new

六、常见问题

Q: 构建时拉取基础镜像失败?

基础镜像需要提前推送到内网 Harbor。Drone CI 的 Docker daemon 也需要配置 insecure-registries(在 .drone.yml 中通过 insecure: true 处理推送,但 Dockerfile 中的 FROM 拉取需要 runner 层面配置)。

Q: Harbor 认证失败unauthorized

检查 Drone Secrets 中的 harbor_username / harbor_password 是否正确且未过期。

Q: 部署后服务没更新?

  1. 检查 docker compose pull 是否拉到了新镜像
  2. 确认服务器 Docker 已配置 insecure-registries
  3. 检查容器状态:docker compose ps / docker compose logs

Q: 如何回滚?

使用 commit SHA 标签:

# 在服务器上修改 docker-compose.yml 中的镜像标签
# 例如将 :latest 改为 :a1b2c3d4
docker compose up -d

Q: admin-web 构建报 COPY failed: stat app/dist

vite.config.jsoutDir 配置了服务器绝对路径Dockerfile 中已通过 npx vite build --mode production --outDir dist 覆盖输出到 dist 目录。

Q: 如何手动触发构建?

在 Drone 界面找到对应仓库,点击 "New Build",选择分支即可。