Capistrano - override default, get/copy source from local

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, “[email protected]: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

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”

oops…
Replace this one line in the previous post I made to:

set :repository, “ssh://[email protected]_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.

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”

Glad that helped, and thanks for the simpler script! I’ll definitely
try it on my deploy, too.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs