All checks were successful
continuous-integration/drone/push Build is passing
- 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
4.6 KiB
4.6 KiB
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:19900,HTTP) |
| 部署方式 | 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 个步骤:
build-webapi— 构建小程序 API 镜像build-admin-api— 构建后台管理 API 镜像build-admin-web— 构建后台管理前端镜像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 镜像仓库
- 在 Harbor 中创建项目
live-forum和library library为公开项目,存放基础镜像(pull 不需要登录)live-forum存放业务镜像,推送需要认证- 当前使用 HTTP(
insecure: true)
5.3 部署服务器(192.168.195.15)
- 安装 Docker 和 Docker Compose
- 配置 Docker 信任 Harbor(HTTP):
# /etc/docker/daemon.json
{
"insecure-registries": ["192.168.195.25:19900"]
}
# 重启 Docker
systemctl restart docker
- 登录 Harbor:
docker login 192.168.195.25:19900
- 部署目录:
/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: 部署后服务没更新?
- 检查
docker compose pull是否拉到了新镜像 - 确认服务器 Docker 已配置
insecure-registries - 检查容器状态:
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.js 中 outDir 配置了服务器绝对路径,Dockerfile 中已通过 npx vite build --mode production --outDir dist 覆盖输出到 dist 目录。
Q: 如何手动触发构建?
在 Drone 界面找到对应仓库,点击 "New Build",选择分支即可。