Unique Capistrano Deployment

I know, everyone’s Capistrano deployment is unique, however, mine may
be like one I have never seen before.

  1. The app is contained on 1 server. I do not have multiple servers.
  2. The app is actually deployed twice into two different directories.

Now, #2 is causing me my problems. I can handle the database.yml,
environment.rb, etc… just fine. The reason I need to deploy the
application into two different locations is one application is our
production server, the other application is a training environment.
Obviously they have different database backends.

Anyone have an idea on how to accomplish this task?

Jeremy

Just saw something cool on jamis’ blog, for handling this, credit goes
to
Ben B.:

nukehttp://jamis.jamisbuck.org/articles/2006/08/30/the-future-of-capistrano#
edithttp://jamis.jamisbuck.org/admin/comments/article/7791/edit/7795
Ben B. http://blog.bleything.net/ said about 3 hours
later:

Another (and IMHO, better) option for staging is to simply create new
tasks that changes whatever you need to change and then calls the
deploy
action:

task :stage, :roles => [:app, :db, :web] do
set :deploy_to, “/var/www/staging”

 deploy

end

It’s not as flexible as the env var method, but it’s hard to argue
with cap stage :slight_smile:

See:

http://jamis.jamisbuck.org/articles/2006/08/30/the-future-of-capistrano#comments

So, I imagine you could have a normal deploy task but named something
different,

do your normal deploy stuff
and then set the new :deploy_to dir, and call deploy again.

cheers! good luck

On 8/31/06, Jeremy C. [email protected] wrote:

application into two different locations is one application is our
production server, the other application is a training environment.
Obviously they have different database backends.

Anyone have an idea on how to accomplish this task?

Jeremy


Charles Brian Q.
self-promotion: www.seebq.com
highgroove studios: www.highgroove.com
slingshot rails hosting: www.slingshothosting.com

On Thu, Aug 31, 2006, Jeremy C. wrote:

  1. The app is actually deployed twice into two different directories.

I have a similar situation where I have a staging environment and a
production environment on the same server in different directories. The
way I got around it was to write a couple of wrapper tasks that change
deploy_to and then call the deployment task:

task :stage, :roles => [:app, :db, :web] do
set :deploy_to, “/var/www/staging”

deploy
end

Of course, you could do both at the same time:

task :mydeploy, :roles => [:app, :db, :web] do
set :deploy_to, “/var/www/staging”
deploy

set :deploy_to, “/var/www/production”
deploy
end

Hope that helps!

Ben

On Aug 31, 2006, at 2:29 PM, Ben B. wrote:

Set up another environment in your app… add a new section to your
database.yml, copy your production.rb in config/environments, etc for
your training environment.

desc “Set training environment”
task : training do
role :app, “app server” # possibly the same as production
role :web, “web server” # ditto
set :rails_env, :training
set :deploy_to, “/opt/rails/#{application}/training”
end

desc “Set production environment”
task :production do
role :app, “app1.whatever.com”, “app1.whatever.com
role :web, “web1.whatever.com”, web2.whatever.com
set :rails_env, :production
set :deploy_to, “/opt/rails/#{application}/production”
end

Now:

$ cap production deploy
$ cap training deploy

$ cap <production/training>

Etc.


Chris W.

On Thu, Aug 31, 2006, Jeremy C. wrote:

  1. The app is contained on 1 server. I do not have multiple servers.
  2. The app is actually deployed twice into two different directories.

Another option just occurred to me, that (if possible) is probably a
much cleaner solution.

Set up another environment in your app… add a new section to your
database.yml, copy your production.rb in config/environments, etc for
your training environment.

Then, set up your webserver to fire up two instances of the same
codebase, one in the training environment and one in production.

I can’t think of any reason why this wouldn’t work, but I also haven’t
tried it, so grain of salt and all that.

Ben

On Thu, Aug 31, 2006, Chris W. wrote:

$ cap production deploy
$ cap training deploy

$ cap <production/training>

Ahh, I see the difference now. I didn’t know you could chain tasks like
that. Very nice!

Ben

On Thu, Aug 31, 2006, Chris W. wrote:

role :app, “app1.whatever.com”, “app1.whatever.com
role :web, “web1.whatever.com”, web2.whatever.com
set :rails_env, :production
set :deploy_to, “/opt/rails/#{application}/production”
end

Isn’t that what I said in my first email? :slight_smile:

I was trying to come up with a way to not require one’s code to be in
two places at once.

Ben