Capistrano 3でdeploy時にniceにassets:precompileする方法
config/deploy.rbに以下を書いた。
ただ、この方法だと全部のrake taskにniceが効いてしまうのでいまいち。問題はないけど。
namespace :assets do # clear action because Rake DSL on v3 is additive # refs) http://capistranorb.com/documentation/advanced-features/overriding-capistrano-tasks/ Rake::Task['deploy:assets:precompile'].clear_actions task :precompile => [:map_nice] do on roles(fetch(:assets_roles)) do within release_path do with rails_env: fetch(:rails_env) do execute :rake, "assets:precompile" end end end end task :map_nice do SSHKit.config.command_map.prefix[:rake].unshift('nice -n 19') end end
あと書いてからから気づいたけど、deploy:assets:precompile自体は上書きせずに、beforeでmap_niceを実行するだけでよさそう。capistrano/rbenvがunshift, capistrano/bundlerがpushでコマンド追加していて、rbenv niceはエラーになるので評価タイミングはめんどう。
ちなみに、capistrano/*がcommand_mapを追加してるタイミングは以下。taskのhookだと複数回評価される可能性があるけど、以下のタイミングなら一度きり。なるほど。
Capistrano::DSL.stages.each do |stage| after stage, 'rbenv:map_bins' end
という訳で追記内容は最終的にこうなった。
namespace :deploy do namespace :assets do task :map_bins do SSHKit.config.command_map.prefix[:rake].unshift('nice -n 19') end end end Capistrano::DSL.stages.each do |stage| after stage, 'deploy:assets:map_bins' end