今天早上,我tweeted对我与Planetscale和Matt asked me Heroku一起运行的部署管道的兴奋,以写一些细节,以写一些漫长的形式,所以这里!
Planetscale在托管数据库方面生活在未来。他们抽象所有复杂性和强迫对模式更改的部署请求的方式很聪明。再加上:他们慷慨的自由层使其成为进入新项目的绝妙选择。
作为Rails Dev,我已经习惯了严格的数据库迁移系统,并让Heroku直接在主要生产数据库上进行部署进行这些迁移。对于Planetscale,这是不可能的。一旦您将分支标记为生产分支,他们将拒绝任何直接的模式更改。这是他们能够进行缩放和高可用性魔术所需要的。
相反,您必须从主数据库中“分支”,连接到新创建的模式,运行迁移(S),然后在主分支中创建合并请求。
有很多方法可以解决这个问题,例如,在铁轨中,他们最近发布了一个planetscale_rails Gem,它提供了一些有用的任务以使过程平滑。但是,这确实添加了来自Rails设置的一些开销,整个过程只是在本地运行迁移,将代码推向GitHub并让Heroku构建App + Run迁移。
所以在过去的几个月中,我一直在使用我习惯的便利设置进行滚动:Heroku长期运行的登台分支,其迁移并确保在Planetscale上合并任何模式更改将我的铁轨推广到生产。
如果您有兴趣,这就是我设置的方式:
准备您的行星尺度数据库
通过Planetscale网站注册并创建数据库。确保选择与您的Heroku区域相匹配的区域。
单击connect
,将您的凭据安全地存储在某个地方(因为它们不会再次显示)。然后,前往分支机构,选择您的main
分支并将其推广到生产分支:
回到您的分支机构,创建一个新的分支,名称为您的喜好,staging
可能是有道理的。单击connect
并再次获得您的凭据。
现在还有一件重要的事情很重要:前往设置,并启用“自动复制迁移数据”。这是为了确保您的分支机构将其schema_migrations
表保持同步,这确保您的主分支永远不会与您的生产代码保持不同步。
现在是Planetscale的IT!
准备您的Heroku管道
我的管道非常简单:
- 一个登台应用程序,该应用程序通过github Integration启用了
main
的自动数据 - 我手动向其宣传预制的舞台图像以发布新版本的生产应用程序
连接您的Rails应用程序
根据您选择的区域,数据库名称和您选择的秘密经理(我使用的是ENV Rails凭据)。
production: &production
<<: *default
database: quickbooker
host: eu-west.connect.psdb.cloud
username: "<%= Rails.application.credentials.dig(:planetscale, :username) %>"
password: "<%= Rails.application.credentials.dig(:planetscale, :password) %>"
ssl_mode: verify_identity
sslca: "/etc/ssl/certs/ca-certificates.crt"
staging:
<<: *production
那么,如果您还没有,请添加一个将您的数据库迁移到您的procfile的发布阶段:
release: bundle exec rake db:migrate
这几乎是您的铁路应用程序,您可以按照往常来进行,除了一件事: Planetscale不支持外国钥匙出于存储和缩放原因,但是由于Rails将会自动添加这些以供您创建的任何参考,因此您必须在这些迁移中添加foreign_key: false
。
准备部署!
所以到目前为止,您应该有:
- 行星尺度:受保护的“主”分支
- 行星尺度:架构写入“登台”分支
- 行星标准:“自动复制迁移数据”启用
- Heroku:一个登台应用程序,从git
main
分支构建和迁移 - Rails App:
database.yml
准备分别连接到分期和生产分支 - Rails App:在部署时运行数据库迁移的procfile。
如果正确设置了所有设置,则应该能够将迁移推向main
,让Heroku构建您的应用程序并在staging
Planetscale分支上运行迁移。
之后,导航到Planetscale中的分支,您应该看到弹出架构更改:
创建并合并您的模式部署请求,只需确保 合并后删除分支
这是关于它的!您的生产数据库是最新的,您的代码就可以推广。前往Heroku,将您的分期应用程序推广为生产。生产应用程序上的release
阶段仍将尝试运行迁移,但是由于Planetscale通过您之前打勾的复选框使schema_migrations
保持同步,因此对于生产应用程序来说,绝不应该迁移任何东西。如果有的话,这意味着您忘记合并数据库部署请求,而Planetscale的拒绝将使发布阶段失败,从而使您遵循此良好练习的理智检查!
这样就这样了!我的开发工作流程与我习惯的工作流程相同,只有在部署数据库架构突变时,才需要一个额外的手动步骤,但是这些有意识的数据库部署的额外安全性远远超出如果你问我,请前进!