ruby-on-rails - 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
谢谢
解决方案
警告:正如评论中所讨论的,如果在多个容器上并行进行部署,则迁移中存在竞争条件,因为它将尝试在所有容器上运行迁移。评论中正在讨论解决方案,当我们找到某些东西时,我会更新这个答案。
免责声明:这个答案并不完全是所要求的,但它解决了同样的问题并且有效。从我从问题中可以看出,使用一些 appengine 配置来做这件事不是必需的,而他只是希望迁移自动运行。
我将扩展我对问题的评论,这是我尝试过的并且有效的方法。我是KISS 的坚定信徒(保持简单和愚蠢)。因此,如果我是你,我不会试图找出 appengine(我从来没有使用过),而是采用通用方法。也就是说,插入 Rails 服务器启动过程并触发迁移。为此,我们有多种方法。
根据我对 appengine 的理解,并由这个官方文档链接建议 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 命令参数,您可以传递任意数量的参数,所有这些都将通过'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
此更新将阻止服务器启动并导致脚本出现非零退出代码,这应表明此命令失败。
推荐阅读
- python - Error calling Flask endpoint in AWS EC2 from AWS Lambda
- imagemagick - 将文本转换为图像,当超出定义的尺寸时将文本分解为多列
- java - 当我尝试访问 Excel 文件时,我的 JAVA Swing 代码有什么问题?
- r - ggplot2:如何为 geom_ribbon() 中的不同填充分配不同的 alpha 值?
- debugging - 如何在 Windows 下支持 grpc 的 Debug 和 Release 构建
- python - PySpark 从目录中读取多个 txt 文件为 json 格式
- haskell - 在自然数上使用递归测试 Haskell 中的数论函数
- css - 这是在 w3school 中看到的溢出示例: hidden 用于在列表浮动时显示 ul 标记的背景颜色
- node.js - 如何在 jasmine.json 中的测试套件之前运行数据库文件
- android - 交错的 LayoutManager 仅在一列中显示图像