AxonHub 迁移测试脚本
自动化测试数据库版本升级迁移的脚本。
概述
migration-test.sh 脚本用于验证 AxonHub 的数据库迁移功能。它会自动下载指定发布标签的二进制文件,初始化数据库,然后使用当前分支的代码执行迁移,并可选地运行 E2E 测试来验证数据的完整性。
快速开始
# 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用于解压下载的二进制文件。
功能特性
- 自动下载和缓存二进制文件 - 从 GitHub Releases 下载指定 tag 的可执行文件,并缓存到本地。
- 测试版本升级 - 支持从任意 tag 版本迁移到当前分支最新代码。
- 多数据库支持 - 支持 SQLite、MySQL、PostgreSQL 数据库的迁移测试。
- 生成迁移计划 - 自动生成包含初始化和迁移步骤的 JSON 计划。
- E2E 测试验证 - 迁移完成后自动运行 E2E 测试验证数据完整性。
- 配置一致性 - 使用与
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 |
显示帮助信息 |
常用示例
- 保留数据库容器以供手动检查:
./scripts/migration-test.sh v0.1.0 --db-type mysql --keep-db - 跳过 E2E 测试仅验证迁移过程:
./scripts/migration-test.sh v0.1.0 --skip-e2e - 使用缓存的二进制文件并保留测试产物:
./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 脚本可以测试多个版本在所有支持的数据库上的迁移:
# 测试最近 3 个版本在所有数据库上的迁移
./scripts/migration/migration-test-all.sh
# 测试指定版本在 SQLite 上的迁移
./scripts/migration/migration-test-all.sh --tags v0.1.0,v0.2.0 --db-type sqlite
工作流程
- 检测系统架构 - 自动检测操作系统和 CPU 架构(linux/darwin, amd64/arm64)。
- 设置数据库环境 - 根据指定类型设置 SQLite 文件或 Docker 容器。
- 下载/缓存旧版本二进制 - 从 GitHub 下载指定版本的可执行文件。
- 构建当前版本 - 编译当前分支的最新代码。
- 生成迁移计划 - 创建包含版本信息的
migration-plan.json。 - 初始化数据库 - 使用旧版本二进制初始化数据库结构。
- 执行迁移 - 使用当前分支版本运行数据库迁移。
- 运行 E2E 测试 - 验证迁移后的数据库功能是否正常(可选)。
- 清理 - 清理临时文件和容器(可选保留)。
目录结构
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 示例
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- 批量测试多个版本的迁移。