Ruby on rails Google应用程序引擎:Ruby on Rails-自动执行迁移
我想知道是否有可能在部署Google App Engine期间自动运行迁移。我已经使用AWS Elasticbeanstalk一段时间了,它们是自动运行的,但现在我正在考虑为我未来的项目转向谷歌应用程序引擎 现在,我必须手动运行此命令:Ruby on rails Google应用程序引擎:Ruby on Rails-自动执行迁移,ruby-on-rails,google-app-engine,migration,Ruby On Rails,Google App Engine,Migration,我想知道是否有可能在部署Google App Engine期间自动运行迁移。我已经使用AWS Elasticbeanstalk一段时间了,它们是自动运行的,但现在我正在考虑为我未来的项目转向谷歌应用程序引擎 现在,我必须手动运行此命令: bundle exec rake appengine:exec -- bundle exec rake db:migrate GAE_CONFIG=app.yml 谢谢警告:如评论中所述,如果在多个容器上并行部署,则迁移中存在竞争条件,因为它将尝试在所有容器上
bundle exec rake appengine:exec -- bundle exec rake db:migrate GAE_CONFIG=app.yml
谢谢警告:如评论中所述,如果在多个容器上并行部署,则迁移中存在竞争条件,因为它将尝试在所有容器上运行迁移。解决方案正在评论中讨论,我会在我们达成共识后更新这个答案 免责声明:这个答案并不完全符合要求,但它解决了同样的问题,而且有效。从问题中我可以看出,使用一些appengine配置并不是一项要求,他只是希望迁移能够自动运行 我将进一步阐述我对这个问题的看法,这里有一些我尝试过的东西,它是有效的。我非常相信接吻(保持简单和愚蠢)。因此,如果我是你的话,我不会试图找出appengine(我从来没有用过它),我会采取一种通用的方法。也就是说,插入rails服务器引导过程并触发迁移。为此,我们有多种方法 根据我对appengine的理解和的建议,appengine有一个
app.yaml
文件,该文件有一个类似以下内容的条目:
entrypoint: rails server
所以,我们将使用此入口点插入代码,以便在启动服务器之前运行迁移。为此,我这样做:
bin
目录中创建一个新文件,我将其命名为
rails\u with\u migrations.sh
您可以随意命名它
的入口点
部分,而不是rails服务器
给它bin/rails\u with_migrations.sh服务器
,它应该就是它。它在本地有效,应该在任何地方都有效入口点:
我有bin/rails\u with_migrations.sh server
这里,server是rails命令参数,您可以传递任意多的参数,所有这些参数都将通过$@
的魔力传递给rails服务器
命令。它允许您传递端口和您可能需要为您的环境提供的任何其他参数。它还允许您使用bin/rails\u with_migrations.sh console在本地运行rails控制台
,这也会触发迁移
更新1:根据评论,我检查了迁移失败时会发生什么,即使迁移失败,服务器也会启动。当然,我们可以在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
此更新将阻止服务器启动并导致脚本出现非零退出代码,这应表明此命令失败。从未尝试使用App Engine,您在哪里运行yr exec?appengine:exec由appengine gem提供,appengine gem基本上在Google App Engine实例中运行该命令。我在本地运行命令我不是appengine的用户,但快速查找建议您必须有一个app.yaml文件,您也可以共享它。我们如何解决这个问题,而不是在appengine中定义任务,我们可以做的是让迁移在某些环境中自动运行(或者,如果您愿意的话)。你们可以从以下几个方面考虑:(它很旧,显然需要一些更新)。让我知道这是否有效,如果有效,我将添加此作为答案,您可以接受。:)如果需要的话,我很乐意提供进一步的帮助。谢谢你的回复。我必须承认这是个好建议。然而,我害怕一件事:如果迁移失败,部署是否真的会“失败”,应该吗?如果是这样的话,我们也可以插上一些东西@Jamesst20@Jamesst20$?
变量为我们提供上一次命令运行的状态,如果它为0,则表示它正常。否则,它一定是失败了,出现了一些错误。现在,我可以修改脚本,使其不启动服务器并使用脚本中的非0退出代码退出,但关于日志记录,我不确定appengine在何处记录入口点故障。它应该在deploy命令输出中,或者您应该能够流式传输实例的日志。我可以修改脚本,但你应该自己解决日志问题。不过我也会四处询问。@Jamesst20我想我们现在可以做的是先发布,然后运行迁移。将这两个步骤放在shell脚本中,并将其提交到git repo中。类似于,deploy.sh
这里唯一的问题是,如果迁移失败,它将报告,但系统仍将运行。您可以改为编写命令1-关闭系统。2-部署新代码,3-运行迁移,4-仅在迁移成功时启动系统。我还将在我的回答中补充一点,这就是问题所在。听起来是对的。我唯一能想到的就是1。部署新代码,2。启用维护模式,3。运行迁移,4。如果运行良好,则禁用维护模式。首先部署新代码是可以的,因为如果失败,流量将不会重定向到新实例。但是,切换维护模式可能不是那么容易。我将检查是否可以从bitbucket管道运行一个切换它的rake任务。
#!/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