load 'deploy' if respond_to?(:namespace) # cap2 differentiator # general config set :application, "myapp" set :valid_environments, ["staging","production"] set :user, "deployer" # git config set :scm, :git set :repository, "git@github.com:my/repo.git" set :branch, "master" set :deploy_via, :remote_cache default_run_options[:pty] = true # set :use_sudo, true # ssh_options[:forward_agent] = true set :current_dir, "myapp" namespace :deploy do desc "Sets up basic directory structure on target server" task :setup, :except => { :no_release => true } do dirs = [deploy_to, releases_path, shared_path] dirs += shared_children.map { |d| File.join(shared_path, d) } run "#{try_sudo} mkdir -p #{dirs.join(' ')} && #{try_sudo} chmod g+w #{dirs.join(' ')}" end desc <<-DESC Updates the symlink to the most recently deployed version. Capistrano works \ by putting each new release of your application in its own directory. When \ you deploy a new version, this task's job is to update the `current' symlink \ to point at the new version. You will rarely need to call this task \ directly; instead, use the `deploy' task (which performs a complete \ deploy, including `restart') or the 'update' task (which does everything \ except `restart'). DESC task :create_symlink, :except => { :no_release => true } do on_rollback do if previous_release run "rm -f #{current_path}; ln -s #{previous_release} #{current_path}; true" else logger.important "no previous release to rollback to, rollback of symlink skipped" end end # delete the old and create a new symlink to the latest release run "rm -f #{current_path} && ln -s #{latest_release} #{current_path}" # delete the uploads directory out of the new codebase if it exists. then symlink the uploads directory to there. # run "rm -rf #{latest_release}/app/assets/uploads && ln -s #{deploy_to}/shared/uploads #{latest_release}/app/assets/uploads" run "ln -s #{deploy_to}/shared/uploads #{latest_release}/app/assets/uploads" end desc <<-DESC Restarts your application. By default, this will be invoked via sudo as the 'app' user. If you are in an environment where you can't use sudo, set the :use_sudo variable to false: set :use_sudo, false DESC task :restart, :roles => :app, :except => { :no_release => true } do run "#{sudo} chown -R www-data:www-data /var/apps/myapp/shared/uploads/" run "#{sudo} /etc/init.d/apache2 reload" end desc <<-DESC [internal] Touches up the released code. This is called by update_code \ after the basic deploy finishes. This task will make the release group-writable (if the :group_writable \ variable is set to true, which is the default). It will then change \ ownership of the release and the symlink that was created if the owners \ variable exists. DESC task :finalize_update, :except => { :no_release => true } do # run "chmod -R g+w #{latest_release}" if fetch(:group_writable, true) run "#{sudo} chown -R #{owners} #{current_path}" if exists?("owners") run "#{sudo} chown -R #{owners} #{latest_release}" if exists?("owners") end end