# config valid for current version and patch releases of Capistrano
lock '~> 3.11.0'

set :rvm_type, :auto # Defaults to: :auto
set :rvm_ruby_version, '2.6.5'

set :god_sidekiq_group, 'push_service'
# 当前服务器有app 这个角色。
# gem capistrano-sidekiq 默认值 set :sidekiq_roles, fetch(:sidekiq_role, :app)
# 因此会造成执行cap sidekiq:start,但是生产环境因为使用了god,不需要执行这个任务
set :sidekiq_roles, :sidekiq #生产环境没有这个角色。
set :puma_role, 'app'
set :puma_env, fetch(:rack_env, fetch(:rails_env, 'production'))
set :sidekiq_default_hooks, true
set :pty, false

set :linked_files, %w[
  config/credentials.yml.enc
  config/master.key
  config/settings.yml
  config/puma.rb
  config/database.yml
]

set :linked_dirs, %w[
  log tmp/pids
  tmp/cache
  tmp/sockets
  vendor/bundle
]

namespace :sidekiq do
  desc 'restart sidekiq by god'
  # dev/testing/staging 不用god 监控
  task :god_restart do
    on roles(:sidekiq_god), in: :parallel do
      execute [
        'source ~/.rvm/scripts/rvm',
        'god',
        "god stop #{fetch(:god_sidekiq_group)}",
        'sleep 10',
        "god remove #{fetch(:god_sidekiq_group)}",
        "god load #{release_path}/config/sidekiq.god",
      ].join('; ')
    end
  end
end

namespace :puma do
  desc 'Create Directories for Puma Pids and Socket'
  task :make_dirs do
    on roles(:app) do
      execute "mkdir #{fetch(:shared_path)}/tmp/sockets -p"
      execute "mkdir #{fetch(:shared_path)}/tmp/pids -p"
    end
  end
  before :start, :make_dirs
end

namespace :deploy do
  desc "Make sure local git is in sync with remote."
  task :check_revision do
    on roles(:app) do
      unless `git rev-parse HEAD` == `git rev-parse origin/#{fetch(:branch)}`
        puts "WARNING: HEAD is not the same as origin/#{fetch(:branch)}"
        puts "Run `git push` to sync changes."
        exit
      end
    end
  end

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      invoke 'sidekiq:god_restart'
    end
  end
  before :starting,     :check_revision
  after  :finishing,    :compile_assets
  after  :finishing,    :restart
  after  :publishing,   :restart
end