我想知道在使用Google App Engine部署期间是否可以自动运行迁移。我已经使用AWS Elasticbeanstalk已有一段时间了,它们是自动运行的,但是现在我正在考虑为我的未来项目使用Google App Engine。
现在,我必须手动运行此命令:
bundle exec rake appengine:exec -- bundle exec rake db:migrate GAE_CONFIG=app.yml
谢谢
答案 0 :(得分:5)
警告:如注释中所述,如果并行在多个容器上进行部署,则迁移中存在竞争条件,因为它将尝试在所有容器上运行迁移。解决方案正在评论中讨论,当我们着陆时,我将更新此答案。
免责声明:该答案并不完全是所要求的,但它可以解决相同的问题,并且可以正常工作。从我的疑问中可以看出,使用一些appengine配置不是必需的,而是他只是希望迁移能够自动运行。
我将对问题的评论进行扩展,这是我尝试过的方法,并且有效。我坚信 KISS(保持简单和愚蠢)。因此,如果我是您,则无需尝试找出appengine(无论如何我从未使用过),我会采用通用方法。即,插入Rails服务器引导过程并触发迁移。为此,我们有多种方法。
根据我对appengine的理解并由this official doc link建议, appengine有一个app.yaml
文件,该文件中的条目类似于:
entrypoint: rails server
因此,在启动服务器之前,我们将使用此入口点插入代码以运行迁移。为此,我这样做了:
bin
目录中创建一个新文件,我将其命名为
rails_with_migrations.sh
,您可以随意命名。chmod +x bin/rails_with_migrations.sh
#!/bin/bash
bundle exec rake db:migrate
bundle exec rails $@
当然,您可以提供想要提供的任何RAILS_ENV。
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
此更新将阻止服务器启动并从脚本中导致非零退出代码,这应表明此命令失败。