Files
aiot-platform-ui/scripts/deploy/README.md
lzh e508bd692d
All checks were successful
Web UI CI/CD / build-and-deploy (push) Successful in 8s
chore: build and deploy web-antd
2025-12-23 14:09:26 +08:00

386 lines
11 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 | 说明 |
| ---------------------- | -------------- | --------------------------- |
| 修改源码 | ❌ 否 | 需要先本地构建,再推送 dist |
| 推送 dist 目录 | ✅ 是 | 自动触发部署 |
| 修改 nginx.conf | ✅ 是 | 自动触发部署 |
| 修改 Dockerfile.deploy | ✅ 是 | 自动触发部署 |
**快速部署命令**
```bash
./scripts/deploy/build-and-push.sh
```
## 方案说明
本方案采用**本地构建 + 服务器部署**的方式,避免在服务器上进行资源密集的构建过程,从而解决服务器资源占用问题。
**重要提示**
-**修改源码不会触发 CI/CD**:只有推送 `dist` 目录时才会触发部署
-**必须先本地构建**:在推送前需要在本地执行构建命令
-**服务器零构建压力**:服务器只负责轻量级的 Docker 镜像打包,不进行构建
## 工作流程
```
本地开发 → 本地构建 → 推送 dist → CI/CD 自动部署 → 服务器运行
↓ ↓ ↓ ↓ ↓
修改源码 pnpm build git push 检测 dist 变化 Docker 打包
(不触发) (生成 dist) (触发) (自动部署) (不构建)
```
详细步骤:
1. **本地开发**:修改源码(`apps/web-antd/src/**`),此时不会触发 CI/CD
2. **本地构建**:在本地执行构建命令,生成 `apps/web-antd/dist` 目录
3. **推送构建产物**:将 `dist` 目录提交并推送到 Git 仓库
4. **自动部署**CI/CD 检测到 `dist` 目录变化,自动部署到服务器
5. **服务器部署**:服务器只进行 Docker 镜像打包,不进行构建
## 使用方法
### 方式一:使用自动化脚本(推荐)
**Windows PowerShell 用户**
```powershell
# 在项目根目录执行
.\scripts\deploy\build-and-push.ps1
```
**Linux/Mac 用户**
```bash
# 在项目根目录执行
./scripts/deploy/build-and-push.sh
```
**或者使用 Git BashWindows**
```bash
bash scripts/deploy/build-and-push.sh
```
脚本会自动:
- 清理旧的构建产物
- 安装依赖(如果需要)
- 执行构建
- 检查构建结果
- 使用 `--no-verify` 跳过 pre-commit hooks避免检查大量构建产物文件
- 提示是否提交并推送
### 方式二:手动操作
```bash
# 1. 本地构建
pnpm build:antd
# 2. 检查构建结果
ls -la apps/web-antd/dist
# 3. 提交并推送
git add apps/web-antd/dist
git commit -m "chore: build and deploy web-antd"
git push origin master
```
## 文件说明
- `Dockerfile.deploy`: 仅用于部署的 Dockerfile不进行构建只复制构建产物
- `build-and-push.sh`: 本地构建和推送脚本Linux/Mac/Git Bash
- `build-and-push.ps1`: 本地构建和推送脚本Windows PowerShell
- `.gitea/workflows/deploy-web.yaml`: CI/CD 工作流配置(已修改为仅部署模式)
## CI/CD 触发条件
### ✅ 会触发部署的情况
当以下文件变化时会触发自动部署:
- `apps/web-antd/dist/**` - **构建产物目录(主要触发条件)**
- `apps/web-antd/nginx.conf` - Nginx 配置
- `Dockerfile.deploy` - 部署用 Dockerfile
- `.gitea/workflows/deploy-web.yaml` - CI/CD 配置
### ❌ 不会触发部署的情况
以下情况**不会**触发 CI/CD
- 修改源码(`apps/web-antd/src/**`
- 修改依赖包(`packages/**`
- 修改 `package.json``pnpm-lock.yaml`
- 修改原 `Dockerfile`(根目录)
- 修改其他配置文件
**注意**:如果只修改了源码,需要先本地构建生成 `dist` 目录,然后推送 `dist` 才会触发部署。
## 重要注意事项
### 1. 构建产物必须提交到 Git
**重要**`apps/web-antd/dist` 目录在 `.gitignore` 中被忽略,但我们需要将其提交到 Git 才能触发 CI/CD。
**脚本会自动处理**
- 构建脚本(`build-and-push.sh``build-and-push.ps1`)会自动使用 `git add -f` 强制添加 dist 目录
- 你不需要手动修改 `.gitignore` 文件
**手动添加方法**(如果使用脚本):
```bash
# 强制添加被忽略的 dist 目录
git add -f apps/web-antd/dist
```
**检查方法**
```bash
# 检查 dist 是否被 Git 跟踪
git ls-files apps/web-antd/dist
# 如果输出为空,说明 dist 未被跟踪,需要使用 -f 强制添加
```
### 2. 修改源码后必须重新构建
**重要**修改源码后CI/CD **不会自动触发**,需要:
1. 本地执行构建:`pnpm build:antd`
2. 推送构建产物:`git add apps/web-antd/dist && git push`
### 3. 构建环境要求
- **Node.js**: >= 20.12.0
- **pnpm**: >= 10.14.0
- **网络**: 本地构建需要能够访问 npm/pnpm 仓库
### 4. 工作流程建议
**推荐流程**
**Windows PowerShell**
```powershell
# 1. 开发阶段:修改源码(不会触发 CI/CD
# 使用你喜欢的编辑器修改 apps/web-antd/src/xxx.vue
# 2. 测试阶段:本地预览
pnpm dev:antd
# 3. 构建和部署:一键完成
.\scripts\deploy\build-and-push.ps1
```
**Linux/Mac/Git Bash**
```bash
# 1. 开发阶段:修改源码(不会触发 CI/CD
vim apps/web-antd/src/xxx.vue
# 2. 测试阶段:本地预览
pnpm dev:antd
# 3. 构建和部署:一键完成
./scripts/deploy/build-and-push.sh
```
## 优势
**服务器零构建压力**:不占用服务器 CPU/内存/带宽
**构建速度快**:本地资源充足,构建更快
**可离线构建**:不依赖服务器网络
**便于调试**:本地可预览构建结果
**资源友好**:服务器只负责轻量级的 Docker 镜像打包
## 故障排查
### 问题CI/CD 提示构建产物不存在
**解决方案**
1. 检查本地是否成功构建:`ls -la apps/web-antd/dist`
2. 检查 dist 目录是否被 Git 跟踪:`git ls-files apps/web-antd/dist`
3. 如果 dist 在 .gitignore 中,使用强制添加:`git add -f apps/web-antd/dist`
### 问题:构建失败
**解决方案**
1. 检查 Node.js 版本:`node --version`(需要 >= 20.12.0
2. 检查 pnpm 版本:`pnpm --version`(需要 >= 10.14.0
3. 清理并重新安装依赖:`pnpm clean && pnpm install`
4. 查看详细错误信息:`pnpm build:antd --verbose`
### 问题:构建后使用了开发环境配置(如 localhost:5666
**可能原因**
1. 构建时环境变量被开发环境配置覆盖
2. 浏览器缓存了旧的配置
3. Service Worker 缓存了旧版本
**解决方案**
1. **确保使用生产环境构建**
- 脚本已自动设置 `NODE_ENV=production`
- 构建命令使用 `--mode production`
- 检查 `.env.production` 文件中的 `VITE_GLOB_API_URL` 配置
2. **清除浏览器缓存**
- 硬刷新:`Ctrl+Shift+R` (Windows) 或 `Cmd+Shift+R` (Mac)
- 清除浏览器缓存和 Cookie
- 使用无痕模式测试
3. **检查构建产物**
```bash
# 检查构建后的配置文件
cat apps/web-antd/dist/_app.config.js
# 应该显示VITE_GLOB_API_URL 为 "/admin-api" 或正确的生产环境地址
```
4. **如果仍有问题**
- 删除 `apps/web-antd/dist` 目录
- 重新构建:`pnpm build:antd`
- 检查是否有 `.env.local` 文件覆盖了配置
### 问题:推送后 CI/CD 未触发
**可能原因**
1. **只推送了源码,没有推送 dist**:修改源码不会触发 CI/CD
- 解决:先执行 `pnpm build:antd`,然后推送 `dist` 目录
2. **dist 目录未被 Git 跟踪**
```bash
# 检查 dist 是否被跟踪
git ls-files apps/web-antd/dist
# 如果为空,强制添加
git add -f apps/web-antd/dist
git commit -m "chore: add build artifacts"
git push
```
3. **推送的文件路径不匹配触发条件**
- 确保推送了 `apps/web-antd/dist/**` 目录
- 检查 `.gitignore` 是否忽略了 dist
4. **Git 提交信息包含 `[skip ci]`**
- 如果提交信息包含 `[skip ci]`CI/CD 会被跳过
- **重要**:构建脚本已更新,不再使用 `[skip ci]` 标记
- 如果之前使用了 `[skip ci]`,需要重新提交:
```bash
git commit --amend -m "chore: build and deploy web-antd"
git push origin master --force
```
5. **Gitea Actions 未启用**
- 检查 Gitea 仓库设置中 Actions 是否启用
### 问题:修改源码后如何部署
**解决方案**
1. 本地构建:`pnpm build:antd`
2. 检查构建结果:`ls -la apps/web-antd/dist`
3. 推送构建产物:
```bash
git add apps/web-antd/dist
git commit -m "chore: build and deploy web-antd"
git push origin master
```
4. 或者使用自动化脚本:`./scripts/deploy/build-and-push.sh`
### 问题:构建成功但服务没有运行
**可能原因和解决方案**
1. **容器启动失败**
```bash
# 在服务器上检查容器状态
docker ps -a | grep aiot-web-antd
# 查看容器日志
docker logs aiot-web-antd
# 如果容器不存在,检查 CI/CD 日志
```
2. **端口被占用**
```bash
# 检查端口 9090 是否被占用
netstat -tuln | grep 9090
# 或
lsof -i :9090
# 检查是否有其他容器占用端口
docker ps --filter "publish=9090"
```
3. **Nginx 配置错误**
```bash
# 进入容器检查 nginx 配置
docker exec -it aiot-web-antd sh
nginx -t # 测试配置
cat /etc/nginx/conf.d/default.conf # 查看配置
```
4. **构建产物问题**
```bash
# 检查容器内的文件
docker exec -it aiot-web-antd ls -la /usr/share/nginx/html
# 检查 index.html 是否存在
docker exec -it aiot-web-antd cat /usr/share/nginx/html/index.html
```
5. **网络问题**
```bash
# 检查容器网络
docker network inspect 1panel-network
# 检查容器是否在正确的网络中
docker inspect aiot-web-antd | grep NetworkMode
```
6. **手动启动容器测试**
```bash
# 停止现有容器
docker stop aiot-web-antd || true
docker rm aiot-web-antd || true
# 手动启动容器(前台运行,查看输出)
docker run --rm \
--name aiot-web-antd-test \
--network 1panel-network \
-p 9090:80 \
aiot-web-antd:latest
```
7. **检查 CI/CD 日志**
- 查看 Gitea Actions 的完整日志
- 检查是否有错误信息
- 确认容器是否成功启动
**快速诊断命令**(在服务器上执行):
```bash
# 一键诊断脚本
echo "=== Container Status ==="
docker ps -a | grep aiot-web-antd
echo "=== Container Logs (last 50 lines) ==="
docker logs aiot-web-antd --tail 50
echo "=== Port Status ==="
netstat -tuln | grep 9090
echo "=== Container Files ==="
docker exec aiot-web-antd ls -la /usr/share/nginx/html | head -10
```