All checks were successful
continuous-integration/drone/push Build is passing
- Dockerfile基础镜像切换到内网Harbor (192.168.195.25:19900) - .drone.yml registry从外网域名改为内网Harbor - Admin Dockerfile增加前端构建阶段(多阶段构建) - 新增基础镜像推送脚本 (push-base-images.ps1/sh) - 更新CI-CD部署文档
136 lines
4.3 KiB
Markdown
136 lines
4.3 KiB
Markdown
# CI/CD 部署文档
|
||
|
||
本文档描述 MiAssessment 学业邑规划项目的 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 | 构建上下文 |
|
||
|------|------|-----------|-----------|
|
||
| `mi-assessment/api` | 小程序 API(.NET 10) | `server/MiAssessment/src/MiAssessment.Api/Dockerfile` | `server/MiAssessment` |
|
||
| `mi-assessment/admin` | 后台管理 API + 前端(.NET 10,内含 admin-web 构建产物) | `server/MiAssessment/src/MiAssessment.Admin/Dockerfile` | `server/MiAssessment` |
|
||
|
||
每个镜像打两个标签:`latest` 和 commit SHA 前 8 位(用于回滚)。
|
||
|
||
## 三、流水线步骤
|
||
|
||
`.drone.yml` 定义了 3 个步骤:
|
||
|
||
1. `build-api` — 构建小程序 API 镜像
|
||
2. `build-admin` — 构建后台管理 API 镜像
|
||
3. `deploy` — SSH 部署(等待前两步完成)
|
||
|
||
> 两个构建步骤默认并行执行,deploy 步骤通过 `depends_on` 等待全部完成后执行。
|
||
|
||
## 四、基础镜像(内网 Harbor)
|
||
|
||
所有 Dockerfile 的基础镜像已切换到内网 Harbor,避免依赖外网:
|
||
|
||
| 基础镜像 | 内网地址 | 用途 |
|
||
|---------|---------|------|
|
||
| `dotnet/aspnet:10.0-preview` | `192.168.195.25:19900/library/dotnet/aspnet:10.0-preview` | .NET 运行时 |
|
||
| `dotnet/sdk:10.0-preview` | `192.168.195.25:19900/library/dotnet/sdk:10.0-preview` | .NET 构建 |
|
||
| `node:20-alpine` | `192.168.195.25:19900/library/node:20-alpine` | Admin 前端构建 |
|
||
|
||
### 一键推送基础镜像
|
||
|
||
在能访问外网的机器上执行脚本,将基础镜像推送到内网 Harbor:
|
||
|
||
```bash
|
||
bash scripts/push-base-images.sh
|
||
```
|
||
|
||
如需手动推送单个镜像:
|
||
|
||
```bash
|
||
docker pull mcr.microsoft.com/dotnet/aspnet:10.0-preview
|
||
docker tag mcr.microsoft.com/dotnet/aspnet:10.0-preview 192.168.195.25:19900/library/dotnet/aspnet:10.0-preview
|
||
docker push 192.168.195.25:19900/library/dotnet/aspnet:10.0-preview
|
||
```
|
||
|
||
## 五、前置条件
|
||
|
||
### 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 中创建项目 `mi-assessment` 和 `library`
|
||
2. `library` 为公开项目,存放基础镜像(pull 不需要登录)
|
||
3. `mi-assessment` 存放业务镜像,推送需要认证
|
||
4. 当前使用 HTTP(`insecure: true`)
|
||
|
||
### 5.3 部署服务器(192.168.195.15)
|
||
|
||
1. 安装 Docker 和 Docker Compose
|
||
2. 配置 Docker 信任 Harbor(HTTP):
|
||
|
||
```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/mi-assessment`
|
||
|
||
## 六、常见问题
|
||
|
||
### Q: 构建时拉取基础镜像失败?
|
||
|
||
基础镜像需要提前推送到内网 Harbor。运行 `bash scripts/push-base-images.sh` 一键推送。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: 如何手动触发构建?
|
||
|
||
在 Drone 界面找到对应仓库,点击 "New Build",选择分支即可。
|