Ruby on rails 如何在OpsWorks部署到Rails堆栈期间始终运行迁移

Ruby on rails 如何在OpsWorks部署到Rails堆栈期间始终运行迁移,ruby-on-rails,ruby-on-rails-4,amazon-web-services,aws-opsworks,Ruby On Rails,Ruby On Rails 4,Amazon Web Services,Aws Opsworks,我在AWS OpsWorks上设置了一些Rails堆栈,我主要使用OpsWorks控制台web应用程序从GitHub将代码部署到堆栈中 在OpsWorks上的“部署应用程序”页面上,有一个默认为关闭的“迁移数据库”开关。Rails中的数据库迁移是幂等的,因此运行迁移不会有什么坏处,但如果您忘记在需要运行迁移时运行迁移,则肯定会有坏处 是否有任何方法可以将默认值切换为“是”以始终运行迁移?我不想用自定义的方法来实现,因为我希望在部署期间迁移只在一个实例上运行。我是否缺少一些配置选项,以便在通过Op

我在AWS OpsWorks上设置了一些Rails堆栈,我主要使用OpsWorks控制台web应用程序从GitHub将代码部署到堆栈中

在OpsWorks上的“部署应用程序”页面上,有一个默认为关闭的“迁移数据库”开关。Rails中的数据库迁移是幂等的,因此运行迁移不会有什么坏处,但如果您忘记在需要运行迁移时运行迁移,则肯定会有坏处


是否有任何方法可以将默认值切换为“是”以始终运行迁移?我不想用自定义的方法来实现,因为我希望在部署期间迁移只在一个实例上运行。我是否缺少一些配置选项,以便在通过OpsWorks控制台将代码部署到堆栈时自动运行数据库迁移?

您可以通过在自定义堆栈json中配置来尝试:

您对部署属性感兴趣:

看看食谱:


似乎您必须在自定义json中将deploy->app_name->migrate设置为true。App_name可能是层的名称,但您应该进行实验,看看是否是这种情况。

虽然Mircea的答案有效,但它并不适合我的用例,因为它在部署期间在堆栈中的所有实例上运行迁移。如果在堆栈中定义了大量实例,那么这将破坏数据库

最后我做的是使用一个自定义的cookbook,它只覆盖migrate属性,为一个且仅一个节点将其设置为
true
。给了我灵感

我已经为我的堆栈启用了自定义烹饪书,要使此方法起作用,您也需要这样做。然后,我在自定义cookbooks存储库中定义了一个
deploy
cookbook,它只有一个文件:
deploy/attributes/customize.rb
包含:

migrate_node = 'rails-app1'

current_hostname = node[:opsworks][:instance][:hostname]
application = <your application short name>

if migrate_node == current_hostname
  normal[:deploy][application][:migrate] = true
else
  normal[:deploy][application][:migrate] = false
end
migrate_节点='rails-app1'
当前_hostname=节点[:opsworks][:实例][:主机名]
应用程序=
如果迁移\u节点==当前\u主机名
正常[:部署][应用程序][:迁移]=true
其他的
正常[:部署][应用程序][:迁移]=false
结束

该代码只是将“rails-app1”硬编码为运行迁移的节点,然后检查当前节点是否就是该节点。如果是这样,它将为该节点的迁移排队。否则,它将确保迁移不会在该节点上运行。

这将打开或关闭整个层的迁移,而OP需要实例级控制。