Очистить Memcached на Heroku Deploy - PullRequest
       4

Очистить Memcached на Heroku Deploy

33 голосов
/ 12 октября 2011

Каков наилучший способ автоматической очистки Memcached при развертывании моего приложения rails на Heroku?

Я кеширую домашнюю страницу, и когда я делаю изменения и повторно развертываю, страница обслуживается из кэша, а обновления не включаются.

Я хочу, чтобы это было полностью автоматизировано. Я не хочу очищать кеш в консоли heroku при каждом развертывании.

Спасибо!

Ответы [ 9 ]

32 голосов
/ 09 декабря 2012

Я развертываю свои приложения, используя скрипт bash, который автоматизирует GitHub & Heroku push, миграцию базы данных, активацию режима обслуживания приложений и очистку кэша.

В этом сценарии команда для очистки кэша:

heroku run --app YOUR_APP_NAME rails runner -e production Rails.cache.clear

Работает с Celadon Cedar с пакетом Heroku Toolbelt.Я знаю, что это не решение на основе Rake, но оно весьма эффективно.

Примечание: убедитесь, что для параметра *1000* / -e команды runner установлено значение production, так как оно будетв противном случае выполняется на development.

Edit : у меня возникали проблемы с этой командой на Heroku в течение нескольких дней (Rails 3.2.21).У меня не было времени, чтобы проверить причину возникновения проблемы, но удаление -e production помогло, так что если команда не удалась, запустите этот:

heroku run --app YOUR_APP_NAME rails runner Rails.cache.clear
23 голосов
/ 24 февраля 2012

[На стеке кедра селадона]

- [Обновление 18 июня 2012 г. - это больше не работает, посмотрим, смогу ли я найти другой обходной путь]

Самый простой способ обработки этих ловушек после развертывания - это привязка к ресурсу: предварительная компиляция, которая уже вызывается во время компиляции слагов. С кивком asset_sync Gem за идею:

Rake::Task["assets:precompile"].enhance do
  # How to invoke a task that exists elsewhere
  # Rake::Task["assets:environment"].invoke if Rake::Task.task_defined?("assets:environment")

  # Clear cache on deploy
  print "Clearing the rails memcached cache\n"
  Rails.cache.clear
end

Я просто поместил это в файл lib / tasks / heroku_deploy.rake, и он был хорошо подобран.

8 голосов
/ 09 ноября 2011

Я закончил тем, что создал новое рейк-задание, которое развернулось на heroku, а затем очистило кеш.Я создал файл deploy.rake и вот он:

namespace :deploy do

    task :production do
        puts "deploying to production"
        system "git push heroku"
        puts "clearing cache"
        system "heroku console Rails.cache.clear"
        puts "done"
    end

end

Теперь вместо того, чтобы набирать git push heroku, я просто набираю rake deploy: production.

7 голосов
/ 25 января 2013

25 января 2013: это работает для приложения Rails 3.2.11, работающего на Ruby 1.9.3 на Cedar

В вашем Gemfile добавьте следующую строку для принудительного выбора ruby ​​1.9.3:

ruby '1.9.3'

Создайте файл с именем lib/tasks/clear_cache.rake с таким содержимым:

if Rake::Task.task_defined?("assets:precompile:nondigest")
  Rake::Task["assets:precompile:nondigest"].enhance do
    Rails.cache.clear
  end
else
  Rake::Task["assets:precompile"].enhance do
    # rails 3.1.1 will clear out Rails.application.config if the env vars
    # RAILS_GROUP and RAILS_ENV are not defined. We need to reload the
    # assets environment in this case.
    # Rake::Task["assets:environment"].invoke if Rake::Task.task_defined?("assets:environment")
    Rails.cache.clear
  end
end

Наконец, я также рекомендую запустить heroku labs:enable user-env-compile в вашем приложении, чтобы его среда была доступнавам как часть прекомпиляции.

2 голосов
/ 12 октября 2011

