预览环境
将 Git 应用的每个拉取请求部署到各自的临时地址,基于拉取请求的分支构建,并在拉取请求关闭或合并时删除。
预览的工作方式
当 Git 提供商报告拉取请求被打开、重新打开或收到新提交时,sh0 会克隆该拉取请求的分支,像构建应用一样构建它,启动一个独立容器并为其分配专用地址,生产环境不受影响。拉取请求关闭或合并时,sh0 会停止容器、移除路由并删除记录。
sh0 不会向拉取请求回写任何内容:没有评论,也没有状态检查。预览地址可在应用的 Previews 选项卡中查看,或使用 sh0 preview my-api list。
前提条件
- 一个从托管在 GitHub、GitLab 或 Bitbucket 的 Git 仓库部署的应用。对从归档或镜像部署的应用启用预览会被拒绝:没有拉取请求能到达它。
- 在提供商处配置好应用的 webhook(参见 Git 部署),并添加拉取请求事件:GitHub 上为“Pull requests”,GitLab 上为“Merge request events”,Bitbucket 上为拉取请求事件。
- 在应用上启用预览。sh0 也允许在非 Git 应用上启用预览,但那里永远不会创建任何预览。
启用预览
在控制面板中打开应用的 Previews 选项卡,点击 Enable Preview Environments,并设置 TTL (hours)(默认 168 小时,即七天)。在命令行中:
$ sh0 preview my-api enable --ttl 48
Preview environments enabled for app my-api.
TTL: 48 hours (2 days)
$ sh0 preview my-api list
No preview environments found.
$ sh0 preview my-api disable
Preview environments disabled for app my-api.禁用后不再创建新的预览。已有的预览会保留到过期或被删除,但关闭或合并其拉取请求仍会销毁它们。
预览地址
地址是由拉取请求编号和应用名用连字符连接而成的单个 DNS 标签:pr-<编号>-<app>,后接服务器的基础域名。基础域名为 example.com 的服务器上,应用 my-api 的第 12 号拉取请求得到 pr-12-my-api.example.com。
在使用 sh0.app 地址服务的服务器上,会再用一个连字符把服务器标识追加到同一个标签中,使地址仍受通配符证书覆盖。如果名称已被占用,sh0 会加上四个字符的后缀;过长的名称会被截短,以满足 DNS 标签 63 个字符的上限。预览在新的提交之间保持同一地址。
预览与生产环境共享什么
自 1.10.3 起:预览运行的是尚未经过审查的拉取请求代码,因此不会获得生产环境变量。它只获得你为预览声明的变量,即应用或项目上名为 PREVIEW_<名称> 的变量;容器看到的是去掉前缀后的名称。PREVIEW_DATABASE_URL 在预览中成为 DATABASE_URL,而生产环境的 DATABASE_URL 永远不会传给预览。
PREVIEW_ 变量仍会交给任何拉取请求的代码。请将其指向测试数据库和测试密钥,切勿指向生产环境,并且只在所有能开拉取请求的人都可信的仓库上启用预览。 自 1.10.3 起,预览环境还运行在独立的网络上:它既无法通过地址、也无法通过 name.internal 访问您的生产应用或数据库服务器。请为它提供一个可通过公网地址访问的数据库。预览不会运行部署钩子。
生命周期与清理
- 拉取请求关闭或合并:预览立即被销毁。
- 达到 TTL:sh0 每 5 分钟销毁一次已过期且正在运行的预览。生命周期从预览创建时开始计算,不会因新提交而延长;修改 TTL 只影响之后创建的预览。
- 失败的预览:不会被 TTL 清理;请在 Previews 选项卡中删除,或使用
sh0 preview my-api delete <id>。 - 每个应用最多 50 个预览;超过后,新的拉取请求不会获得预览,直到删除已有的预览。