Jam*_*t20 1 migration 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
Run Code Online (Sandbox Code Playgroud)
谢谢
警告:如注释中所述,如果并行在多个容器上进行部署,则迁移中存在竞争条件,因为它将尝试在所有容器上运行迁移。解决方案正在评论中讨论,当我们着陆时,我将更新此答案。
免责声明:该答案并非所要的,但它可以解决相同的问题,并且可以工作。从问题上我可以说出的是,使用某些appengine配置并不是必须的,而是他只是希望迁移能够自动运行。
我将对问题的评论进行扩展,这是我尝试过的方法,并且有效。我坚信KISS(保持简单和愚蠢)。因此,如果我是您,则无需尝试找出appengine(无论如何我从未使用过),我会采用通用方法。即,插入Rails服务器引导过程并触发迁移。为此,我们有多种方法。
根据我对appengine的了解,并通过此官方doc链接 建议,appengine有一个app.yaml文件,该文件中的条目类似于:
entrypoint: rails server
Run Code Online (Sandbox Code Playgroud)
因此,在启动服务器之前,我们将使用此入口点插入代码以运行迁移。为此,我这样做:
bin目录中创建一个新文件,我将其命名为
rails_with_migrations.sh任意名称。chmod +x bin/rails_with_migrations.sh#!/bin/bash
bundle exec rake db:migrate
bundle exec rails $@
Run Code Online (Sandbox Code Playgroud)
当然,您可以提供想要提供的任何RAILS_ENV。
app.yaml本entrypoint节中,而不是rails server给出它bin/rails_with_migrations.sh server,应该给出它。它在本地工作,应该在任何地方工作。注意:在entrypoint:我bin/rails_with_migrations.sh server这里,服务器是rails命令参数,您可以传递尽可能多的参数,所有这些参数都将通过魔术传递给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
Run Code Online (Sandbox Code Playgroud)
此更新将阻止服务器启动脚本,并从脚本中引起非零退出代码,这应表明此命令失败。
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |