<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Wood for the Trees: Capistrano 2.0, upgrading &amp; fitting into a size 0 dress</title>
    <link>http://www.mathewabonyi.com/articles/2007/07/27/capistrano-20-first-impressions-upgrading-from-141</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>struggling to dig life</description>
    <item>
      <title>Capistrano 2.0, upgrading &amp;amp; fitting into a size 0 dress</title>
      <description>&lt;p&gt;The improvements to Capistrano are much welcomed. My deployment recipe is now half the length it used to be and it is much easier to follow what is happening for my many types of deployment. I love the new features added, mostly dealing with manipulating scopes and enhancing the user&amp;#8217;s ability to extend the core framework.&lt;/p&gt;


	&lt;h3&gt;Review of new features&lt;/h3&gt;


	&lt;p&gt;&lt;strong&gt;namespaces&lt;/strong&gt;: Like Rake, you can namespace your tasks and group them together more sensibly. This feature alone is worth upgrading for just to make your scripts more sensible and easier to read.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;events&lt;/strong&gt;: Like Rails, you can now perform tasks &lt;ins&gt;before&lt;/ins&gt; or &lt;ins&gt;after&lt;/ins&gt; other ones rather than using the hacky &amp;#8216;before_something&amp;#8217; and &amp;#8216;after_something&amp;#8217;. Much cleaner and much faster too.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;strategies&lt;/strong&gt;: In addition to checkout, you can now deploy via &lt;ins&gt;export&lt;/ins&gt; and &lt;ins&gt;copy&lt;/ins&gt; and use different strategies for deployment, such as using export for your &lt;ins&gt;copy_strategy&lt;/ins&gt; rather than zips and tarballs.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;scoping&lt;/strong&gt;: All sorts of scoping has been introduced in Capistrano 2.0, from namespacing to single execution of &amp;#8220;run&amp;#8221; and &amp;#8220;sudo&amp;#8221;, allowing you to define specific roles or hosts in which your commands run.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;help&lt;/strong&gt;: Capistrano 2.0 now has a more verbose way of explaining tasks with &lt;ins&gt;cap -e task_name&lt;/ins&gt;. You&amp;#8217;ll realise how useful this is when you use it for the built-ins as well as your own.&lt;/p&gt;


	&lt;p&gt;All in all, Capistrano is pretty simple, but it is the way it is written that makes it appear so much simpler than it really is. Capistrano 2.0 takes that to a new level, not groundbreaking perhaps, but definitely a lot cleaner than its previous releases.&lt;/p&gt;


	&lt;h3&gt;Upgrading from 1.4.1&lt;/h3&gt;


	&lt;p&gt;&lt;strong&gt;There is no need to change config/deploy.rb out of the box.&lt;/strong&gt; Capistrano 2.0 is nicely backwards compatible, unlike other things out there, and, at least for me, nothing broke because of the upgrade.&lt;/p&gt;


	&lt;p&gt;You can look at &lt;a href="http://capify.org/upgrade"&gt;Capistrano&amp;#8217;s instructions for upgrading&lt;/a&gt;, if you want to know what is being done, but for the impatient, here are the steps you have to follow before we can start drying up your deploy script.&lt;/p&gt;


1. Install the new version of capistrano: 
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;sudo&lt;/span&gt; &lt;span class="ident"&gt;gem&lt;/span&gt; &lt;span class="ident"&gt;install&lt;/span&gt; &lt;span class="ident"&gt;capistrano&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

2. cd project_root &amp;#38; run capify
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_shell "&gt;~# cd projroot
projroot# capify .&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

