背景:项目组每周一个版本需要发布,在发布之前需要把当周的版本部署到测试服务器上给测试同学进行回归,每周出的包(客户端包 + 服务器包)都需要手动进行部署,整个过程耗时在 20+min,希望可以做一个通过上传包体,来达到自动部署的效果,有前辈给指点下思路吗
CICD 自动构建不就好了吗?为什么还要手动部署?
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 前端界面 │ │ 后端API服务 │ │ 部署执行器 │
│ (Vue/React) │◄──►│ (Node.js) │◄──►│ (Shell/CI) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
└───────────────────────┼───────────────────────┘
▼
┌─────────────────┐
│ 数据库存储 │
│ (MongoDB/MySQL)│
└─────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 🚀 自动部署控制台 用户:张三 │
├─────────────────────────────────────────────────────────────────┤
│ 环境:[测试环境 ▼] 版本:[v1.2.3 ▼] [🔄 刷新] [⚙️ 设置] │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 客户端部署 │ │ 服务器部署 │ │ 数据库迁移 │ │
│ │ ✅ 已完成 │ │ 🔄 进行中 │ │ ⏳ 等待中 │ │
│ │ 耗时: 2分30秒 │ │ 进度: 65% │ │ │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
│ │
│ 部署进度:████████████████████████░░░░░░░░ 75% │
│ │
│ 📝 实时日志: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ [14:32:01] 开始客户端包部署... │ │
│ │ [14:32:15] 上传客户端包到服务器... │ │
│ │ [14:34:31] ✅ 客户端部署完成 │ │
│ │ [14:34:32] 开始服务器包部署... │ │
│ │ [14:34:45] 正在停止旧服务... │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ [🚀 开始部署] [⏸️ 暂停] [⏹️ 停止] [🔙 回滚到上一版本] │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 📊 部署历史记录 │
├─────────────────────────────────────────────────────────────────┤
│ 时间范围:[最近7天 ▼] 状态:[全部 ▼] [🔍 搜索框] │
├──────┬─────────┬──────────┬────────┬─────────┬──────────────────┤
│ 状态 │ 版本 │ 部署时间 │ 耗时 │ 操作人 │ 操作 │
├──────┼─────────┼──────────┼────────┼─────────┼──────────────────┤
│ ✅ │ v1.2.3 │ 14:30 │ 8分钟 │ 张三 │ [查看日志][回滚] │
│ ❌ │ v1.2.2 │ 10:15 │ 失败 │ 李四 │ [查看日志][重试] │
│ ✅ │ v1.2.1 │ 昨天 │ 6分钟 │ 王五 │ [查看日志] │
└──────┴─────────┴──────────┴────────┴─────────┴──────────────────┘
// 推荐技术栈
- 框架:Vue 3 + TypeScript 或 React + TypeScript
- UI库:Element Plus / Ant Design
- 状态管理:Pinia / Redux Toolkit
- 实时通信:WebSocket / Socket.io
- 图表库:ECharts / Chart.js
- 构建工具:Vite / Webpack
// 推荐技术栈
- 运行时:Node.js + Express 或 Python + FastAPI
- 数据库:MongoDB / PostgreSQL
- 消息队列:Redis / RabbitMQ
- 任务调度:Bull Queue / Celery
- 容器化:Docker + Docker Compose
- CI/CD:Jenkins / GitLab CI / GitHub Actions
#!/bin/bash
# deploy.sh - 部署脚本示例
# 配置参数
VERSION=$1
ENVIRONMENT=$2
CLIENT_PACKAGE_URL=$3
SERVER_PACKAGE_URL=$4
# 1. 前置检查
echo "开始部署检查..."
check_environment
check_dependencies
# 2. 下载部署包
echo "下载客户端包..."
download_package $CLIENT_PACKAGE_URL "client"
echo "下载服务器包..."
download_package $SERVER_PACKAGE_URL "server"
# 3. 备份当前版本
echo "备份当前版本..."
backup_current_version
# 4. 部署客户端
echo "部署客户端..."
deploy_client
# 5. 部署服务器
echo "部署服务器..."
deploy_server
# 6. 健康检查
echo "执行健康检查..."
health_check
# 7. 清理临时文件
echo "清理临时文件..."
cleanup
echo "✅ 部署完成!"
// 部署相关接口
interface DeployAPI {
// 触发部署
POST /api/deploy {
version: string;
environment: string;
packages: {
client: string;
server: string;
};
}
// 获取部署状态
GET /api/deploy/status/:deployId
// 获取部署日志
GET /api/deploy/logs/:deployId
// 停止部署
POST /api/deploy/stop/:deployId
// 回滚版本
POST /api/deploy/rollback {
fromVersion: string;
toVersion: string;
}
// 获取部署历史
GET /api/deploy/history?page=1&limit=10&status=all
}
// WebSocket 实现实时更新
const socket = io('/deploy');
socket.on('deploy-progress', (data) => {
updateProgress(data.percentage);
updateCurrentStep(data.step);
appendLog(data.log);
});
socket.on('deploy-complete', (data) => {
showNotification('部署完成', data.result);
refreshDeployHistory();
});
// 部署状态管理
const DeployStates = {
PENDING: 'pending',
DOWNLOADING: 'downloading',
DEPLOYING_CLIENT: 'deploying_client',
DEPLOYING_SERVER: 'deploying_server',
HEALTH_CHECK: 'health_check',
SUCCESS: 'success',
FAILED: 'failed',
ROLLBACK: 'rollback'
};
class DeploymentStateMachine {
transition(currentState, action) {
// 状态转换逻辑
}
}
// 重试机制
async function deployWithRetry(config, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await executeDeploy(config);
} catch (error) {
if (i === maxRetries - 1) throw error;
await delay(Math.pow(2, i) * 1000); // 指数退避
}
}
}
这个方案提供了一个完整的自动部署可视化窗口设计思路,您可以根据实际情况调整技术栈和功能范围。建议先实现 MVP 版本验证可行性,再逐步完善功能。
线上上线是如何操作的?不会也是手动部署?应该都是 jenkins + salt 部署?线上部署那一套在测试服部署一下就 OK。客户端包可以直接部署一个 Nginx,让前端同学开发完之后直接放到 nginx 配置对应的目录,然后在通知群发提测通知带上对应的链接就可以了。
把打包流程转移到 Jenkins 上应该就可以了