使用资产管道优化rails app到多个服务器的部署

set*_*mcl 5 ruby deployment capistrano ruby-on-rails asset-pipeline

我正在多服务器环境中部署rails应用程序.该应用程序使用资产管道,资产从s3提供.如果我在我部署的每台服务器上运行资产:预编译,一切正常(在每个盒子上生成所需的assets/manifest.yml).

问题是这种效率非常低.我尝试将其中一个服务器指定为主服务器,并且仅运行资产:在该框上预编译.现在的问题是其他服务器没有assets/manifest.yml的副本.

认为解决方案将涉及找出在所有框上共享生成的assets/manifest.yml文件的最简单方法.

其他人如何处理这种情况?

谢谢你的帮助.

set*_*mcl 2

最终通过编写这个上限任务解决了这个问题:

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
Run Code Online (Sandbox Code Playgroud)

看起来有点老套,但完成了工作。我们不想在本地进行预编译。