2

Приложение My Rails 4.1.8 не работает в производстве. Когда я развертываю новую версию своего приложения по какой-то нечетной причине, все моих активов повторно отпечатываются, даже когда активы не изменились. Это по существу разрывает кеш для всех активов при каждом развертывании. Очевидно, что это побеждает одну из целей использования конвейера активов в первую очередь.Компиляция активов Rails в производстве генерирует новые отпечатки пальцев при каждом развертывании, даже если файл не был изменен.

Я использую:

  • Rails 4.1.8, Ruby 2.2.2
  • Capistrano 3.4 для развертывания.
  • звездочки рельсы 2.3.1

Выдержка из production.rb:

config.assets.digest = true 
config.serve_static_assets = true 

конфигурации/инициализаторах/assets.rb

Rails.application.config.assets.version = '1.0' 

Capfile

require 'capistrano/setup' 
require 'capistrano/deploy' 
require 'capistrano/bundler' 
require 'capistrano/rbenv' 
require 'capistrano/rails/assets' 
require 'capistrano/rails/migrations' 

set :rbenv_type, :user 
set :rbenv_ruby, '2.2.2' 

/конфи г/deploy.rb

lock '3.4' 
set :application, 'myapp' 
set :repo_url, '[email protected]:user/app.git' 
set :deploy_to, '/home/deploy/app' 

set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'tmp/uploads', 'vendor/bundle', 'public/system') 
set :bundle_binstubs, nil 
set :keep_releases, 5 

SSHKit.config.command_map[:rake] = 'bundle exec rake' 
SSHKit.config.command_map[:rails] = 'bundle exec rails' 

namespace :deploy do 

    desc 'Restart application' 
    task :restart do 
    on roles(:app), in: :sequence, wait: 5 do 
     within "#{release_path}" do 
     execute :bundle, "exec thin restart -O -C /etc/thin/app.yml" 
    end 
    end 
end 

after :publishing, :restart 

При развертывании:

Me$: bin/cap production deploy 

