<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <title>Capistrano - News</title>
  <id>tag:www.capify.org,2009:mephisto/news</id>
  <generator uri="http://mephistoblog.com" version="0.8.0">Mephisto Drax</generator>
  
  <link href="http://www.capify.org/news" rel="alternate" type="text/html" />
  <updated>2009-02-25T05:11:55Z</updated>
  <link rel="self" href="http://feeds.feedburner.com/capistrano" type="application/atom+xml" /><feedburner:browserFriendly></feedburner:browserFriendly><entry xml:base="http://www.capify.org/">
    <author>
      <name>Jamis</name>
    </author>
    <id>tag:www.capify.org,2009-02-25:6065</id>
    <published>2009-02-25T05:07:00Z</published>
    <updated>2009-02-25T05:11:55Z</updated>
    <category term="News" />
    <link href="http://www.capify.org/2009/2/25/farewell" rel="alternate" type="text/html" />
    <title>Farewell</title>
<content type="html">
            &lt;p&gt;Capistrano has been a fantastically fun and varied project to work on, and it’s taught me a lot. However, it’s time for me to say goodbye, and move on. You can read the full announcement &lt;a href="http://weblog.jamisbuck.org/2009/2/25/net-ssh-capistrano-and-saying-goodbye"&gt;on my blog&lt;/a&gt;, but the gist of it is that I’m no longer going to be updating or maintaining Capistrano (or related libraries). Thanks to everyone who offered their support and encouragement over the last couple of years. It’s been great!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.capify.org/">
    <author>
      <name>Jamis</name>
    </author>
    <id>tag:www.capify.org,2009-02-05:5943</id>
    <published>2009-02-05T17:56:00Z</published>
    <updated>2009-02-05T17:58:09Z</updated>
    <category term="News" />
    <link href="http://www.capify.org/2009/2/5/love-hate-survey" rel="alternate" type="text/html" />
    <title>Love/Hate Survey</title>
<content type="html">
            &lt;p&gt;In order to help guide development decisions for future versions of Capistrano, I’ve put together a small survey here:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;&lt;a href="http://www.surveymonkey.com/s.aspx?sm=MqcehUinkef0BkEhmqX5KA_3d_3d"&gt;http://www.surveymonkey.com/s.aspx?sm=MqcehUinkef0BkEhmqX5KA_3d_3d&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;It is seven questions, all optional, and all free-entry. It should only take 5-10 minutes to fill out. Thanks!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.capify.org/">
    <author>
      <name>Jamis</name>
    </author>
    <id>tag:www.capify.org,2009-02-05:5939</id>
    <published>2009-02-05T05:04:00Z</published>
    <updated>2009-02-05T05:04:54Z</updated>
    <category term="News" />
    <link href="http://www.capify.org/2009/2/5/capistrano-2-5-4" rel="alternate" type="text/html" />
    <title>Capistrano 2.5.4</title>
<content type="html">
            &lt;p&gt;Capistrano 2.5.4 is now available. If you’re installing by hand, or by a manually downloaded gem, be sure and grab net-ssh 2.0.10, too, which Capistrano 2.5.4 depends on. (If you’re installing remotely by gem, that dependency should be taken care of automatically.)&lt;/p&gt;


	&lt;p&gt;There aren’t any new features in this release, just bug fixes:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;The ‘user’ option from ~/.ssh/config is now handled better. If you set an explicit user in your deploy.rb, that user will be used. If you don’t, the user from ~/.ssh/config will be used. If there is no user setting in ~/.ssh/config, the &lt;span class="caps"&gt;USER&lt;/span&gt; environment variable will be used.&lt;/li&gt;
		&lt;li&gt;Sudo “try again” prompts should be detected more robustly now. If you experienced issues where an incorrect sudo password would cause Capistrano to (apparently) hang, chances are this release will fix that for you.&lt;/li&gt;
		&lt;li&gt;The supported environment variables are now listed at the end of the -H output.&lt;/li&gt;
		&lt;li&gt;Capistrano should play more nicely with newer rspec versions. The optional include_priv parameter to respond_to?() is supported now.&lt;/li&gt;
		&lt;li&gt;If you’re using the remote_cache strategy with rsync (you’ve specified any files or directories to exclude in the :copy_exclude array), the -t switch is now being passed to rsync, which will preserve file times.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;As ever, please report bugs to:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;&lt;a href="http://capistrano.lighthouseapp.com/projects/8716/tickets"&gt;http://capistrano.lighthouseapp.com/projects/8716/tickets&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;And feel free to fork the project and submit pull requests with your clever ideas:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;&lt;a href="http://github.com/jamis/capistrano"&gt;http://github.com/jamis/capistrano&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Enjoy!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.capify.org/">
    <author>
      <name>Jamis</name>
    </author>
    <id>tag:www.capify.org,2008-12-07:5631</id>
    <published>2008-12-07T05:07:00Z</published>
    <updated>2008-12-07T06:33:13Z</updated>
    <category term="News" />
    <category term="net-ssh" />
    <link href="http://www.capify.org/2008/12/7/net-ssh-2-0-5" rel="alternate" type="text/html" />
    <title>Net::SSH 2.0.5</title>
