I am deploying a rails app in a multi-server environment. The app uses the asset pipeline, and assets are being served from s3. If I run assets:precompile on each server I deploy to, everything works fine (the needed assets/manifest.yml gets generated on each box).
The issue is that this feels very inefficient. I tried designating one of the servers as primary, and only running assets:precompile on that box. The issue now is that the other servers do not have a copy of assets/manifest.yml.
I think the solution will involve figuring out the simplest way to share the generated assets/manifest.yml file on all boxes.
How do others handle this situation?
Thanks for your help.
Ended up solving this by writing this cap task:
task :assets_precompile, { on_no_matching_servers: :continue, only: { primary: true } } do
  transaction do
    on_rollback do
      notification.exception_deploy
    end
    run "cd #{current_release} && RAILS_ENV=#{stage} rake assets:precompile"
    # sync manifest.yml
    download("#{current_release}/public/assets/manifest.yml", "/tmp/manifest.yml")
    find_servers().each do |current_server|
      run_locally "ssh app@#{current_server.host} 'mkdir -p #{current_release}/public/assets'"
      run_locally "scp /tmp/manifest.yml app@#{current_server.host}:#{current_release}/public/assets/manifest.yml"
    end
  end
end
Seems a bit hacky, but gets the job done. We didn't want to do pre-compilation locally.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With