首页 > 解决方案 > Google App Engine:Ruby on Rails - 自动执行迁移

问题描述

我想知道是否可以在使用 Google App Engine 部署期间自动运行迁移。我使用 AWS Elasticbeanstalk 已经有一段时间了,它们是自动运行的,但现在我正在考虑为我未来的项目迁移到 Google App Engine。

现在,我必须手动运行这个命令:

bundle exec rake appengine:exec -- bundle exec rake db:migrate GAE_CONFIG=app.yml

谢谢

标签: ruby-on-railsgoogle-app-enginemigration

解决方案


警告:正如评论中所讨论的,如果在多个容器上并行进行部署,则迁移中存在竞争条件,因为它将尝试在所有容器上运行迁移。评论中正在讨论解决方案,当我们找到某些东西时,我会更新这个答案。

免责声明:这个答案并不完全是所要求的,但它解决了同样的问题并且有效。从我从问题中可以看出,使用一些 appengine 配置来做这件事不是必需的,而他只是希望迁移自动运行。

我将扩展我对问题的评论,这是我尝试过的并且有效的方法。我是KISS 的坚定信徒(保持简单和愚蠢)。因此,如果我是你,我不会试图找出 appengine(我从来没有使用过),而是采用通用方法。也就是说,插入 Rails 服务器启动过程并触发迁移。为此,我们有多种方法。

根据我对 appengine 的理解,并由这个官方文档链接建议 appengine 有一个app.yaml文件,这个文件有一个类似的条目

entrypoint: rails server

因此,我们将使用这个入口点插入我们的代码以在启动服务器之前运行迁移。为此,我这样做了:

  1. 在目录中创建一个新文件bin,我将其命名为 rails_with_migrations.sh您可以随意命名。
  2. 给它执行权限chmod +x bin/rails_with_migrations.sh
  3. 把这段代码放在里面:
#!/bin/bash
bundle exec rake db:migrate
bundle exec rails $@

当然,您可以提供任何您想提供的 RAILS_ENV。

  1. 现在在app.yamlentrypoint部分,而不是rails server给它bin/rails_with_migrations.sh server,它应该是它。它适用于本地,应该适用于任何地方。

注意:entrypoint:bin/rails_with_migrations.sh server这里,服务器是 rails 命令参数,您可以传递任意数量的参数,所有这些都将通过's magic传递给rails server命令。$@它允许您传递端口和您可能需要为您的环境提供的任何其他参数。它还允许您在rails console本地运行,bin/rails_with_migrations.sh console这也会导致迁移被触发。

UPDATE1:根据评论,我检查了如果迁移失败会发生什么,即使迁移失败它也会启动服务器。sh我们当然可以在我们的文件中改变这种行为。

UPDATE2:带有迁移错误代码处理的 shell 脚本将类似于:

#!/bin/bash
bundle exec rake db:migrate
if [ $? -eq 0 ]
then
  bundle exec rails $@
else
  echo "Failure: migrations failed, please check application logs for more details." >&2
  exit 1
fi

此更新将阻止服务器启动并导致脚本出现非零退出代码,这应表明此命令失败。


推荐阅读