<content type="html">
            &lt;p&gt;A new version of Net::SSH 2.0.5 is out. Net::SSH is the library that Capistrano uses to communicate to your servers via the &lt;span class="caps"&gt;SSH2&lt;/span&gt; protocol. You can upgrade using Rubygems:&lt;/p&gt;


&lt;pre&gt;  gem install net-ssh&lt;/pre&gt;

	&lt;p&gt;This new release fixes a handful of bugs, among them:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Using &lt;span class="caps"&gt;SSH&lt;/span&gt; agent forwarding on windows via Pageant should work now. Before, you’d get errors related to “undefined method ‘close’”. These should be fixed now.&lt;/li&gt;
		&lt;li&gt;Net::SSH should be working under Ruby 1.9 now.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Net::SSH 2.0.6 is hot on the heels of 2.0.5. 2.0.5 was released without a critical file, thanks to an omission in the Manifest file. Make sure you grab 2.0.6, and not 2.0.5.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.capify.org/">
    <author>
      <name>Jamis</name>
    </author>
    <id>tag:www.capify.org,2008-12-07:5630</id>
    <published>2008-12-07T04:50:00Z</published>
    <updated>2008-12-07T04:56:21Z</updated>
    <category term="News" />
    <category term="capistrano" />
    <category term="git" />
    <link href="http://www.capify.org/2008/12/7/capistrano-2-5-3" rel="alternate" type="text/html" />
    <title>Capistrano 2.5.3</title>
<content type="html">
            &lt;p&gt;Capistrano 2.5.3 is a maintenance update. Install it via Rubygems:&lt;/p&gt;


&lt;pre&gt;  gem install capistrano&lt;/pre&gt;

	&lt;p&gt;There are no new features; only a handful of bug fixes:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;A lingering issue with git deployments has finally been laid to rest. If you’ve been getting “Unable to resolve revision” errors when deploying from a git repository, give cap 2.5.3 a try.&lt;/li&gt;
		&lt;li&gt;A bug in the get/put/upload/download helpers that caused them to ignore blocks that were passed to them has been fixed.&lt;/li&gt;
		&lt;li&gt;If a failed deploy triggered a rollback when there was no previous deployment to roll back to, deploy:symlink would explode. It is now more robust and will do nothing if there is no previous release.&lt;/li&gt;
		&lt;li&gt;Rubies that don’t inspect terminals well (i.e. JRuby) will now default screen columns to 80, instead of raising an obscure exception.&lt;/li&gt;
		&lt;li&gt;If the :previous_release variable is queried when there is no previous release, it will return nil instead of raising an exception.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;The biggie here is the fix for git deployment, but if you’ve been bitten by any of the others, you might want to give 2.5.3 a spin. Even if you haven’t, it’s better to have fixed software than broken software, right?&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.capify.org/">
    <author>
      <name>Jamis</name>
    </author>
    <id>tag:www.capify.org,2008-11-13:5439</id>
    <published>2008-11-13T18:58:00Z</published>
    <updated>2008-11-13T19:00:30Z</updated>
    <category term="News" />
    <category term="capistrano" />
    <category term="git" />
    <link href="http://www.capify.org/2008/11/13/capistrano-2-5-2" rel="alternate" type="text/html" />
    <title>Capistrano 2.5.2</title>
<content type="html">
            &lt;p&gt;It looks like one particular change to 2.5.1 didn’t see enough testing. If you were trying to deploy from git with Capistrano 2.5.1, you probably ran into this little error: “Unable to resolve revision for ‘HEAD’ on repository ’...’”. It turns out to have been due to some flags that were added to the “git ls-remote” call. I just released cap 2.5.2 which removes those extraneous flags, and deploys via git should be working again.&lt;/p&gt;


	&lt;p&gt;Nothing else changed in this release.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.capify.org/">
    <author>
      <name>Jamis</name>
    </author>
    <id>tag:www.capify.org,2008-11-07:5381</id>
    <published>2008-11-07T21:22:00Z</published>
    <updated>2008-11-07T21:22:39Z</updated>
    <category term="News" />
    <category term="capistrano" />
    <link href="http://www.capify.org/2008/11/7/capistrano-2-5-1" rel="alternate" type="text/html" />
    <title>Capistrano 2.5.1</title>
