| # 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` - 批量测试多个版本的迁移。 | |