概要
railsのassets pipelineのEngine Yard Cloudへのdeploy時のprecompileについて解説します。
デフォルトの動きを解説した後、変更できる設定を紹介します。
設定の変更はconfig/ey.ymlに記述することで行います。
Engine Yard Cloudのデフォルトの動き
- 自動的にprecompileの必要性を判断します
- さらに、assetsに変更がない場合は自動的にprecompileをスキップします
- すべてのAppプロセスが動いているサーバで実行されます
具体的に、いずれかの場合はprecompileはスキップされます。それ以外は実行されます。
- railsのconfig.assets.enabled = falseと設定されて
- public/assets/*がリポジトリにコミットされている
さらに、以下の場合は現在使われているprecompileされたassetsが再利用されます。
- railsのconfig.assets.enabled = true としているか
- config/ey.ymlの設定を precompile_assetsをtrueに設定してあり
- かつ前回のdeployと今回のdeployでassetsに変更がない場合
deploy時のprecompile の on/offを設定(推奨)
config/ey.ymlをセットすることで、明示的にprecompileをon/offを設定することができます。
これにより、コンパイルに失敗した場合deployを止めることができます。
また、falseを設定することでprecompileをしないように設定することができます。
defaults: precompile_assets: true
precompileを必ず実行する設定
assetsに変更がなくても、必ずprecompileを走らせたい場合は以下を設定します。
defaults: precompile_assets: true precompile_unchanged_assets: true
カスタマイズしたprecompile taskを設定
precompileを他のrake takeに置き換えることもできます。
例えば lib/tasks/assets.rakeに以下のようなタスクを追加します。(default: assets:precompile)
namespace :assets do task :custom do Rake::Task['assets:precompile'].invoke File.open("./custom_#{Time.now.to_i}", 'w').close end end
そして、config/ey.ymlに以下を記述します。
defaults: precompile_assets: true precompile_assets_task: assets:custom
特定のサーバでのみprecompileする設定
デフォルトはAppのプロセスが動いているサーバ全てでprecompileされます。(default: [:app_master, :app, :solo])
utilサーバでも動かしたい、AppMasterのみにしたい場合などに設定を変更することができます。
下記設定では、utilサーバとAppMasterでprecompileされます。asset_rolesは配列を設定します。
defaults: precompile_assets: true asset_roles: - :app_master
- :util
参考
ey.ymlのセットアップについて詳しく書いたReadMeになります。
https://github.com/engineyard/engineyard-serverside#rails-assets
Smallインスタンスではasset compileにとても時間がかかることがあります。
- turbo-sprockets-rails3などgemを使って不要なcompileを減らす
などの対応方法があります。