解决方案

每个 PR 一个预览数据库

pull request 打开时给数据库开一个分支,关闭时删除它。每个预览都从真实数据开始,跑在自己的计算实例上,迁移和测试碰不到主分支。

怎么做

  1. 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\"}"
  2. 02

    让预览环境连到这个分支

    每个分支都有自己的主计算实例。列出项目的分支,等新计算实例的状态变成 READY,再把它的 host 用于预览环境的迁移、测试和应用。

    curl "https://relyt.one/api/v1/projects/$PROJECT_ID/branches" \
      -H "Authorization: Bearer $RELYT_API_KEY"
  3. 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 密钥存成密文变量。
  • 还有子分支的分支不能删除,主分支则完全不能删除;所以请从主分支创建预览分支,并在删除其父分支之前先删除它们。

其他解决方案

在免费版套餐上试一试。

用 GitHub 或 Google 登录,创建一个项目和一个 API 密钥,然后运行上面的调用。无需信用卡。