live-forum/CI-CD部署文档.md
zpc 10d89a85c8
All checks were successful
continuous-integration/drone/push Build is passing
cicd
2026-03-24 14:37:02 +08:00

135 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 个步骤:
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
```bash
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
```
## 五、前置条件
### 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-forum``library`
2. `library` 为公开项目存放基础镜像pull 不需要登录)
3. `live-forum` 存放业务镜像,推送需要认证
4. 当前使用 HTTP`insecure: true`
### 5.3 部署服务器192.168.195.15
1. 安装 Docker 和 Docker Compose
2. 配置 Docker 信任 HarborHTTP
```bash
# /etc/docker/daemon.json
{
"insecure-registries": ["192.168.195.25:19900"]
}
# 重启 Docker
systemctl restart docker
```
3. 登录 Harbor
```bash
docker login 192.168.195.25:19900
```
4. 部署目录:`/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 标签:
```bash
# 在服务器上修改 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",选择分支即可。