【发布时间】:2015-03-15 06:59:04
【问题描述】:
有一个问题我一直在苦苦挣扎。
我一直在使用 Capistrano 3 进行部署。 在我的 Capfile 中,我使用
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rails'
require 'capistrano/bundler'
require 'sidekiq/capistrano'
require 'whenever/capistrano'
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }
每当我部署时,它都会向我抛出 EACCES 权限被拒绝错误
所以我设法使用这段代码克服了这个错误
desc 'Fixing up cache permissions'
task :fix_assets_permission do
on roles(:web), in: :sequence, wait: 5 do
puts "chown -R root:root #{shared_path.join('tmp/cache')};"
puts "chmod 666 -R #{shared_path.join('tmp/cache')};"
execute "chown -R root:root #{shared_path.join('tmp/cache')};"
execute "chmod 666 -R #{shared_path.join('tmp/cache')};"
end
end
并把它放在像这样预编译资产之后
after 'deploy:compile_assets', 'deploy:fix_assets_permission'
它工作得很好,但是每当我部署时,前几次刷新它仍然会抛出完全相同的错误,然后工作得很好。
我怎样才能解决这个问题,这样我每次部署项目时都不会弹出这个错误。
非常感谢任何帮助。
UPD: 正如用户 John 指出的那样,我应该清除缓存,这确实解决了问题但是在部署时仍然会弹出此错误,直到它完成资产预编译并清除缓存。在这种情况下,我能做些什么来实现“零停机部署”。
我已经像这样修改了我的 deploy.rb 任务
desc 'Clearing cache'
task :clear_cache do
on roles(:web), in: :sequence, wait: 5 do
within release_path do
execute :rake, 'tmp:clear'
end
end
end
after 'deploy:compile_assets', 'deploy:clear_cache'
【问题讨论】:
-
尝试使用
rake tmp:clear清除 tmp 文件夹,看看问题是否消失。你在使用 Apache 吗? -
嗨,约翰,感谢您抽出宝贵时间回复。 rake tmp:clear 确实解决了这个问题,但是在 Capistrano 的上下文中,在预编译资产时仍然有相当多的停机时间,只有在编译资产后,缓存被清除并且这个错误消失了。认为您对如何使其成为零停机部署有任何想法?我已经用更多信息更新了问题。
-
哦,我正在使用Passenger
-
对于缓存清除,您可能不需要在每次部署时都这样做。我只是建议它,因为您最近更改了项目的 tmp/cache 目录的权限,并且那里可能有坏文件。
-
Capistrano 没有任何开箱即用的功能可以实现零停机时间部署。这将需要一些配置。乘客企业版具有零停机能力,但我认为这不是免费的。如果你想推出自己的检查 benjaminknofe.com/blog/2014/03/08/… 和 railscasts.com/episodes/…
标签: ruby-on-rails ruby caching capistrano assets