如何在 OpsWorks 部署期间始终 运行 迁移到 Rails 堆栈
How to always run migration during OpsWorks deployments to Rails stacks
我在 AWS OpsWorks 上设置了几个 Rails 堆栈,我主要使用 OpsWorks 控制台 Web 应用程序将我的代码部署到 GitHub 的堆栈。
在 OpsWorks 的 'Deploy app' 页面上,有一个 'Migrate database' 开关默认关闭。 Rails 中的数据库迁移是幂等的,因此它不会对 运行 迁移造成伤害,但如果您在需要 运行 时忘记 运行 迁移,那肯定会造成伤害].
有什么方法可以让该开关默认为 'Yes' 以始终 运行 迁移?我不想使用自定义配方来执行此操作,因为我希望在部署期间仅在一个实例上迁移到 运行。是否缺少某些配置选项,以便在我通过 OpsWorks 控制台将代码部署到堆栈时数据库自动迁移 运行?
您可以通过在自定义堆栈中配置来尝试此操作 json:
http://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-json-override.html
似乎您必须在自定义 json 中将部署 -> app_name -> 迁移设置为 true。 App_name 可能是层的名称,但您应该尝试看看是否是这种情况。
虽然 Mircea 的答案有效,但它对我的用例来说并不理想,因为它 运行 在部署期间对堆栈中的所有实例进行了迁移。如果您的堆栈中定义了很多实例,这将破坏您的数据库。
我最后做的是使用一个自定义食谱,它只覆盖迁移属性,将它设置为 true
一个节点。 this forum post给了我灵感。
我已经为我的堆栈启用了自定义说明书,要使此方法起作用,您需要执行相同的操作。然后我在我的自定义食谱存储库中定义了一本 deploy
食谱,它只有一个文件: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
该代码只是将 'rails-app1' 硬编码为 运行 迁移的节点,然后检查当前节点是否就是那个节点。如果是这样,它将对该节点的迁移进行排队。如果不是,它确保迁移不会在该节点上 运行。
我在 AWS OpsWorks 上设置了几个 Rails 堆栈,我主要使用 OpsWorks 控制台 Web 应用程序将我的代码部署到 GitHub 的堆栈。
在 OpsWorks 的 'Deploy app' 页面上,有一个 'Migrate database' 开关默认关闭。 Rails 中的数据库迁移是幂等的,因此它不会对 运行 迁移造成伤害,但如果您在需要 运行 时忘记 运行 迁移,那肯定会造成伤害].
有什么方法可以让该开关默认为 'Yes' 以始终 运行 迁移?我不想使用自定义配方来执行此操作,因为我希望在部署期间仅在一个实例上迁移到 运行。是否缺少某些配置选项,以便在我通过 OpsWorks 控制台将代码部署到堆栈时数据库自动迁移 运行?
您可以通过在自定义堆栈中配置来尝试此操作 json:
http://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-json-override.html
似乎您必须在自定义 json 中将部署 -> app_name -> 迁移设置为 true。 App_name 可能是层的名称,但您应该尝试看看是否是这种情况。
虽然 Mircea 的答案有效,但它对我的用例来说并不理想,因为它 运行 在部署期间对堆栈中的所有实例进行了迁移。如果您的堆栈中定义了很多实例,这将破坏您的数据库。
我最后做的是使用一个自定义食谱,它只覆盖迁移属性,将它设置为 true
一个节点。 this forum post给了我灵感。
我已经为我的堆栈启用了自定义说明书,要使此方法起作用,您需要执行相同的操作。然后我在我的自定义食谱存储库中定义了一本 deploy
食谱,它只有一个文件: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
该代码只是将 'rails-app1' 硬编码为 运行 迁移的节点,然后检查当前节点是否就是那个节点。如果是这样,它将对该节点的迁移进行排队。如果不是,它确保迁移不会在该节点上 运行。