File size: 6,517 Bytes
9853396 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | # AxonHub 迁移测试脚本
自动化测试数据库版本升级迁移的脚本。
## 概述
`migration-test.sh` 脚本用于验证 AxonHub 的数据库迁移功能。它会自动下载指定发布标签的二进制文件,初始化数据库,然后使用当前分支的代码执行迁移,并可选地运行 E2E 测试来验证数据的完整性。
## 快速开始
```bash
# SQLite(默认,无需 Docker)
./scripts/migration/migration-test.sh v0.1.0
# MySQL(需要 Docker)
./scripts/migration/migration-test.sh v0.1.0 --db-type mysql
# PostgreSQL(需要 Docker)
./scripts/migration/migration-test.sh v0.1.0 --db-type postgres
# 测试所有数据库
./scripts/migration/test-migration-all-dbs.sh v0.1.0
```
## 前置条件
- **Go 环境**: 脚本需要编译当前分支代码,确保已安装 Go。
- **SQLite (默认)**: 无需额外依赖。
- **MySQL**: 需要安装并运行 Docker,端口 13306 未被占用。
- **PostgreSQL**: 需要安装并运行 Docker,端口 15432 未被占用。
- **工具**: 需要 `unzip` 用于解压下载的二进制文件。
## 功能特性
1. **自动下载和缓存二进制文件** - 从 GitHub Releases 下载指定 tag 的可执行文件,并缓存到本地。
2. **测试版本升级** - 支持从任意 tag 版本迁移到当前分支最新代码。
3. **多数据库支持** - 支持 SQLite、MySQL、PostgreSQL 数据库的迁移测试。
4. **生成迁移计划** - 自动生成包含初始化和迁移步骤的 JSON 计划。
5. **E2E 测试验证** - 迁移完成后自动运行 E2E 测试验证数据完整性。
6. **配置一致性** - 使用与 `e2e-test.sh` 相同的配置,确保测试环境一致。
## 命令行参数
| 参数 | 说明 |
|------|------|
| `from-tag` | **(必需)** 要测试迁移的起始 Git tag(例如:v0.1.0) |
| `--db-type TYPE` | 数据库类型: `sqlite`, `mysql`, `postgres` (默认: `sqlite`) |
| `--skip-download` | 如果缓存中已存在二进制文件,跳过下载直接使用 |
| `--skip-e2e` | 迁移后跳过运行 E2E 测试 |
| `--keep-artifacts` | 测试完成后保留工作目录(日志、数据库文件等) |
| `--keep-db` | 测试完成后保留数据库容器(仅限 MySQL/PostgreSQL) |
| `-h, --help` | 显示帮助信息 |
## 常用示例
- **保留数据库容器以供手动检查**:
```bash
./scripts/migration-test.sh v0.1.0 --db-type mysql --keep-db
```
- **跳过 E2E 测试仅验证迁移过程**:
```bash
./scripts/migration-test.sh v0.1.0 --skip-e2e
```
- **使用缓存的二进制文件并保留测试产物**:
```bash
./scripts/migration-test.sh v0.1.0 --skip-download --keep-artifacts
```
## 数据库配置与连接
### MySQL
- **容器名称**: `axonhub-migration-mysql`
- **端口**: 13306
- **数据库/用户/密码**: `axonhub_test` / `axonhub` / `axonhub_test`
- **连接命令**: `docker exec -it axonhub-migration-mysql mysql -u axonhub -paxonhub_test axonhub_test`
### PostgreSQL
- **容器名称**: `axonhub-migration-postgres`
- **端口**: 15432
- **数据库/用户/密码**: `axonhub_test` / `axonhub` / `axonhub_test`
- **连接命令**: `docker exec -it axonhub-migration-postgres psql -U axonhub -d axonhub_test`
### SQLite
- **数据库文件**: `scripts/migration/migration-test/work/migration-test.db`
- **查看命令**: `sqlite3 scripts/migration/migration-test/work/migration-test.db`
## 批量测试
`migration-test-all.sh` 脚本可以测试多个版本在所有支持的数据库上的迁移:
```bash
# 测试最近 3 个版本在所有数据库上的迁移
./scripts/migration/migration-test-all.sh
# 测试指定版本在 SQLite 上的迁移
./scripts/migration/migration-test-all.sh --tags v0.1.0,v0.2.0 --db-type sqlite
```
## 工作流程
1. **检测系统架构** - 自动检测操作系统和 CPU 架构(linux/darwin, amd64/arm64)。
2. **设置数据库环境** - 根据指定类型设置 SQLite 文件或 Docker 容器。
3. **下载/缓存旧版本二进制** - 从 GitHub 下载指定版本的可执行文件。
4. **构建当前版本** - 编译当前分支的最新代码。
5. **生成迁移计划** - 创建包含版本信息的 `migration-plan.json`。
6. **初始化数据库** - 使用旧版本二进制初始化数据库结构。
7. **执行迁移** - 使用当前分支版本运行数据库迁移。
8. **运行 E2E 测试** - 验证迁移后的数据库功能是否正常(可选)。
9. **清理** - 清理临时文件和容器(可选保留)。
## 目录结构
```
scripts/
├── migration-test.sh # 主脚本
├── migration-test/ # 测试工作根目录
│ ├── cache/ # 二进制文件缓存
│ │ └── v0.1.0/
│ │ └── axonhub # 缓存的 v0.1.0 二进制
│ └── work/ # 工作目录(测试后默认清理)
│ ├── axonhub-current # 当前分支编译的二进制
│ ├── migration-test.db # 测试数据库(SQLite)
│ ├── migration-test.log # 测试详细日志
│ └── migration-plan.json # 迁移步骤计划
```
## 故障排查
- **Docker 未运行**: 请确保 Docker Desktop 或守护进程已启动。
- **端口占用**: 确保 8099 (Server), 13306 (MySQL), 15432 (Postgres) 端口未被占用。
- **下载失败/限流**: 设置 `GITHUB_TOKEN` 环境变量以避免 GitHub API 速率限制。
- **查看详细日志**: 实时查看日志:`tail -f scripts/migration-test/work/migration-test.log`。
## CI/CD 集成
### GitHub Actions 示例
```yaml
jobs:
migration-test:
runs-on: ubuntu-latest
strategy:
matrix:
db-type: [sqlite, mysql, postgres]
from-version: [v0.1.0, v0.2.0]
steps:
- uses: actions/checkout@v3
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: '1.21'
- name: Run migration test
run: |
./scripts/migration-test.sh ${{ matrix.from-version }} \
--db-type ${{ matrix.db-type }}
```
## 与其他脚本的关系
- `e2e-test.sh` - 运行完整的 E2E 测试套件。
- `e2e-backend.sh` - 管理 E2E 测试后端服务器。
- `migration-test.sh` - 测试单个版本的数据库迁移。
- `migration-test-all.sh` - 批量测试多个版本的迁移。
|