Помимо всего, что вы можете делать внутри своего приложения, которое запускается при «запуске приложения», вы можете использовать ловушки для развертывания heroku (http://devcenter.heroku.com/articles/deploy-hooks#http_post_hook), которые могут попасть в URL вашего приложения, который очищает кеш

0 голосов
/ 30 декабря 2014

У меня только что была эта проблема, но я хотел придерживаться развертывания git без дополнительного скрипта в качестве оболочки.

Поэтому мой подход - написать файл во время генерации слагов с помощью uuid, который отмечает текущийпрекомпиляция.Это делается как ловушка в assets:precompile.

# /lib/tasks/store_asset_cacheversion.rake
# add uuidtools to Gemfile

require "uuidtools"

def storeCacheVersion
  cacheversion = UUIDTools::UUID.random_create
  File.open(".cacheversion", "w") { |file| file.write(cacheversion) }
end

Rake::Task["assets:precompile"].enhance do
  puts "Storing git hash in file for cache invalidation (assets:precompile)\n"
  storeCacheVersion
end

Rake::Task["assets:precompile:nondigest"].enhance do
  puts "Storing git hash in file for cache invalidation (assets:precompile:nondigest)\n"
  storeCacheVersion
end

Другой инициализатор, который проверяет этот идентификатор в кэшированной версии.Если они различаются, произошла другая прекомпиляция, и кеш будет признан недействительным.

Таким образом, не имеет значения, как часто приложение вращается вверх или вниз или на сколько узлов будет распределяться рабочий, потому что генерация слагов происходит только один раз.

# /config/initializers/00_asset_cache_check.rb

currenthash = File.read ".cacheversion"
cachehash   = Rails.cache.read "cacheversion"

puts "Checking cache version: #{cachehash} against slug version: #{currenthash}\n"

if currenthash != cachehash
  puts "flushing cache\n"
  Rails.cache.clear
  Rails.cache.write "cacheversion", currenthash
else
  puts "cache ok\n"
end

Мне нужноиспользовать случайный идентификатор, потому что, насколько я знаю, нет способа получить хэш git или любой другой полезный идентификатор.Возможно ENV[REQUEST_ID], но это тоже случайный идентификатор.

Хорошая особенность uuid в том, что он теперь также не зависит от heroku.

0 голосов
/ 21 июля 2014

Мне нравится использовать следующее решение:

Сначала я реализую действие deploy_hook, которое ищет параметр, который я устанавливаю по-разному для каждого приложения.Обычно я просто делаю это на «домашнем» или «общедоступном» контроллере, так как для этого не нужно много кода.

### routes.rb ###

post 'deploy_hook' => 'home#deploy'

### home_controller.rb ###

def deploy_hook
  Rails.cache.clear if params[:secret] == "a3ad3d3"
end

И я просто приказываю герою установить хук развертывания для публикациик этому действию всякий раз, когда я развертываю!

heroku addons:add deployhooks:http \
   --url=http://example.com/deploy_hook?secret=a3ad3d3

Теперь, каждый раз, когда я развертываю, heroku будет отправлять HTTP-сообщение обратно на сайт, чтобы сообщить мне, что развертывание работает просто отлично.

Работает как шарм для меня.Конечно, секретный токен не «высокий уровень безопасности», и его не следует использовать, если был хороший вектор атаки для взлома вашего сайта, если очищены кэши.Но, если честно, если сайт настолько критичен для атаки, то не размещайте его на Heroku!Однако, если вы хотите немного повысить безопасность, вы можете использовать конфигурационную переменную Heroku и вообще не иметь «токен» в исходном коде.

Надеюсь, люди найдут это полезным.

0 голосов
/ 16 января 2013

Поскольку самоцвет Герою устарел, обновленная версия Соломонова очень элегантного ответа будет сохранять следующий код в lib/tasks/heroku_deploy.rake:

namespace :deploy do
    task :production do
        puts "deploying to production"
        system "git push heroku"
        puts "clearing cache"
        system "heroku run rake cache:clear"
        puts "done"
    end
end

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

, тогда вместо git push heroku master вы набираете rake deploy:productionв командной строке.Чтобы просто очистить кеш, вы можете запустить rake cache:clear

0 голосов
/ 15 июня 2012

Я добавил config/initializers/expire_cache.rb с

ActionController::Base.expire_page '/'

Работает сладко!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...