Capistrano - override default, get/copy source from local

4 views
Skip to first unread message

David Kahn

unread,
Jul 26, 2010, 10:50:47 PM7/26/10
to rubyonra...@googlegroups.com
I am working on getting Capistrano running for an app but need to ask it to download source to a local directory and then send it to the deployment server via scp/etc (there are reasons for this I won't get into). Below is where I am and what I am trying --- if anyone has done this or can show me where I am going wrong I'd appreciate it.

I found the following info but it does not seem to work, cap deploy seems to run the same as without it:

http://rdoc.info/rdoc/capistrano/capistrano/blob/6d540a5d4d04278312f96ae8276e9cacc2d826e5/Capistrano/Deploy/Strategy/Copy.html

  set :copy_strategy, :export
  set :copy_cache, true
set :copy_exclude, ".git/*"
  set :copy_cache, "/tmp/caches/myapp"


Following is my deploy.rb:

set :application, "compare"
set :repository,  "g...@github.com:structuralartistry/compare.git"

set :scm, "git"
set :user, "myuser"  # The server's user for deploys
set :scm_passphrase, "mypassphrase"

set :copy_strategy, :export
set :copy_cache, true
set :copy_exclude, ".git/*"
set :copy_cache, "~/Documents/ror/deployment/compare"

set :use_sudo,    false


set :branch, "master"
#set :deploy_via, :remote_cache
set :deploy_to, "/home/myuser/webapps/compare"


role :web, "xxx.xxx.xxx.xxx"                          # Your HTTP server, Apache/etc
role :app, "xxx.xxx.xxx.xxx"                          # This may be the same as your `Web` server
role :db,  "xxx.xxx.xxx.xxx", :primary => true # This is where Rails migrations will run



namespace :deploy do
  task :start, :roles => :app do
    run "touch #{current_release}/tmp/restart.txt"
  end

  task :stop, :roles => :app do
    # Do nothing.
  end

  desc "Restart Application"
  task :restart, :roles => :app do
    run "touch #{current_release}/tmp/restart.txt"
  end
end

khagimoto

unread,
Jul 27, 2010, 12:35:27 PM7/27/10
to Ruby on Rails: Talk
I use this script, and it works for me (although, I'm sure I could
improve it..) - hope this helps!
================ START deploy.rb =============

set :application, "MY_APP"
set :user, "your_username"
set :admin_runner, user
set :rails_env, 'test'

set :deploy_to, "/path/to/MY_APP/#{application}" # this is the path on
your server you're deploying to
set :deploy_via, :copy

set :scm, :git
set :repository, "/My/local/git/repository"
set :branch, "master"
set :port, YOUR_PORT_HERE

set :location, "your_domain.com"

role :app, location
role :web, location
role :db, location, :primary => true

namespace :deploy do
desc "Restarting mod_rails with restart.txt"
task :restart, :roles => :app, :except => { :no_release => true } do
run "touch #{current_path}/tmp/restart.txt"
end

[:start, :stop].each do |t|
desc "#{t} task is a no-op with mod_rails"
task t, :roles => :app do ; end
end

# RailsEnv is set in apache my_app vhost config, but also set it in
environment.rb,
# so applicaitons can acccess the RAILS_ENV constant.
task :set_rails_env do
tmp = "#{current_release}/MY_APP/tmp/environment.rb"
final = "#{current_release}/MY_APP/config/environment.rb"
run <<-BASH
echo "ENV['RAILS_ENV'] ||= '#{rails_env}'" > #{tmp};
cat #{final} >> #{tmp} && mv #{tmp} #{final};
BASH
end

end

# After the current release has been updated, re-create the symbolic
links on the server
# so that the database.yml and uploads (in shared directory) are
"understood" by the current release
namespace(:customs) do
task :config, :roles => :app do
run <<-CMD
ln -nfs #{shared_path}/system/database.yml #{release_path}/
MY_APP/config/database.yml
CMD
end
task :symlink, :roles => :app do
run <<-CMD
ln -nfs #{shared_path}/system/uploads #{release_path}/MY_APP/
public/uploads
CMD
end
end

after "deploy:update_code", "customs:config"
after "deploy:symlink","customs:symlink"
after "deploy", "deploy:cleanup"
after "deploy:finalize_update", "deploy:set_rails_env"

khagimoto

unread,
Jul 27, 2010, 12:40:54 PM7/27/10
to Ruby on Rails: Talk
oops..
Replace this one line in the previous post I made to:

set :repository, "ssh://git@your_git_server:your_git_port/path/to/git/
repository"

This will get your source from your remote git server. The previous
one is assuming that you already have a copy of the git repository
locally.

David Kahn

unread,
Jul 28, 2010, 11:05:18 AM7/28/10
to rubyonra...@googlegroups.com
Hi, thanks for the script, was very useful! I found that I was missing "set :deploy_via, :copy". Got it working on the first try.

The part at the bottom on replacing the database.yml was useful too as I need to both replace this and config.rb. Really minor but found a slightly simpler way to do this (which puts the callback in the first line rather than having to place somewhere else) when I was googling around trying to understand this:

task :after_update_code do
  # link from our production/config directory to the release
  run   "ln -nfs #{deploy_to}/production/config/database.yml #{release_path}/config/database.yml"
end

VS


task :config, :roles => :app do
   run <<-CMD
     ln -nfs #{shared_path}/system/database.yml #{release_path}/MY_APP/config/database.yml
   CMD

 end

after "deploy:update_code", "customs:config"


--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To post to this group, send email to rubyonra...@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-ta...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.


khagimoto

unread,
Jul 29, 2010, 10:59:10 AM7/29/10
to Ruby on Rails: Talk
Glad that helped, and thanks for the simpler script! I'll definitely
try it on my deploy, too.
Reply all
Reply to author
Forward
0 new messages