<content type="html">
            &lt;p&gt;Capistrano 2.5.1 is now available. This is release is primarily a maintenance release, but does include a few new minor features.&lt;/p&gt;


	&lt;h2&gt;Features&lt;/h2&gt;


	&lt;ul&gt;
	&lt;li&gt;The -T switch now allows you to specify a pattern, which will be used to filter the output (like Rake’s -T does).&lt;/li&gt;
		&lt;li&gt;If you want to write tools that read Capistrano’s task list, you’ll find the new -t switch useful. It causes -T to omit the task description and any trailing text.&lt;/li&gt;
		&lt;li&gt;RemoteDependency#try now uses invoke_command instead of run, so you can use sudo and friends to test commands.&lt;/li&gt;
		&lt;li&gt;A new environment variable &lt;span class="caps"&gt;HOSTFILTER&lt;/span&gt;. This works like the &lt;span class="caps"&gt;HOSTS&lt;/span&gt; environment variable, but instead of making all tasks run on the given hosts, it will only run tasks that would run on any of the given hosts.&lt;/li&gt;
		&lt;li&gt;If you are using subversion, you can set the :scm_arguments variable to specify arguments that should always be passed to subversion. (Other &lt;span class="caps"&gt;SCM&lt;/span&gt;’s have not yet been tweaked to work with the new :scm_arguments variable.)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Other Fixes&lt;/h2&gt;


	&lt;ul&gt;
	&lt;li&gt;Commands executed locally under Windows should work better now.&lt;/li&gt;
		&lt;li&gt;If :sudo_prompt is blank, sudo() will not emit the -p switch.&lt;/li&gt;
		&lt;li&gt;Symlinks are now copied when using rsync.&lt;/li&gt;
		&lt;li&gt;The git query-revision now matches on the exact branch name.&lt;/li&gt;
		&lt;li&gt;The &lt;span class="caps"&gt;SCM&lt;/span&gt;::Base#scm method is now exposed publicly.&lt;/li&gt;
		&lt;li&gt;Some locally executed commands will be logged now.&lt;/li&gt;
		&lt;li&gt;Ruby 1.9 compatibility tweaks.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Download it and give it a try! As ever, bugs may be reported via the &lt;a href="http://capistrano.lighthouseapp.com/projects/8716-capistrano/tickets"&gt;Capistrano ticketing site&lt;/a&gt;. If you’ve got a patch you’d like to submit, you can either submit it with a ticket, or via a &lt;a href="http://github.com/jamis/capistrano"&gt;GitHub pull request&lt;/a&gt;. Or, you can send me an email with your patch.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.capify.org/">
    <author>
      <name>Jamis</name>
    </author>
    <id>tag:www.capify.org,2008-09-03:4784</id>
    <published>2008-09-03T16:44:00Z</published>
    <updated>2008-09-03T16:48:02Z</updated>
    <category term="News" />
    <category term="deployment" />
    <link href="http://www.capify.org/2008/9/3/fast-remote-cache" rel="alternate" type="text/html" />
    <title>Fast Remote Cache</title>
<content type="html">
            &lt;p&gt;I just moved the deployment strategy we use at &lt;a href="http://37signals.com"&gt;37signals&lt;/a&gt; to &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt;. Feel free to grab it and try it out: &lt;a href="http://github.com/37signals/fast_remote_cache/tree/master"&gt;http://github.com/37signals/fast_remote_cache/tree/master&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;It’s basically a variation on the standard remote cache strategy, but it makes hard links to the files instead of copying them, which turns out to be much, much faster on large applications. It’s used as a Rails plugin (though it isn’t specific to Rails). The &lt;span class="caps"&gt;README&lt;/span&gt; should be sufficient to get you started with it!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.capify.org/">
    <author>
      <name>Jamis</name>
    </author>
    <id>tag:www.capify.org,2008-08-29:4738</id>
    <published>2008-08-29T03:08:00Z</published>
    <updated>2008-08-29T03:14:16Z</updated>
    <category term="News" />
    <category term="announcement" />
    <category term="release" />
    <link href="http://www.capify.org/2008/8/29/capistrano-2-5-0" rel="alternate" type="text/html" />
    <title>Capistrano 2.5.0</title>
