Rails 3和Heroku:在推送时自动"rake db:migrate"?

Max*_*ams 61 git ruby-on-rails heroku

我对我的heroku推送/部署过程略有不满,否则发现和使用会很愉快.

如果我添加一个新的迁移到我的应用程序,我可以将它上传到heroku服务器的唯一方法是推送到heroku远程.这会上传并重新启动应用.不过,这并不运行迁移,所以我必须做的heroku rake db:migrate --app myapp,然后heroku restart --app myapp.与此同时,应用程序被破坏,因为它没有运行迁移,代码在迁移中引用了字段/表等.

必须有一种方法可以更改部署过程,以便在部署过程中rake db:migrate自动运行,但我无法解决问题.

这是我在heroku cpanel中设置的内容吗?它是从命令行传递给heroku的选项吗?它是一个git钩子吗?谁能让我直截了当?谢谢,最大

Max*_*olf 37

Heroku现在有能力将其作为"发布阶段"功能的一部分来处理.

您可以添加一个名为release您的进程,该进程Procfile将在每次部署期间运行.

Rails> = 5示例

release: bundle exec rails db:migrate

Rails <5示例

release: bundle exec rake db:migrate

  • docs:https://devcenter.heroku.com/articles/release-phase注意发布阶段是Beta版,并且在创建新版本时运行命令(即1.应用程序构建2.管道提升3.配置变量更改4.回滚5.通过Platform API发布) (2认同)

Cri*_*ian 32

这个简单的命令链解决方案怎么样:

git push heroku master && heroku run rake db:migrate
Run Code Online (Sandbox Code Playgroud)

一旦第一个成功完成,它将自动运行迁移.它的延迟是1-2秒或更短.


Pau*_*rth 29

这是一个rake任务,将所有内容包装成一个单行(并且还支持回滚):

https://gist.github.com/362873

您可能仍然风在你的老板的演示的顶部部署,但至少你不浪费之间的时间打字git pushrake db:migrate.

  • 我认为这个要点现在可能有点过时了 - 代码似乎是来自heroku早期的日子,在推送后需要更多的手动干预 (3认同)

Dan*_*Tao 14

我创建了一个自定义buildpack,让Heroku rake db:migrate在部署时自动运行.它只是Heroku默认的Ruby buildpack的一个分支,但是rake db:migrate添加了任务.

要在您的应用中使用它,您可以这样做:

heroku config:set BUILDPACK_URL=https://github.com/dtao/rake-db-migrate-buildpack
Run Code Online (Sandbox Code Playgroud)

另请注意,要使其工作,您需要启用user-env-compile Heroku Labs功能.这是你如何做到这一点:

heroku labs:enable user-env-compile
Run Code Online (Sandbox Code Playgroud)

这是我的证据,这是有效的:

rake db:在Heroku部署上迁移

  • 好点子.但是,这个repo无论如何都不再起作用,因为它所依赖的[`user-env-compile`](https://devcenter.heroku.com/articles/labs-user-env-compile)已被删除.:( (2认同)

Dav*_*ulc 9

也许您可以尝试从代码提交(模型,验证等)中分离您的架构提交(迁移等)提交.

(请注意,以下假设您的迁移更改不具有破坏性,因为您已指出涵盖了大多数用例.)

您的部署过程可能是:

  1. 将架构更改推送到Heroku
  2. 迁移
  3. 将应用程序代码推送到Heroku

这当然远非最佳,但是在您描述的情况下避免停机的有效方法是:当应用程序收到动态字段的代码时,数据库已经已经迁移.

(当然,最简单的解决方案就是在老板出去吃饭时简单地推送和迁移;-D)

否则,即使自动执行架构修改,您仍然会在迁移运行之前冒着请求通过的风险.


Kar*_*ari 5

对于像我这样的谷歌搜索者,我想在这里给出一个简单的解决方案.

我正在使用Rails 4并且需要在部署到heroku时添加一个简单的Rake任务.当我在github中使用'deploy to heroku'按钮时,没有机会在部署后立即运行"heroku run ...".

我做了什么:我扩展了标准的Rake Task'资产:clean',它在部署到heroku期间自动运行.任务仍然正常运行,但我已将自己的东西附加到它的最后.这是通过'增强'方法完成的.在下面的示例中,我添加了一个db:migrate,因为这可能是大多数人想要的:

# in lib/tasks/assets_clean_enhance.rake
Rake::Task['assets:clean'].enhance do
  Rake::Task['db:migrate'].invoke
end
Run Code Online (Sandbox Code Playgroud)

我承认这不是完美的解决方案.但是heroku Ruby Buildpack仍然不支持任何其他方式.编写我自己的构建对于这么简单的事情来说似乎有些过分.

  • 不要这样做,在Heroku上,您的数据库连接可能尚未在部署过程中的特定点准备就绪. (4认同)