解决方案
每个 PR 一个预览数据库
pull request 打开时给数据库开一个分支,关闭时删除它。每个预览都从真实数据开始,跑在自己的计算实例上,迁移和测试碰不到主分支。
怎么做
01
PR 打开时创建分支
CI 任务带上 API 密钥调用 Open API,从主分支创建一个分支。分支是父分支的写时复制分叉,无论数据库多大,几秒内就绪。
curl -X POST "https://relyt.one/api/v1/projects/$PROJECT_ID/branches" \ -H "Authorization: Bearer $RELYT_API_KEY" \ -H "Content-Type: application/json" \ -d "{\"name\":\"pr-$PR_NUMBER\",\"parentBranchSlug\":\"$MAIN_BRANCH_SLUG\"}"02
让预览环境连到这个分支
每个分支都有自己的主计算实例。列出项目的分支,等新计算实例的状态变成 READY,再把它的 host 用于预览环境的迁移、测试和应用。
curl "https://relyt.one/api/v1/projects/$PROJECT_ID/branches" \ -H "Authorization: Bearer $RELYT_API_KEY"03
PR 关闭时删除
再调用一次,就会删除这个分支和它的计算实例。主分支始终不变。
curl -X DELETE "https://relyt.one/api/v1/projects/$PROJECT_ID/branches/$BRANCH_SLUG" \ -H "Authorization: Bearer $RELYT_API_KEY"
现在就能用的能力
真实数据,而不是测试夹具
分支一开始就有父分支的完整数据。未改动的数据与父分支共享,只有预览里产生的改动才占用新的存储。
独立的计算实例
预览上的查询跑在该分支的计算实例上,不占用主分支的计算实例。空闲的计算实例可以挂起,下次连接时恢复,数据不受影响。
任何 CI 都能脚本化
用 REST Open API 和 API 密钥创建、列出、重命名、删除分支。同一项目里分支名唯一,所以同一个 PR 的任务跑了两次,第二次会得到 409,而不会多出一个分支。
须知
- Relyt One 不会往你的代码仓库里装任何东西:这些调用在你自己的 CI 工作流里运行(例如一个 GitHub Actions 任务),API 密钥存成密文变量。
- 还有子分支的分支不能删除,主分支则完全不能删除;所以请从主分支创建预览分支,并在删除其父分支之前先删除它们。