Files
xingrin/docs/version-management.md
yyhuni 0e9be54215 更新拉取策略为--pull=missing
增加文档
fix: bug统一字符处理
2025-12-17 10:40:37 +08:00

244 lines
5.7 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.
# XingRin - 星环 版本管理架构
## 概述
XingRin - 星环 采用基于 Git Tag 的自动化版本管理系统,确保所有组件(主服务器、远程 Worker使用一致的版本避免兼容性问题。
## 核心原理
### 版本号来源
- **单一版本源**Git Tag`v1.1.0`
- **版本文件**`VERSION` 文件由 CI 自动维护
- **环境变量**`IMAGE_TAG` 锁定运行时版本
### 版本一致性保证
```
Git Tag → CI 构建镜像 → VERSION 文件 → IMAGE_TAG → 所有节点统一版本
```
## 完整发布流程
```mermaid
graph TD
A[开发完成] --> B[git commit & push]
B --> C[git tag v1.1.0]
C --> D[git push --tags]
D --> E[GitHub Actions 触发]
E --> F[构建 5 个镜像]
F --> G[推送到 Docker Hub]
G --> H[更新 VERSION 文件]
H --> I[commit 回 main 分支]
style E fill:#e1f5fe
style F fill:#f3e5f5
style G fill:#e8f5e8
```
### 镜像构建矩阵
| 镜像 | 用途 | 标签 |
|------|------|------|
| `xingrin-server` | 主服务器 | `v1.1.0` + `latest` |
| `xingrin-frontend` | 前端界面 | `v1.1.0` + `latest` |
| `xingrin-nginx` | 反向代理 | `v1.1.0` + `latest` |
| `xingrin-worker` | 任务执行 | `v1.1.0` + `latest` |
| `xingrin-agent` | 心跳监控 | `v1.1.0` + `latest` |
## 用户部署流程
### 初始安装
```mermaid
graph TD
A[用户下载代码] --> B[sudo ./install.sh]
B --> C[读取 VERSION 文件]
C --> D[写入 docker/.env]
D --> E[IMAGE_TAG=v1.1.0]
E --> F[拉取对应版本镜像]
F --> G[启动服务]
style C fill:#fff3e0
style E fill:#e8f5e8
```
### 版本更新
```mermaid
graph TD
A[./update.sh] --> B[git pull 拉取新代码]
B --> C[读取新 VERSION 文件]
C --> D[更新 IMAGE_TAG=v1.2.0]
D --> E[重启服务]
E --> F[使用新版本镜像]
style C fill:#fff3e0
style D fill:#e8f5e8
```
## 任务分发架构
### 镜像版本管理
```mermaid
graph LR
A[主服务器] --> B[task_distributor]
B --> C[本地 Worker]
B --> D[远程 Worker 1]
B --> E[远程 Worker N]
F[settings.IMAGE_TAG] --> B
B --> G[yyhuni/xingrin-worker:v1.1.0]
G --> C
G --> D
G --> E
style F fill:#e1f5fe
style G fill:#f3e5f5
```
### 执行流程对比
| 场景 | 镜像拉取策略 | 说明 |
|------|-------------|------|
| **本地 Worker** | `--pull=missing` | 主服务器本机执行,使用本地镜像 |
| **远程 Worker** | `--pull=missing` | SSH 到远程执行,使用远程本地镜像 |
## 镜像拉取策略
### 安装时预拉取
```bash
# 主服务器安装
docker compose up -d # 拉取所有服务镜像
# 远程 Worker 安装
docker pull yyhuni/xingrin-worker:v1.1.0 # 预拉取 worker 镜像
```
### 执行时策略
```bash
# 任务执行时
docker run --pull=missing yyhuni/xingrin-worker:v1.1.0
```
**`--pull=missing` 行为**
- ✅ 本地有镜像 → 直接使用,不检查网络
- ✅ 本地无镜像 → 从 Docker Hub 拉取
- ✅ 版本更新后 → 自动拉取新版本
## 版本同步机制
### 主服务器更新
```mermaid
sequenceDiagram
participant U as 用户
participant S as 主服务器
participant H as Docker Hub
participant W as 远程 Worker
U->>S: ./update.sh
S->>S: git pull (新 VERSION)
S->>S: IMAGE_TAG=v1.2.0
S->>S: 重启服务
Note over S: 分发任务时
S->>W: SSH docker run worker:v1.2.0
W->>H: 本地无 v1.2.0,拉取镜像
H->>W: 返回 v1.2.0 镜像
W->>W: 执行任务
```
### 版本一致性保证
1. **主服务器**`IMAGE_TAG` 锁定版本
2. **远程 Worker**:按需拉取对应版本
3. **自动同步**update.sh 统一更新版本号
## 开发环境配置
### 本地开发测试
```bash
# docker/.env 中添加
TASK_EXECUTOR_IMAGE=docker-agent:latest # 指向本地构建镜像
```
### 开发模式启动
```bash
# 使用本地构建镜像
./install.sh --dev
./start.sh --dev
```
## 配置文件说明
### VERSION 文件
```
v1.1.0
```
- 由 CI 自动维护
- 用户安装时读取此文件
### docker/.env
```bash
IMAGE_TAG=v1.1.0 # 锁定版本
TASK_EXECUTOR_IMAGE= # 可选:覆盖镜像名
```
### settings.py 逻辑
```python
if IMAGE_TAG:
# 主服务器:构建镜像名
TASK_EXECUTOR_IMAGE = f'{DOCKER_USER}/xingrin-worker:{IMAGE_TAG}'
else:
# Worker 容器:不需要此配置
TASK_EXECUTOR_IMAGE = ''
```
## 故障排查
### 版本不一致问题
**症状**:任务执行失败,兼容性错误
**排查**
```bash
# 检查主服务器版本
cat VERSION
grep IMAGE_TAG docker/.env
# 检查远程 Worker 镜像
ssh worker_host "docker images | grep xingrin-worker"
```
**解决**
```bash
# 主服务器更新
./update.sh
# 远程 Worker 会自动拉取新版本(下次任务执行时)
```
### 镜像拉取失败
**症状**`docker run` 报错,无法拉取镜像
**排查**
```bash
# 检查网络连接
docker pull yyhuni/xingrin-worker:v1.1.0
# 检查版本是否存在
curl -s https://hub.docker.com/v2/repositories/yyhuni/xingrin-worker/tags/
```
## 最佳实践
### 版本发布
1. ✅ 严格遵循语义化版本v1.2.3
2. ✅ 有改动必须更新版本号
3. ✅ 通过 CI 自动构建,不手动推送
4. ✅ 测试版本使用 `-dev.x` 后缀
### 部署运维
1. ✅ 定期执行 `./update.sh` 获取更新
2. ✅ 监控 Docker Hub 镜像拉取状态
3. ✅ 备份重要配置文件(.env
4. ✅ 使用 `docker system prune` 清理旧镜像
### 开发调试
1. ✅ 本地测试使用 `--dev` 模式
2. ✅ 远程测试先推送测试版本到 Hub
3. ✅ 生产环境避免使用 `latest` 标签
4. ✅ 版本回滚通过修改 `IMAGE_TAG` 实现