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
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.