... 
DEBUG [ff4ce05c] Running /usr/bin/env if test ! -d /home/deploy/app/releases/20150618015809; then echo "Directory does not exist '/home/deploy/app/releases/20150618015809'" 1>&2; false; fi as [email protected] 
DEBUG [ff4ce05c] Command: if test ! -d /home/deploy/app/releases/20150618015809; then echo "Directory does not exist '/home/deploy/app/releases/20150618015809'" 1>&2; false; fi 
DEBUG [ff4ce05c] Finished in 0.370 seconds with exit status 0 (successful). 
INFO [4ab0f9c7] Running ~/.rbenv/bin/rbenv exec bundle exec rake assets:precompile as [email protected] 
DEBUG [4ab0f9c7] Command: cd /home/deploy/app/releases/20150618015809 && (RBENV_ROOT=~/.rbenv RBENV_VERSION=2.2.2 RAILS_ENV=staging ~/.rbenv/bin/rbenv exec bundle exec rake assets:precompile) 
DEBUG [4ab0f9c7] I, [2015-06-18T01:58:31.892846 #16404] INFO -- : Writing /home/deploy/app/releases/20150618015809/public/assets/proximanova-bold-7c9c7de5d4c12790ac074e1c15637315.eot 
DEBUG [4ab0f9c7] I, [2015-06-18T01:58:31.894641 #16404] INFO -- : Writing /home/deploy/app/releases/20150618015809/public/assets/proximanova-bold-8252ebfc2dfe42e154d8e8bcedbfd2f6.svg 
DEBUG [4ab0f9c7] I, [2015-06-18T01:58:31.896158 #16404] INFO -- : Writing /home/deploy/app/releases/20150618015809/public/assets/proximanova-bold-cf546ab4766383966d7b70bd2749c011.ttf 
DEBUG [4ab0f9c7] I, [2015-06-18T01:58:31.897666 #16404] INFO -- : Writing /home/deploy/app/releases/20150618015809/public/assets/proximanova-bold-4bafadbafe1d7f0915ef05f107e97a25.woff 
DEBUG [4ab0f9c7] I, [2015-06-18T01:58:31.899064 #16404] INFO -- : Writing /home/deploy/app/releases/20150618015809/public/assets/proximanova-bold-3b37298fc9eb69093953f9885e889090.woff2 
... 

Тогда я бегу во второй раз (без изменения каких-либо активов)

Me$: bin/cap production deploy 

... 
DEBUG [cbbe9a55] Running /usr/bin/env if test ! -d /home/deploy/app/releases/20150618020326; then echo "Directory does not exist '/home/deploy/app/releases/20150618020326'" 1>&2; false; fi as [email protected] 
DEBUG [cbbe9a55] Command: if test ! -d /home/deploy/app/releases/20150618020326; then echo "Directory does not exist '/home/deploy/app/releases/20150618020326'" 1>&2; false; fi 
DEBUG [cbbe9a55] Finished in 0.369 seconds with exit status 0 (successful). 
INFO [6e1eeadf] Running ~/.rbenv/bin/rbenv exec bundle exec rake assets:precompile as [email protected] 
DEBUG [6e1eeadf] Command: cd /home/deploy/app/releases/20150618020326 && (RBENV_ROOT=~/.rbenv RBENV_VERSION=2.2.2 RAILS_ENV=staging ~/.rbenv/bin/rbenv exec bundle exec rake assets:precompile) 
DEBUG [6e1eeadf] I, [2015-06-18T02:03:48.365574 #16929] INFO -- : Writing /home/deploy/app/releases/20150618020326/public/assets/proximanova-bold-78ec1c34931362f5fc9d1c64477d075f.eot 
DEBUG [6e1eeadf] I, [2015-06-18T02:03:48.367236 #16929] INFO -- : Writing /home/deploy/app/releases/20150618020326/public/assets/proximanova-bold-6fadee20c88b51ed286db9687b131999.svg 
DEBUG [6e1eeadf] I, [2015-06-18T02:03:48.368709 #16929] INFO -- : Writing /home/deploy/app/releases/20150618020326/public/assets/proximanova-bold-dc42499d91c401ef2e3452caa1917adf.ttf 
DEBUG [6e1eeadf] I, [2015-06-18T02:03:48.370105 #16929] INFO -- : Writing /home/deploy/app/releases/20150618020326/public/assets/proximanova-bold-2d17c273eabf9ce851993897dd1fb300.woff 
DEBUG [6e1eeadf] I, [2015-06-18T02:03:48.371464 #16929] INFO -- : Writing /home/deploy/app/releases/20150618020326/public/assets/proximanova-bold-7562093954d44696b2df7ada1488e2da.woff2 
... 

Очевидно, что все активы были повторной отпечатки пальцев, которые не должны иметь место.

Если я вхожу в сервере, удалите все активы в/государственных/активов и выполнить следующую команду:

RBENV_ROOT=~/.rbenv RBENV_VERSION=2.2.2 RAILS_ENV=production ~/.rbenv/bin/rbenv exec bundle exec rake assets:precompile 

активы составлены правильно. Если я снова запустил ту же команду, активы не будут восстановлены, что снова будет правильным. Просто не может показаться, что правильное поведение при развертывании через Capistrano.

Возможно, что-то явно вписано в конфигурацию, но до сих пор я не смог его сузить, несмотря на множество параметров конфигурации, с которыми я экспериментировал.

Любые идеи Rails gurus?

ответ

0

Не могли бы вы попробовать загрузить один из файлов, перераспределить и снова загрузить? Запустите контрольную сумму (MD5, SHA256, что-то) в двух файлах и посмотрите, совпадают ли они.

Контрольные суммы основаны на содержимом файлов. Поэтому, если файлы получают разные контрольные суммы, у них, вероятно, есть другое содержимое. Вы можете запустить diff на двух из них, вероятно, SVG, поскольку XML будет отличаться лучше.

+0

На моем сервере производства, я бегу md5sum акций/общество/активы/заполнитель - * и SVG получаем следующее: ** 61b0d2602c44b013bebb40c6fa49d7f8 ** Заполнитель-2779b2aa00e0c53f6a9d47f537d501dc.svg ** 61b0d2602c44b013bebb40c6fa49d7f8 ** замещающий-40c13c5ef3e93065791d60c5e749a922 .svg. Это два релиза с отпечатками отпечатков пальцев, но с той же контрольной суммой. И на моем Dev поле, я бегу md5 заполнитель - * и SVG получаем следующее:. MD5 (приложение/активы/изображения/placeholder.svg) = ** 61b0d2602c44b013bebb40c6fa49d7f8 ** суммы совпадают и, следовательно, нет различия между файлами , Неудивительно. – Jaybloke

+0

Привет @will_in_wi. Просто заметил что-то своеобразное. В config/initializers/assets.rb у меня есть строка по умолчанию ** Rails.application.config.assets.version = '1.0' **. Если я войду на свой производственный сервер и запустил консоль рельсов, я вижу, что ** Rails.application.config.assets.version ** дает ** 1.0-ART-4cbf7519e09d7920d6e60433d95de054 **. И контрольная сумма изменяется при каждом развертывании, даже если никакие активы не изменились. Кажется, что кэш разоряется при каждом развертывании. Посмотрел источник sprockets, но в соответствии с тестами версия активов должна быть равна тому, на что она была установлена, в данном случае «1.0». – Jaybloke

2

Я обнаружил маршрут проблемы ... мои угловые рельсы-шаблоны gem - https://github.com/pitr/angular-rails-templates.

Версии 0.1.5 и 0.2.0 из gem добавляет контрольную сумму в строку config.assets.version каждый раз, когда скомпилированы шаблоны JS. Это разрушало кеш при каждом развертывании, даже если никаких активов не изменилось.

Временным решением является переход на версию 0.1.4 до тех пор, пока не будет установлено исправление. См. https://github.com/pitr/angular-rails-templates/issues/104