如何在 OpsWorks 部署到 Rails 堆栈期间始终运行迁移
Posted
技术标签:
【中文标题】如何在 OpsWorks 部署到 Rails 堆栈期间始终运行迁移【英文标题】:How to always run migration during OpsWorks deployments to Rails stacks 【发布时间】:2015-11-13 08:22:17 【问题描述】:我在 AWS OpsWorks 上设置了一些 Rails 堆栈,我主要使用 OpsWorks 控制台 Web 应用程序将我的代码从 GitHub 部署到堆栈。
在 OpsWorks 的“部署应用程序”页面上,有一个默认为关闭的“迁移数据库”开关。 Rails 中的数据库迁移是幂等的,因此运行迁移永远不会有坏处,但如果您在需要运行迁移时忘记运行迁移,肯定会受到伤害。
有什么方法可以让该开关默认为“是”以始终运行迁移?我不想使用自定义配方来执行此操作,因为我希望迁移在部署期间仅在一个实例上运行。我是否缺少一些配置选项,以便在我通过 OpsWorks 控制台将代码部署到堆栈时自动运行数据库迁移?
【问题讨论】:
【参考方案1】:您可以通过在自定义堆栈 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 中将 deploy -> app_name -> migrate 设置为 true。 App_name 可能是层的名称,但您应该尝试看看是否是这种情况。
【讨论】:
这将打开或关闭整个层的迁移,而 OP 需要实例级控制。【参考方案2】:虽然 Mircea 的答案有效,但它并不适合我的用例,因为它在部署期间在堆栈中的所有实例上运行迁移。如果您的堆栈中定义了很多实例,这将破坏您的数据库。
我最终做的是使用一个仅覆盖 migrate 属性的自定义说明书,将其设置为 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”硬编码为运行迁移的节点,然后检查当前节点是否是那个节点。如果是这样,它将对该节点的迁移进行排队。如果不是,它确保迁移不会在该节点上运行。
【讨论】:
以上是关于如何在 OpsWorks 部署到 Rails 堆栈期间始终运行迁移的主要内容,如果未能解决你的问题,请参考以下文章
使用 unicorn 将 Rails 应用程序部署到 Opsworks 时出错
如何在 AWS OpsWorks 上调试 Ruby On Rails?