Google App Engine:Ruby on Rails-自动执行迁移

时间:2019-06-13 14:09:05

标签: ruby-on-rails google-app-engine migration

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

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

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

谢谢

1 个答案:

答案 0 :(得分:5)

警告:如注释中所述,如果并行在多个容器上进行部署,则迁移中存在竞争条件,因为它将尝试在所有容器上运行迁移。解决方案正在评论中讨论,当我们着陆时,我将更新此答案。

免责声明:该答案并不完全是所要求的,但它可以解决相同的问题,并且可以正常工作。从我的疑问中可以看出,使用一些appengine配置不是必需的,而是他只是希望迁移能够自动运行。

我将对问题的评论进行扩展,这是我尝试过的方法,并且有效。我坚信 KISS(保持简单和愚蠢)。因此,如果我是您,则无需尝试找出appengine(无论如何我从未使用过),我会采用通用方法。即,插入Rails服务器引导过程并触发迁移。为此,我们有多种方法。

根据我对appengine的理解并由this official doc link建议, appengine有一个app.yaml文件,该文件中的条目类似于

entrypoint: rails server

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

  1. bin目录中创建一个新文件,我将其命名为 rails_with_migrations.sh ,您可以随意命名。
  2. 使用 chmod +x bin/rails_with_migrations.sh
  3. 授予其执行权限
  4. 将此代码放入其中:
#!/bin/bash
bundle exec rake db:migrate
bundle exec rails $@

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

  1. 现在位于 app.yaml 部分的 entrypoint 中,而不是rails server赋予它bin/rails_with_migrations.sh server,它应该就是这样它在本地工作,应该在任何地方工作。

注意::在entrypoint:中,我有bin/rails_with_migrations.sh server,服务器是rails命令参数,您可以传递尽可能多的参数,所有这些参数都将传递给{{ 1}}命令加上rails server的魔力。它可以让您传递端口以及可能需要为环境提供的任何其他参数。此外,它还允许您使用$@在本地运行rails console,这也将导致触发迁移。

UPDATE1:根据评论,我检查了迁移失败会发生什么,即使迁移失败也会启动服务器。我们可以在bin/rails_with_migrations.sh console文件中更改课程的行为。

UPDATE2:具有迁移错误代码处理的shell脚本如下所示:

sh

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