Ошибка предварительной компиляции актива при развертывании Capistrano на пару обновлений

Есть проблема, с которой я борюсь уже довольно давно.

Я развертываю с помощью Capistrano 3. В моем файле Capfile я использую

require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rails'
require 'capistrano/bundler'
require 'sidekiq/capistrano'
require 'whenever/capistrano'

Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }

И всякий раз, когда я развертываю, он выдает мне ошибку отказа в разрешении EACCES

введите описание изображения здесь

поэтому мне удалось преодолеть эту ошибку, используя этот фрагмент кода

desc 'Fixing up cache permissions'
task :fix_assets_permission do
  on roles(:web), in: :sequence, wait: 5 do

    puts "chown -R root:root #{shared_path.join('tmp/cache')};"
    puts "chmod 666 -R #{shared_path.join('tmp/cache')};"

    execute "chown -R root:root #{shared_path.join('tmp/cache')};"
    execute "chmod 666 -R #{shared_path.join('tmp/cache')};"
  end
end

и поместив его после предварительной компиляции активов, как это

after 'deploy:compile_assets', 'deploy:fix_assets_permission'

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

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

Любая помощь горячо приветствуется.

UPD: как указал пользователь Джон, я должен очистить кеш, и это действительно решает проблему, ОДНАКО эта ошибка все еще появляется во время развертывания, пока она не завершит предварительную компиляцию ресурсов и не очистит кеш. Могу ли я что-нибудь сделать, чтобы обеспечить «развертывание с нулевым временем простоя» в этом случае?

Я изменил свою задачу deploy.rb следующим образом

desc 'Clearing cache'
task :clear_cache do
  on roles(:web), in: :sequence, wait: 5 do
    within release_path do
      execute :rake, 'tmp:clear'
    end
  end
end

after 'deploy:compile_assets', 'deploy:clear_cache'

person Vitali    schedule 16.01.2015    source источник
comment
Попробуйте очистить папку tmp с помощью rake tmp:clear и посмотрите, исчезнет ли проблема. Вы используете Apache?   -  person johnsorrentino    schedule 19.01.2015
comment
Привет, Джон, спасибо, что нашли время ответить. rake tmp: clear действительно решает проблему, но в контексте Capistrano все еще остается довольно мало времени простоя во время предварительной компиляции ресурсов, только после того, как ресурсы были скомпилированы, кеш очищен, и эта ошибка исчезнет. Думаете, у вас есть какие-нибудь мысли о том, как сделать развертывание без простоев? Я обновил вопрос, добавив больше информации.   -  person Vitali    schedule 19.01.2015
comment
О, и я использую Пассажир   -  person Vitali    schedule 19.01.2015
comment
Для очистки кеша вам, вероятно, не нужно делать это при каждом развертывании. Я предложил это только потому, что вы недавно изменили права доступа к каталогу tmp / cache проекта и, возможно, там были плохие файлы.   -  person johnsorrentino    schedule 19.01.2015
comment
Нет ничего готового к развертыванию Capistrano с нулевым временем простоя. Это займет некоторую настройку. Версия для легковых автомобилей имеет нулевое время простоя, но я не думаю, что это бесплатно. Если вы хотите свернуть свою собственную проверку, benjaminknofe.com/blog/2014/03/08/ и railscasts.com/episodes/   -  person johnsorrentino    schedule 19.01.2015


Ответы (1)


Возможно, вы захотите использовать более чистый инструмент развертывания, такой как mina. Это гораздо более простой инструмент, который намного надежнее и быстрее из-за используемого подхода. В нашей установке Capistrano вызвал больше проблем, чем решил.

Перенос нашего многоэтапного развертывания на mina потребовал очень мало усилий, и мы никогда не оглядывались назад. Я не могу понять, сколько лет Capistrano 3 был в глуши, чтобы делать то, что сводится к запуску удаленного скрипта.

Вот статья сдерживающая мина и капистрано.

person Andrew Hacking    schedule 23.01.2015