Ask Capistrano to run the task before it links the (symlink) file

I tried to write a capistrano script where I have a copy configuration file from my application's directory ( support/config/#{rails_env}) in shared directory(shared / config) in capistrano

rails_env => 'staging'

So, when capistrano starts first time, it sorts the file from the directory support/config/#{rails_env}into the shared / config directory, but it needs to run it before the file is connected by capistrano, i.e. before this is done

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

so the related task will not work (since the task requires the file to be present in the shared folder)

Here is my Capfile (nothing out of the ordinary since most things have been done by 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 to do is something like

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

Added Note: Using Capistrno 3.0.1

+3
1

documentation deploy: symlink: shared. , :

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

, , , .

+5

All Articles