Question

I been trying to write a capistrano script where I have copy config file from the my application directory(support/config/#{rails_env}) to the shared directory(shared/config) in capistrano

rails_env => 'staging'

So that when the capistrano run the first time it sort copies the file from the support/config/#{rails_env} directory to shared/config directory but it need to run it before the file is linked by capistrano i.e before this is done

set :linked_files, %w{config/api_config.yml}

so that the linked task doesnot fail (since it require the task required the file to be present in shared directory)

Here is my Capfile (Nothing fancy since most of the stuff is done my capistrno)

set :application, 'custom-api'
set :repo_url, ''

# ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }
set :rails_env, 'staging' 
set :deploy_to, '/var/apps/staging/custom-api'
set :scm, :git

set :format, :pretty
set :log_level, :debug
set :rvm_type, :user   # Defaults to: :auto
set :rvm_ruby_version, 'ruby-1.9.3@484@custom-api'  
#set :rvm_custom_path, '~/.myveryownrvm'  # only needed if not detected
# set :pty, true
set :linked_files, %w{config/mongoid.yml config/api_config.yml}
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}

#set :default_env, { path: "$HOME/.rvm/#{}:$PATH" }
set :keep_releases, 5
#SSHKit.config.command_map[:cp_r]  = "cp -r"

## Need to run before the file is linked
#before 'deploy:[task_name]' , 'deploy:copy_files'

namespace :deploy do
  desc 'Copy files from application to shared directory'
  ## copy the files to the shared directories
  task :copy_files do 
    on roles(:app) do
      execute :cp ,'-r',release_path.join('support/config'),shared_path
    end  
  end

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      # Your restart mechanism here, for example:
      execute :touch, release_path.join('tmp/restart.txt')
    end
  end

  after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
      # Here we can do anything such as:
      # within release_path do
      #   execute :rake, 'cache:clear'
      # end
    end
  end
  after :finishing, 'deploy:cleanup'
end

All I need is to do something like

before 'deploy:[task_name]' , 'deploy:copy_files'

Added Note : Using Capistrno 3.0.1

Was it helpful?

Solution

According to their documentation, the task is called deploy:symlink:shared. I would decorate that like your example:

before 'deploy:symlink:shared', 'deploy:copy_files'

Be aware when you decorate the actual task like that it will be called every time that task is called.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top