【问题标题】:Find out if a migration is needed on Heroku了解 Heroku 是否需要迁移
【发布时间】:2019-10-24 22:07:44
【问题描述】:

我想在部署新版本后自动检测是否需要运行heroku run rake db:migration。如果我发现不需要迁移,则无需将活动站点置于维护模式。

一种方法是运行 system("run rake db:version") 以查找当前版本的 ruby​​ 脚本文件,然后检查 db/migrate 中文件的时间戳部分以查找最新版本并执行 db:migrate 如果当前版本是早于 db/migrate 目录中的最新时间戳。

但是这感觉很脆弱,有没有更健壮的方法?

【问题讨论】:

    标签: ruby-on-rails heroku


    【解决方案1】:

    基于this Q&A,看起来您应该能够执行以下操作:

    rails db:migrate:status
    

    【讨论】:

      【解决方案2】:

      更好的是,为什么不运行 rake db:migrate 作为部署管道的一部分?如果没有要应用的迁移,这不会伤害任何东西,如果有,它们会自动应用。作为奖励,如果迁移失败,整个部署将失败。

      为此,请将release phase task 添加到您的Procfile,例如

      release: rake db:migrate
      web: bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-development}
      

      像往常一样提交和部署。您应该会在部署输出中看到 rake db:migrate 正在自动运行。

      【讨论】:

      • 通常,如果我要迁移,我会将站点置于维护模式,以在迁移过程中停止交易。您的回答是否解决了这个问题,即如果有传入交易,您的方法会发生什么?另外,为什么要在生产环境中运行 RACK_ENV 开发?
      • @Obromios,这并不比您已经在维护模式下进行的操作更糟糕,而且它可以说更好,因为它是自动的。您当前的方法是更新您的代码,然后查看是否应该迁移,只有在您弄清楚之后才迁移。同时,如果需要应用任何迁移,您的代码和数据库将不同步,这将导致您的应用程序的某些部分失败。
      • 我同意在新版本推送后使用rails db:migrate:status 可能会导致问题,直到迁移完成。我喜欢发布阶段的方法,并且可能会开始使用它,但它似乎仍然可以使数据库处于部分迁移的状态。请参阅下面的答案以了解我目前的方法。我认为我的回答是暂定的,因此欢迎对此提供反馈。
      • @Obromios,您的回答看起来很合理,但我的经验更多是在 Heroku 方面而不是在 Rails 方面。祝你好运!
      【解决方案3】:

      我目前的方法是使用下面的versions_check 方法使用脚本检查远程数据库是否与即将推送的版本同步。如果远程版本同步,则推送新版本而不将其置于维护模式。如果不同步,则启动维护模式,备份数据库,推送新版本,进行迁移,然后退出维护模式。同时向所有用户发布维护开始的临时警告。

      require 'ostruct'   
      def versions_check(remote: 'production')
            last_migration = Dir['db/migrate/*'].sort.last
            version = last_migration.gsub('db/migrate/','').split('_').first
            remote_migration = `heroku run rake db:version -r #{remote}`
            remote_version = remote_migration.split(' ').last
            OpenStruct.new(ok?: (version == remote_version), version: version, remote_version: version)
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-21
        • 2023-03-06
        • 2018-02-20
        • 1970-01-01
        相关资源
        最近更新 更多