如何在 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

您对部署属性感兴趣: http://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-json.html#workingcookbook-json-deploy

查看食谱: https://github.com/aws/opsworks-cookbooks/blob/c1426eee3f79085540312a98441cfc082a18613b/deploy/attributes/deploy.rb#L74

似乎您必须在自定义 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' 硬编码为 运行 迁移的节点,然后检查当前节点是否就是那个节点。如果是这样,它将对该节点的迁移进行排队。如果不是,它确保迁移不会在该节点上 运行。