Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Google应用程序引擎:Ruby on Rails-自动执行迁移_Ruby On Rails_Google App Engine_Migration - Fatal编程技术网

Ruby on rails Google应用程序引擎:Ruby on Rails-自动执行迁移

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 谢谢警告:如评论中所述,如果在多个容器上并行部署,则迁移中存在竞争条件,因为它将尝试在所有容器上

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

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

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
    您可以随意命名它
  • 通过chmod+x bin/rails\u和迁移赋予它执行权限。sh
  • 将此代码放入其中:
  • 当然,你可以给任何你想给这些的RAILS_ENV

  • 现在在
    入口点
    部分,而不是
    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