アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

assets:precompile が遅い

こんにちは、tahara です。

ようやく いこーよエンパ においつき Rails4 になりました! おいつかれたエンパ担当者は、「エンパはRails6くらいにしたい」などのたまっていましたが、 その時はエイリアンテクノロジーでつきはなしたいと思っています。

さて、Rails4 になって困ったことがありました。 Rails3 の時は10分ちょっとで終っていた本番デプロイが20分くらいかかるようになってしまったのです。 assets:precompile がとても遅いのです。

たくさんの画像ファイルと、大きな CSS ファイルがわるいのですが、 さすがに時間がかかりすぎます。

なんとかならないものかと、最初に試してみたのが Rails4なのにassets:precompileが遅い です。 これで速くなった! と喜んでいたのですが、 同じファイル名のまま画像を変えた時に *.js.erb が 再プリコンパイルされないという問題にぶつかり、あきらめました。

次に試したのが Rails deployments from 4 minutes to 40 seconds です。 ローカルで assets:precompile して tar でかため、それをアップロードする方法です。 これはうまくいきました! 特に問題もなく Rails3 の時と同じくらいの時間で本番デプロイできるようになりました。 よかった。

上記のエントリのコードにはこちらでは使わないものが入ってたりしたので、 次のようなコードを config/deploy.rb に書いています。

namespace :deploy do
  namespace :assets do
    desc <<-DESC
      Precompiles assets locally.
    DESC
    task :precompile, :roles => lambda { assets_role }, :except => { :no_release => true } do
      run_locally "rm -rf public/assets tmp/cache"
      run_locally "RAILS_ENV=#{rails_env.to_s.shellescape} #{rake} assets:precompile"
      run_locally "cd public && tar -jcf assets.tar.bz2 assets"
      top.upload "public/assets.tar.bz2", "#{shared_path}", via: :scp
      run "cd #{shared_path} && rm #{shared_path.shellescape}/#{shared_assets_prefix}/manifest-* && tar -jxf assets.tar.bz2 && rm assets.tar.bz2"
      run_locally "rm -rf public/assets.tar.bz2 public/assets tmp/cache"

      # Copy manifest to release root (for clean_expired task)
      run <<-CMD.compact
        cp -- #{shared_manifest_path.shellescape} #{current_release.to_s.shellescape}/assets_manifest#{File.extname(shared_manifest_path)}
      CMD
    end
  end
end

そんなわけで、そろそろ並列 assets:precompile が導入されないかな、と期待しています。