带有行星和Heroku的Rails部署管道
#mysql #planetscale #rails #heroku

今天早上,我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分支并将其推广到生产分支:

Select "Promote to production"

回到您的分支机构,创建一个新的分支,名称为您的喜好,staging可能是有道理的。单击connect并再次获得您的凭据。

现在还有一件重要的事情很重要:前往设置,并启用“自动复制迁移数据”。这是为了确保您的分支机构将其schema_migrations表保持同步,这确保您的主分支永远不会与您的生产代码保持不同步。

Select Rails and Save database settings

现在是Planetscale的IT!

准备您的Heroku管道

我的管道非常简单:

  1. 一个登台应用程序,该应用程序通过github Integration启用了main的自动数据
  2. 我手动向其宣传预制的舞台图像以发布新版本的生产应用程序

Heroku pipeline

连接您的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中的分支,您应该看到弹出架构更改:

Creates a typical Clearance User model

创建并合并您的模式部署请求,只需确保 合并后删除分支

Image description

这是关于它的!您的生产数据库是最新的,您的代码就可以推广。前往Heroku,将您的分期应用程序推广为生产。生产应用程序上的release阶段仍将尝试运行迁移,但是由于Planetscale通过您之前打勾的复选框使schema_migrations保持同步,因此对于生产应用程序来说,绝不应该迁移任何东西。如果有的话,这意味着您忘记合并数据库部署请求,而Planetscale的拒绝将使发布阶段失败,从而使您遵循此良好练习的理智检查!

这样就这样了!我的开发工作流程与我习惯的工作流程相同,只有在部署数据库架构突变时,才需要一个额外的手动步骤,但是这些有意识的数据库部署的额外安全性远远超出如果你问我,请前进!