部署到heroku后如何清除rails缓存?

Posted

技术标签:

【中文标题】部署到heroku后如何清除rails缓存?【英文标题】:How can I clear rails cache after deploy to heroku? 【发布时间】:2012-08-15 05:14:17 【问题描述】:

我将缓存应用于我的 heroku rails 应用程序,它运行良好。 但是每次我部署到heroku,我也想自动清除缓存。

所以我用谷歌搜索并找到了这个。

task :after_deploy, :env, :branch do |t, args|
  puts "Deployment Complete"
  puts "Cleaning all cache...."
  FileUtils.cd Rails.root do
    sh %heroku run console
    sh %Rails.cache.clear
  end
end

但是当我查看这个脚本时,它只显示了 heroku 控制台命令行,但没有输入 Rails.cache.clear 命令。 (我猜那是因为 heroku 控制台是交互式的)

system "heroku console Rails.cache.clear"

不适用于 cedar 应用。

我该如何解决这个问题?

谢谢。

【问题讨论】:

Clear Memcached on Heroku Deploy的可能重复 【参考方案1】:

Rails 有一个内置的 rake 任务:

rake tmp:clear

【讨论】:

【参考方案2】:

以下内容应该适用于雪松:

heroku run console

..然后等待 Heroku 控制台启动 5 秒

Rails.cache.clear

然后您应该会看到缓存已清除,并且您可以退出控制台。请记住,您可能需要刷新几次,因为您的本地计算机通常会在您的浏览器中缓存资产等,直到它发出新的请求。

如果它碰巧是你正在缓存的资产,你不需要在每次推送时都手动清除,你只需要设置资产管道并确保你所有的 js/css (less/sass)/static 图像在其文件名末尾使用哈希进行编译。

【讨论】:

但是如你所知,我写的脚本是 rake 脚本。我知道命令“heroku 运行控制台”在 5 秒后返回,我可以输入“Rails.cache.clear”。但我想在每次部署到 heroku 时使用我的 rake 脚本自动化它。 遵循这个模式michaeldwan.com/writings/customize-your-heroku-deployment.html,然后添加一个只调用 Rails.cache.clear 的 :after_deploy 钩子。 是的,我看到了这种模式。但我不知道如何连接到 heroku 控制台并调用 Rails.cache.clear。【参考方案3】:

您应该能够创建一个看起来像这样的缓存清除 rake 任务:

namespace :cache do
  desc "Clears Rails cache"
  task :clear => :environment do
    Rails.cache.clear
  end
end

并在一个可以在部署后挂钩中使用的命令中直接调用它 - 如下所示:

heroku run rake cache:clear

【讨论】:

【参考方案4】:

Ruby on Rails 有一个神奇的 ENV 变量,称为“RAILS_CACHE_ID”。每当我部署时,我都会将其设置为 git commit id:heroku config:set RAILS_CACHE_ID=$CIRCLE_SHA1

【讨论】:

TIL RAILS_CACHE_ID 是一个东西。很酷。为我们这些不使用circle ci的人进行了调整:heroku config:set RAILS_CACHE_ID=git rev-parse HEAD``【参考方案5】:

如果您想在部署后简单地运行 rake 任务,我建议您查看:

https://github.com/gunpowderlabs/buildpack-ruby-rake-deploy-tasks

我们已经在生产环境中使用它超过 6 个月了,它一直坚如磐石。

首先,在您已经拥有 Ruby buildpack 集之后添加 buildpack。这应该在您第一次部署到服务器后发生

heroku buildpacks:add https://github.com/gunpowderlabs/buildpack-ruby-rake-deploy-tasks

其次,设置一个名为 DEPLOY_TASKS 的环境变量,其中只包含您要运行的 rake 任务的名称,用空格分隔。

heroku config:set DEPLOY_TASKS='cache:clear

【讨论】:

这是最好的方法,应该标记为接受的答案。此解决方案不意味着手动操作,也不意味着修改项目本身。 请注意,这已被弃用,取而代之的是 Heroku 的“发布阶段”功能【参考方案6】:

heroku 运行 rake tmp:cache:clear

http://guides.rubyonrails.org/command_line.html#tmp

【讨论】:

【参考方案7】:

Heroku 目前不支持在部署后发生的一系列操作。您将需要 Codeship 或 TravisCI 之类的东西来创建部署期间发生的步骤配方

披露:我是 Codeship 的客户。

【讨论】:

【参考方案8】:

Heroku has a release phase,这意味着您可以将任何部署时任务放入您的Procfile

release: bundle exec rake tmp:clear

您可能希望设置自己的自定义 rake 任务来封装需要在部署时发生的任何其他任务,例如:db:migrate 等等。请记住,如果任务因任何原因失败,Heroku 将停止部署,并且之前部署的代码版本将保持活动状态。

【讨论】:

以上是关于部署到heroku后如何清除rails缓存?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Rails + Webpacker 应用程序部署到 Heroku?

在 Ruby on Rails 中使用 Heroku

即使在清除本地缓存后,Heroku网站也只是第一次加载缓慢?

将 Rails 应用程序部署到 Heroku 后,不显示 JQuery 函数中的图像

将 rails 应用程序从 3.2.3 迁移到 rails 4.0.0.rc2 后无法在 Heroku 上部署

Memcachier 达到缓存限制时 Heroku 请求超时