3. Upgrade previous deployments to use the new revision tracking system
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_shell "&gt;projroot# cap -f upgrade -f Capfile upgrade:revisions&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;4. Rinse and repeat for each of your deployment targets&lt;/p&gt;


	&lt;h3&gt;Getting your deploy.rb into its new size 0 dress&lt;/h3&gt;


	&lt;p&gt;You may now have the very understandable urge to slim down your deployment recipes. With the introduction of Capistrano 2.0, I found my deploy.rb reduced to less than half the size. Below, I cover the areas which you should focus on to get that deploy script into its new size 0 dress.&lt;/p&gt;


	&lt;h4&gt;Anatomy of my deploy.rb&lt;/h4&gt;


	&lt;ol&gt;
	&lt;li&gt;requires: capistrano-ext, mongrel_cluster, etc.&lt;/li&gt;
		&lt;li&gt;global, stage and custom variables&lt;/li&gt;
		&lt;li&gt;event chains&lt;/li&gt;
		&lt;li&gt;rewriting built-ins: web:disable and web:enable&lt;/li&gt;
		&lt;li&gt;extra tasks: fixing permissions, copying mongrel confs, etc.&lt;/li&gt;
		&lt;li&gt;custom deploy tasks: long, normal, quick&lt;/li&gt;
		&lt;li&gt;maintenance tasks: backup, restore&lt;/li&gt;
	&lt;/ol&gt;


	&lt;h4&gt;Variables&lt;/h4&gt;


	&lt;p&gt;More than before, variables are the lynch-pin of slimming everything down. The first thing you should do is look over every task rewrite or custom task and see how it can be turned into a simple &lt;ins&gt;set :var, true/false/whatever&lt;/ins&gt;. Capistrano 2.0 will make it very easy to do this.&lt;/p&gt;


	&lt;p&gt;With Capistrano 2.0, you should use the &lt;ins&gt;set&lt;/ins&gt; command religiously, both for built-in and custom tasks.&lt;/p&gt;


	&lt;p&gt;I personally set the following at the top of my recipe.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Global variables: &lt;ins&gt;stages&lt;/ins&gt;, &lt;ins&gt;deploy_via&lt;/ins&gt;&lt;/li&gt;
		&lt;li&gt;Application specific: &lt;ins&gt;application&lt;/ins&gt;, &lt;ins&gt;repository&lt;/ins&gt;, &lt;ins&gt;user&lt;/ins&gt;, &lt;ins&gt;scm_username&lt;/ins&gt;&lt;/li&gt;
		&lt;li&gt;Deployment specific: &lt;ins&gt;deploy_to&lt;/ins&gt;, &lt;ins&gt;rails_env&lt;/ins&gt;&lt;/li&gt;
		&lt;li&gt;Custom variables: &lt;ins&gt;serving_via&lt;/ins&gt;, &lt;ins&gt;suexec&lt;/ins&gt;, &lt;ins&gt;suexec_user&lt;/ins&gt;, &lt;ins&gt;suexec_group&lt;/ins&gt;, &lt;ins&gt;disable_template&lt;/ins&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h4&gt;Deployment Strategy&lt;/h4&gt;


	&lt;p&gt;I would personally suggest using &lt;ins cite="e"&gt;xport&lt;/ins&gt; for your &lt;ins&gt;deploy_via&lt;/ins&gt; strategy unless you have a reason for using &lt;ins cite="c"&gt;heckout&lt;/ins&gt; or &lt;ins&gt;copy&lt;/ins&gt;.&lt;/p&gt;


	&lt;h4&gt;Using Namespaces&lt;/h4&gt;


	&lt;p&gt;Namespaces make it dead simple to group common tasks, like different restart methodologies. I use a &lt;ins&gt;serving_via&lt;/ins&gt; variable which translates into the reload:whatever task to run for restarting the application. For example:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;namespace&lt;/span&gt; &lt;span class="symbol"&gt;:reload&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;desc&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Default reloading procedure&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="symbol"&gt;:default&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="ident"&gt;mongrels&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="ident"&gt;desc&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Reload an FCGI application&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="symbol"&gt;:fcgi&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:roles&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:app&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="ident"&gt;sudo&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{current_path}&lt;/span&gt;/script/process/reaper -a graceful -d &lt;span class="expr"&gt;#{current_path}&lt;/span&gt;/public/dispatch.fcgi&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="ident"&gt;desc&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Reload an LSAPI application&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="symbol"&gt;:lsapi&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:roles&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:app&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="ident"&gt;sudo&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/usr/local/litespeed/bin/lswsctrl restart&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="ident"&gt;desc&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Give the mongrels a bath&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="symbol"&gt;:mongrels&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:roles&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:app&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="ident"&gt;restart_mongrel_cluster&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: I warn against using &lt;ins&gt;restart&lt;/ins&gt; as a namespace because it clashes with the built-in task and, in certain instances, results in infinite recursion.&lt;/p&gt;


	&lt;h4&gt;Maintenance Splash&lt;/h4&gt;


	&lt;p&gt;The biggest change in Capistrano you may need to worry about is the removal of &lt;ins&gt;delete&lt;/ins&gt; and &lt;ins&gt;render&lt;/ins&gt;. Don&amp;#8217;t despair, though, because creating a maintenance splash is still easy. This is my rewrite:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;desc&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Generate a maintenance.html to disable requests to the application.&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;deploy&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;web&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="symbol"&gt;:disable&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:roles&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:web&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;remote_path&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{shared_path}&lt;/span&gt;/system/maintenance.html&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;on_rollback&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="ident"&gt;run&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;rm &lt;span class="expr"&gt;#{remote_path}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
  &lt;span class="ident"&gt;template&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;read&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;disable_template&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;deadline&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;reason&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;ENV&lt;/span&gt;&lt;span class="punct"&gt;[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;UNTIL&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;],&lt;/span&gt; &lt;span class="constant"&gt;ENV&lt;/span&gt;&lt;span class="punct"&gt;[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;REASON&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;]&lt;/span&gt;
  &lt;span class="ident"&gt;maintenance&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;ERB&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;template&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;result&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;binding&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;put&lt;/span&gt; &lt;span class="ident"&gt;maintenance&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{remote_path}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:mode&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;0644&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;desc&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Re-enable the web server by deleting any maintenance file.&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;deploy&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;web&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="symbol"&gt;:enable&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:roles&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:web&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;run&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;rm &lt;span class="expr"&gt;#{shared_path}&lt;/span&gt;/system/maintenance.html&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;h4&gt;Using events&lt;/h4&gt;


	&lt;p&gt;Like the before and after filters in Rails, you can now cleanly chain together tasks. I&amp;#8217;m a sucker for one-line solutions and these are really so simple that it makes my heart bleed:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;before&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;deploy:restart&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;fix:permissions&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;before&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;deploy:migrate&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;db:backup&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;after&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;deploy:symlink&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;deploy:cleanup&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;after&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;deploy:update_code&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;deploy:web:disable&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;after&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;deploy:restart&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;deploy:web:enable&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;h4&gt;capistrano-ext &amp;#38; multistage&lt;/h4&gt;


	&lt;p&gt;I highly recommend the use of multistage. It comes with the capistrano-ext gem (which has been upgraded to Capistrano 2.0, of course).&lt;/p&gt;


	&lt;p&gt;Basically, it separates the concerns of different deployments. If, like me, you like having a few other versions of your application out there, like a staging area, a testing area for bleeding edge features, and, of course, the production site, separating these in Capistrano before 2.0 was very irritating. Multistage sorts that out very nicely.&lt;/p&gt;


	&lt;p&gt;By default, you must specify the stage you wish to deploy. This behaviour can be overridden by setting the &lt;ins&gt;default_stage&lt;/ins&gt; variable, but I like being explicit. This is what using stages looks like:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_shell "&gt;# cap production deploy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;If you don&amp;#8217;t provide &amp;#8216;production&amp;#8217;, it&amp;#8217;ll complain and abort.&lt;/p&gt;


	&lt;p&gt;Using multistage is dead easy. Put this at the top of your deploy.rb:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;  require 'capistrano/ext/multistage'
  set :stages, %w(staging production testing)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Run the task for generating your stage deploy files:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_shell "&gt;projroot# cap multistage:prepare&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;This will create a recipe file for each stage in a new config/deploy directory (exactly like Rails environments). Now, in each stage recipe, add all of your stage-specific tasks and variables. For example:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="symbol"&gt;:rails_env&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;stage&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="symbol"&gt;:application&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;staging.example.com&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="symbol"&gt;:deploy_to&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/var/www/&lt;span class="expr"&gt;#{application}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Now switching between different deployments is a breeze. Just make a new recipe file for it with the necessary variables and you&amp;#8217;re set.&lt;/p&gt;</description>
      <pubDate>Fri, 27 Jul 2007 09:02:09 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:339979fa-8efa-41cc-a69a-c16c1600e4c5</guid>
      <author>Mathew Abonyi</author>
      <link>http://www.mathewabonyi.com/articles/2007/07/27/capistrano-20-first-impressions-upgrading-from-141</link>
      <category>Capistrano</category>
      <category>Ruby</category>
      <category>Rails</category>
      <trackback:ping>http://www.mathewabonyi.com/articles/trackback/49</trackback:ping>
    </item>
    <item>
      <title>"Capistrano 2.0, upgrading &amp; fitting into a size 0 dress" by Alex</title>
      <description>&lt;p&gt;What do you have &amp;#8220;disable_template&amp;#8221; set to? Better yet, do you have your deploy.rb available to download? You can change the passwords and repo addresses. I just want to figure out how to do rewrite web:disable. I try it and it tries to render the template on my local computer.&lt;/p&gt;</description>
      <pubDate>Fri, 24 Aug 2007 03:38:27 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:528b2945-fdba-4ab4-852a-b53a783da992</guid>
      <link>http://www.mathewabonyi.com/articles/2007/07/27/capistrano-20-first-impressions-upgrading-from-141#comment-592</link>
    </item>
  </channel>
</rss>
