如何在 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 堆栈期间始终运行迁移的主要内容,如果未能解决你的问题,请参考以下文章

如何接收 OpsWorks 部署通知?

使用 unicorn 将 Rails 应用程序部署到 Opsworks 时出错

如何在 AWS OpsWorks 上调试 Ruby On Rails?

如何通过 cloudformation 部署 opsworks 应用程序?

如何防止 OpsWorks 部署默认部署到我的自定义层?

如何在 MacOS 中安装 chef 12 以部署到 AWS Opsworks?