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