<content type="html">
            &lt;p&gt;Capistrano 2.5 is now available, with several new additions and a fair helping of bug fixes and general improvements. To install it:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;gem install capistrano&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Here’s a rundown of what’s new:&lt;/p&gt;


	&lt;h2&gt;parallel() helper&lt;/h2&gt;


	&lt;p&gt;A common question by people learning Capistrano is “how can I tell what the current server is?” There still isn’t a good answer to this (since Capistrano executes each command against all active servers in parallel) but Cap 2.5 introduces the “parallel” helper that might just make the question moot.&lt;/p&gt;


	&lt;p&gt;An example is worth 1,000 words:&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;task &lt;span class="sy"&gt;:restart_everything&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  parallel &lt;span class="r"&gt;do&lt;/span&gt; |session|&lt;tt&gt;
&lt;/tt&gt;    session.when &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;in?(:app)&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;/path/to/restart/mongrel&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    session.when &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;in?(:web)&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;/path/to/restart/apache&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    session.when &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;in?(:db)&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;/path/to/restart/mysql&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;When you execute that hypothetical :restart_everything task, the parallel helper compares all active servers against the conditions. All matching conditions for a server indicate which command(s) will be run against that server, and then all those commands (for all matching servers) are run in parallel. (In this case, the mongrels would be restarted on the app servers at the same that apache is being restarted on the web servers, and mysql is being restarted on the db servers.)&lt;/p&gt;


	&lt;p&gt;The only way to do something similar before 2.5 was to invoke 3 separate run commands, which would run the commands serially, instead of in parallel.&lt;/p&gt;


	&lt;p&gt;You can pass callback blocks to each condition, as well, to handle output specially for each case:&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;session.when &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;in?(:app)&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;/path/to/restart/mongrel&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt; |channel, stream, data|&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="c"&gt;# same format of callback as you would give to run() or sudo()&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;You can also specify a fallback condition, to be used when a server fails to match any of the conditions:&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;session.else &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;/execute/something/else&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;Lastly, the string specifying the condition must evaluate to valid Ruby code. Inside it, you can access the in?() helper (to query whether the current server is included in the given role), as well as a “server” variable that you can use to match specific hosts by name:&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;session.when &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;server.host =~ /app/&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;/command/to/execute&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;This should allow some exciting new usage patterns to emerge. Please share what you come up with!&lt;/p&gt;


	&lt;h2&gt;Chained gateways&lt;/h2&gt;


	&lt;p&gt;Prior to 2.5, Capistrano was not easily able to accomodate servers that needed to be accessed via two or more gateway machines. In 2.5, the gateway variable can now be an array of hostnames, and the gateway will tunnel through all of them:&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;set &lt;span class="sy"&gt;:gateway&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;%w(&lt;/span&gt;&lt;span class="k"&gt;jamis@gateway.host deeper.host final.host&lt;/span&gt;&lt;span class="dl"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;In that example, each server would be connected to via a triply-chained gateway, tunneling from the local server to the final host via gateway.host (using “jamis” as the username), then deeper.host, and then final.host.&lt;/p&gt;


	&lt;h2&gt;“-s” and “-S” infer the types of their arguments&lt;/h2&gt;


	&lt;p&gt;When you set a variable from the command-line (using -s or -S), the type of the value will now be inferred. This allows you to set booleans, integers, floating point values, and nil values from the command-line, as well as strings (the fallback if a type cannot be inferred).&lt;/p&gt;


	&lt;h2&gt;deploy:rollback and mongrel&lt;/h2&gt;


	&lt;p&gt;Prior to 2.5, deploy:rollback would fail with mongrel processes that were spawned via Rails’ script/process/spawner tool. This was because the mongrel processes were restarted after the bad revision was removed, resulting in mongrel dying because it’s current working directory was invalid.&lt;/p&gt;


	&lt;p&gt;In 2.5, the bad revision is not actually removed until after the restart happens.&lt;/p&gt;


	&lt;h2&gt;Dry-run mode&lt;/h2&gt;


	&lt;p&gt;Prior to 2.5 you could use the "-d" (--debug) switch to step through your recipes. In 2.5, this is expanded with the "-n" (--dry-run) switch, which will run the tasks straight through, but will not actually invoke any of the (remote) commands. (Local commands are still executed.)&lt;/p&gt;


	&lt;h2&gt;Other changes and bug fixes&lt;/h2&gt;


	&lt;p&gt;From the change-log:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Allow &lt;span class="caps"&gt;HOSTS&lt;/span&gt; spec to override even non-existent roles&lt;/li&gt;
		&lt;li&gt;Sort releases via “ls -xt” instead of “ls -x” to allow for custom release names&lt;/li&gt;
		&lt;li&gt;Add descriptions of -n and -d to the verbose help text&lt;/li&gt;
		&lt;li&gt;Rename deploy:rollback_code to deploy:rollback:code&lt;/li&gt;
		&lt;li&gt;Make sure a task only uses the last on_rollback block, once, on rollback&lt;/li&gt;
		&lt;li&gt;Add :shared_children variable to customize which subdirectories are created by deploy:setup&lt;/li&gt;
		&lt;li&gt;Allow filename globbing in copy_exclude setting for the copy strategy&lt;/li&gt;
		&lt;li&gt;Allow remote_cache strategy to use copy_exclude settings (requires rsync)&lt;/li&gt;
		&lt;li&gt;Make None &lt;span class="caps"&gt;SCM&lt;/span&gt; module work in Windows&lt;/li&gt;
		&lt;li&gt;Recognize mingw as a Windows platform&lt;/li&gt;
		&lt;li&gt;Fixed failing tests in Windows&lt;/li&gt;
		&lt;li&gt;Made :scm_auth_cache control whether password option is emitted in subversion module&lt;/li&gt;
		&lt;li&gt;Fixed timestamp bug in &lt;span class="caps"&gt;CVS&lt;/span&gt; module&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Feedback&lt;/h2&gt;


	&lt;p&gt;As ever, please report bugs via the &lt;a href="http://capistrano.lighthouseapp.com/projects/8716-capistrano/overview"&gt;Capistrano issue tracker&lt;/a&gt;. If you’d like to submit a patch, please make sure it applies cleanly on the &lt;a href="http://github.com/jamis/capistrano/tree/master"&gt;latest version of the source code&lt;/a&gt;, and submit it either via the issue tracker above, via email, or via GitHub pull request.&lt;/p&gt;


	&lt;p&gt;Lastly, the &lt;a href="http://groups.google.com/group/capistrano"&gt;Capistrano mailing list&lt;/a&gt; is a great place to ask and answer questions, and to swap tips and tricks. There is also an &lt;span class="caps"&gt;IRC&lt;/span&gt; channel you can use: #capistrano on irc.freenode.net. (The &lt;span class="caps"&gt;IRC&lt;/span&gt; channel requires a bit of patience, since your question might not be noticed right away.)&lt;/p&gt;


	&lt;p&gt;Thanks!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.capify.org/">
    <author>
      <name>Jamis</name>
    </author>
    <id>tag:www.capify.org,2008-08-27:4735</id>
    <published>2008-08-27T22:21:00Z</published>
    <updated>2008-08-27T22:27:08Z</updated>
    <category term="News" />
    <category term="documentation" />
    <link href="http://www.capify.org/2008/8/27/capistrano-from-the-beginning" rel="alternate" type="text/html" />
    <title>Capistrano: From the Beginning</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://capify.org/getting-started/from-the-beginning"&gt;Capistrano: From the Beginning&lt;/a&gt; is the first in what (I hope) will be a series of in-depth how-to’s for setting up and using Capistrano. This one is targeted at people who have finished their first Rails application and want to know how to deploy it. It includes some tips for choosing and setting up your environment.&lt;/p&gt;


	&lt;p&gt;Perhaps the most “revolutionary” thing about this article: it discourages the use of the deploy:cold task. In running the last two tutorial sessions, and in setting up some applications from scratch recently, I’ve discovered that deploy:cold is, essentially, worthless for launching a new application. The reality is that there is not a single command that can magically configure and deploy your application for the first time. This article attempts to hold your hand as you walk you through the (many) steps that are required. And, ultimately, Capistrano does prove helpful, even in this tedious task.&lt;/p&gt;


	&lt;p&gt;By the time you’ve reached the end of the article, you should be able to “cap deploy” your application, though, which is really the whole point of Capistrano when used with Rails deployment!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.capify.org/">
    <author>
      <name>Jamis</name>
    </author>
    <id>tag:www.capify.org,2008-08-26:4716</id>
    <published>2008-08-26T15:48:00Z</published>
    <updated>2008-08-26T15:52:22Z</updated>
    <category term="News" />
    <link href="http://www.capify.org/2008/8/26/capistrano-1-4-2-mandatory-upgrade-for-capistrano-1-4-1" rel="alternate" type="text/html" />
    <title>Capistrano 1.4.2: Mandatory Upgrade for Capistrano 1.4.1</title>
<content type="html">
            &lt;p&gt;If you are currently using Capistrano 1.4.1, you are strongly urged to upgrade to Capistrano 1.4.2. This upgrade adds no new features, and is entirely compatible with Capistrano 1.4.1. All it does is make Capistrano play nice if Net::SSH 2.x is installed.&lt;/p&gt;


	&lt;p&gt;This is absolutely necessary if you wan to have Capistrano 2.3 or later installed alongside Capistrano 1.4.x, because Capistrano 2.3 and later depend on Net::SSH 2.x. Even if you are not currently using Net:SSH 2.x or Capistrano 2.3 or later, it is strongly recommended that you upgrade, because eventually you might want to have one or the other of those installed, and doing so with cap 1.4.1 will result in some really obscure errors.&lt;/p&gt;


	&lt;p&gt;Save yourself some time troubleshooting: upgrade today!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.capify.org/">
    <author>
      <name>Jamis</name>
    </author>
    <id>tag:www.capify.org,2008-08-04:4659</id>
    <published>2008-08-04T13:30:00Z</published>
    <updated>2008-08-04T16:29:46Z</updated>
    <category term="News" />
    <category term="capistrano" />
    <category term="tutorial" />
    <link href="http://www.capify.org/2008/8/4/online-capistrano-tutorial-session-2" rel="alternate" type="text/html" />
    <title>Online Capistrano Tutorial Session #2</title>
<content type="html">
            &lt;p&gt;The first online Capistrano tutorial session was very successful, thanks to everyone who participated. Now, it’s time to try again!&lt;/p&gt;


	&lt;p&gt;The second online Capistrano tutorial session is now open for registration: &lt;a href="http://events.capify.org/events/2"&gt;http://events.capify.org/events/2&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;It is scheduled for Wednesday, August 13th, at 7pm (Mountain time), and will last two hours (plus up to an hour at the end for Q&amp;A). As before, this tutorial is targeted at &lt;em&gt;beginning&lt;/em&gt; Capistrano users, those will little or no prior experience. (If you’re looking for a session for more advanced users, keep watching this space—I’ll probably do one of those eventually, as soon as I can write a curriculum for it.)&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.capify.org/">
    <author>
      <name>Jamis</name>
    </author>
    <id>tag:www.capify.org,2008-07-14:4637</id>
    <published>2008-07-14T22:31:00Z</published>
    <updated>2008-07-14T22:31:26Z</updated>
    <category term="News" />
    <category term="multistage" />
    <category term="pattern" />
    <link href="http://www.capify.org/2008/7/14/pattern-conditional-configuration" rel="alternate" type="text/html" />
    <title>Pattern: Conditional Configuration</title>
<content type="html">
            &lt;p&gt;Here’s a pattern that I’ve been using and seeing more and more often. The problem it solves is this: how do I configure Capistrano differently for some set of predetermined scenarios? The most common usage of it is when configuring Capistrano to &lt;a href="http://weblog.jamisbuck.org/2007/7/23/capistrano-multistage"&gt;deploy to different staging locations&lt;/a&gt;, and you want to configure each stage differently.&lt;/p&gt;


	&lt;p&gt;The cleanest solution simply involves creating a different task for each scenario. Within each task, you set variables, declare roles, and load files:&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;task &lt;span class="sy"&gt;:scenario_a&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  set &lt;span class="sy"&gt;:deploy_to&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;/path/to/scenario_a&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  role &lt;span class="sy"&gt;:web&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;scenario_a.web&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  role &lt;span class="sy"&gt;:app&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;scenario_a.app&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;task &lt;span class="sy"&gt;:scenario_b&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  set &lt;span class="sy"&gt;:deploy_to&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;/path/to/scenario_b&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  role &lt;span class="sy"&gt;:web&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;scenario_b.web&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  role &lt;span class="sy"&gt;:app&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;scenario_b.app&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;When you then go to invoke a task (like &lt;code&gt;deploy&lt;/code&gt;), you simply invoke the scenario task you want first:&lt;/p&gt;


&lt;pre&gt;  $ cap scenario_a deploy&lt;/pre&gt;

	&lt;p&gt;Capistrano simply invokes the task in the same order they were specified, so in this case, it will first call &lt;code&gt;scenario_a&lt;/code&gt; (which will set up the deploy_to variable and the roles) and then will call &lt;code&gt;deploy&lt;/code&gt;, which will use the settings you gave.&lt;/p&gt;


	&lt;p&gt;It’s really a quite powerful pattern for conditional configuration.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.capify.org/">
    <author>
      <name>Tyler</name>
    </author>
    <id>tag:www.capify.org,2008-07-10:4619</id>
    <published>2008-07-10T15:10:00Z</published>
    <updated>2008-07-10T15:11:31Z</updated>
    <category term="News" />
    <link href="http://www.capify.org/2008/7/10/capistrano-links-on-del-icio-us" rel="alternate" type="text/html" />
    <title>Capistrano Links on del.icio.us</title>
<content type="html">
            &lt;h2&gt;Call for links!&lt;/h2&gt;

&lt;p&gt;We want to centralize the wide breadth of knowledge that has spread accross the World Wide Web into one, easy to bookmark location:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://del.icio.us/capistrano_links/"&gt;del.icio.us/capistrano_links/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Have you written about Capistrano?&lt;/h2&gt;

&lt;p&gt;If you have, please send us a link (or links for that matter) to &lt;a href="mailto:capistrano_links@filmprog.com"&gt;capistrano_links@filmprog.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We will then summarize your content in the notes field for easy reading and searching.  You'll now have one place to go for the all the content available on the web concerning Capistrano.&lt;/p&gt;

&lt;h2&gt;But what if I have old information?&lt;/h2&gt;

&lt;p&gt;That's great!  Because sometimes there are people out there who, for various reasons, are not able to upgrade to the latest version of cap.  Just let us know what version (approximations are fine) of Capistrano you wrote the article for.  And it will get &lt;a href="http://www.filmprog.com/2008/07/10/deliciouscapistrano_links-folksonomy/"&gt;tagged accordingly&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Were all in this together&lt;/h2&gt;

&lt;p&gt;The faster you send us your link the better the account will be!  Don't wait, send your link now!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.capify.org/">
    <author>
      <name>Jamis</name>
    </author>
    <id>tag:www.capify.org,2008-07-06:4610</id>
    <published>2008-07-06T03:50:00Z</published>
    <updated>2008-07-09T04:14:40Z</updated>
    <category term="News" />
    <category term="event" />
    <category term="tutorial" />
    <link href="http://www.capify.org/2008/7/6/online-capistrano-tutorial-session" rel="alternate" type="text/html" />
    <title>Online Capistrano Tutorial Session</title>
<content type="html">
            &lt;p&gt;
&lt;strong&gt;When&lt;/strong&gt;: Tuesday, July 15, 2008, at 7:00 PM MDT (&lt;a href="http://www.timeanddate.com/worldclock/fixedtime.html?month=07&amp;amp;day=15&amp;amp;year=2008&amp;amp;hour=19&amp;amp;min=00&amp;amp;sec=00&amp;amp;p1=75"&gt;what's this is my own time zone?&lt;/a&gt;)&lt;br /&gt;
&lt;strong&gt;Where&lt;/strong&gt;: Online, via &lt;a href="http://www.campfirenow.com"&gt;Campfire&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Duration&lt;/strong&gt;: 2 hours&lt;br /&gt;
&lt;strong&gt;Seats&lt;/strong&gt;: 10&lt;br /&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: $10&lt;br /&gt;
&lt;strong&gt;Sponsors&lt;/strong&gt;: &lt;a href="http://www.slicehost.com"&gt;SliceHost&lt;/a&gt; &amp;mdash; awesome VPS hosting!
&lt;/p&gt;

&lt;p&gt;To register, go here: &lt;a href="http://events.capify.org/events/1"&gt;http://events.capify.org/events/1&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This tutorial will focus on using &lt;a href="http://www.capify.org"&gt;Capistrano&lt;/a&gt; to deploy a Rails application from a Subversion repository. It will be targeted at beginners (so if you already have experience with Capistrano, you might not find much value here). Attendees will be given temporary shell access to a server, and a simple Rails application will be provided. During the course of the tutorial, attendees will configure and deploy the Rails application.&lt;/p&gt;

&lt;p&gt;If there is sufficient interest, and this format of presentation works well enough, I may offer subsequent sessions on more advanced topics, including (but not limited to) deployment using Git, non-Rails deployment, and non-deployment uses of Capistrano.&lt;/p&gt;

&lt;h2&gt;What version(s) of Capistrano will be covered?&lt;/h2&gt;

&lt;p&gt;This tutorial will only cover the most recent version of Capistrano (2.4.3, as of this writing). You do not need to have it preinstalled, as the tutorial will include instruction on installation if needed.&lt;/p&gt;

&lt;p&gt;Older versions of Capistrano will not be covered, but if you have specific questions about an older version of Capistrano, you may ask them during the course of the tutorial.&lt;/p&gt;

&lt;h2&gt;Why Campfire (instead of e.g. IRC)?&lt;/h2&gt;

&lt;p&gt;For one thing, &lt;a href="http://campfirenow.com"&gt;Campfire&lt;/a&gt; lets you easily paste images and code into the stream of the chat. This lets people follow along without having to jump to external links, potentially losing the context and the flow of the tutorial.&lt;/p&gt;

&lt;p&gt;For another thing, Campfire provides transcripts. This means that I can easily email attendees a transcript of the session when the session is finished. (If things go well, and if there is enough interest, I may even offer the transcript for sale later, for a few dollars, to people who were unable to attend.)&lt;/p&gt;

&lt;p&gt;If the session were very large (40, 50, or more people) Campfire might not be as good a fit for what I have in mind. But for a group of 10, it’s just about perfect.&lt;/p&gt;


&lt;h2&gt;Why only 10 people?&lt;/h2&gt;

&lt;p&gt;This session is just an experiment, to see how well this venue can work for teaching people how to use Capistrano. If it works well, I may experiment with larger groups later. For now, though, ten seems about right for a tutorial session. More than that and I think it would get difficult to give each attendee sufficient attention. I fully intend for these to be hands-on opportunities, where attendees will actually follow along and deploy an application.&lt;/p&gt;


&lt;h2&gt;Why $10, instead of free, or $100?&lt;/h2&gt;

&lt;p&gt;As mentioned above, this is just an experiment, not a money-making opportunity (yet!). If there is sufficient demand, subsequent sessions may cost more. The $10/seat is mostly just minimal compensation for the time I'm putting into organizing the session and creating the curriculum.&lt;/p&gt;

&lt;p&gt;Also, if this initial experiment were free, the danger would be people signing up without commitment. By requiring people to pay for the privilege of attending, they are more likely to show up, and less likely to be frivolous or merely casually interested.&lt;/p&gt;


&lt;h2&gt;Why Subversion instead of Git, or CVS, etc.?&lt;/h2&gt;

&lt;p&gt;Because most Rails devs are still using Subversion. Besides which, once you can deploy from subversion, switching SCM’s isn’t that much of a jump. If there’s enough interest, I may offer another session sometime on Git-based deployment.&lt;/p&gt;


&lt;h2&gt;What should I expect if I sign up?&lt;/h2&gt;


&lt;p&gt;Once you &lt;a href="http://events.capify.org/events/1"&gt;sign up&lt;/a&gt; and your payment is received, you’ll receive an email with (among other things) a URL to a web page. This web page will initially just have the tutorial’s date and time on it, along with a list of software you should already have installed and configured on your server before the tutorial begins (including Ruby, Subversion, etc.).&lt;/p&gt;

&lt;p&gt;A couple of hours before the session starts it will be updated with a URL to the Campfire room, as well as your login credentials to the server, and the location of the Subversion repository hosting the Rails application.&lt;/p&gt;

&lt;p&gt;You may sign into the Campfire room any time after the URL is available. The session will start at the indicated time, with a few minutes spent on introductions and waiting for stragglers. The tutorial will then begin and will run for approximately two hours.&lt;/p&gt;

&lt;p&gt;Once the tutorial ends, your access to the Campfire chat room and the tutorial server will be terminated. A transcript of the tutorial will be emailed to you.&lt;/p&gt;

&lt;p&gt;For people who were unable to attend, the transcript may be made available for a small fee (probably just a few dollars for this first tutorial).&lt;/p&gt;


&lt;h2&gt;Tentative outline&lt;/h2&gt;

&lt;p&gt;The following outline is tentative and is subject to change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installing Capistrano&lt;/li&gt;
&lt;li&gt;Configuring Capistrano for your Rails project&lt;/li&gt;
&lt;li&gt;cap deploy:check&lt;/li&gt;
&lt;li&gt;cap deploy:setup&lt;/li&gt;
&lt;li&gt;cap deploy:cold&lt;/li&gt;
&lt;li&gt;cap deploy&lt;/li&gt;
&lt;li&gt;cap deploy:rollback&lt;/li&gt;
&lt;li&gt;cap deploy:cleanup&lt;/li&gt;
&lt;li&gt;cap deploy:migrations&lt;/li&gt;
&lt;li&gt;Overriding tasks&lt;/li&gt;
&lt;li&gt;Extending tasks&lt;/li&gt;
&lt;li&gt;Customizing deployment&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Register!&lt;/h2&gt;

&lt;p&gt;Sound good? Then &lt;a href="http://events.capify.org/events/1"&gt;sign up&lt;/a&gt;!&lt;/p&gt;
          </content>  </entry>
</feed>
