<?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>Wolfmans Howlings: Capistrano deploy from local repository</title>
    <link>http://blog.wolfman.com/articles/2006/05/26/capistrano-local-deploy-recipe</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>A programmers Blog about Ruby, Rails and a few other issues</description>
    <item>
      <title>Capistrano deploy from local repository</title>
      <description>&lt;p&gt;&lt;em&gt;UPDATE&lt;/em&gt; 2006-12-06 I have replaced this with a full blown SCM module that works much better, see &lt;a href="http://blog.wolfman.com/articles/2006/12/06/a-capistrano-scm-module-for-local-svn-access"&gt;this posting&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It seems that many people are in the same position as I was, they want
to deploy to a remote server farm that does not have access to the
SCCM (subversion,CVS,perforce etc), which is usually behind a corporate firewall.&lt;/p&gt;

&lt;p&gt;The following recipe overcomes this by checking out the source code
from the local repository (using svn in this case) and goes into your
deploy.rb.&lt;/p&gt;

&lt;p&gt;What it does is checkout the latest copy of the application from your
local subversion repository, tars it up, and copies the tar file to
the remote server, then detars it and does the normal deploy tasks
from then on.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;desc &amp;lt;&amp;lt;DESC
Update all servers with the latest release of the source code.
This is a modified version that copies a local copy to the remote site
DESC

task :update_code, :roles =&amp;gt; [:app, :db, :web] do
    on_rollback { delete release_path, :recursive =&amp;gt; true }

    #puts "doing my update_code"
    temp_dest= "tmp_code"

    #puts "...get a local copy of the code into #{temp_dest} from local svn"
    # but this could also just be your local development folder
    system("svn export -q #{configuration.repository} #{temp_dest}")

    #puts "...tar the folder"
    # you could exclude files here that you don't want on your production server
    system("tar -C #{temp_dest} -c -z -f code_update.tar.gz .")

    #puts "...Sending tar file to remote server"
    put(File.read("code_update.tar.gz"), "code_update.tar.gz")

    #puts "...detar code on server"
    run &amp;lt;&amp;lt;-CMD
        mkdir -p #{release_path} &amp;amp;&amp;amp;
        tar -C #{release_path} -x -z -f code_update.tar.gz &amp;amp;&amp;amp;
        rm -rf code_update.tar.gz &amp;amp;&amp;amp;
        rm -rf #{release_path}/log #{release_path}/public/system &amp;amp;&amp;amp;
        ln -nfs #{shared_path}/log #{release_path}/log &amp;amp;&amp;amp;
        ln -nfs #{shared_path}/system #{release_path}/public/system
    CMD

    #puts "...cleanup"
    system("rm -rf #{temp_dest} code_update.tar.gz")
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This recipe does what many people need todo which is replace the database.yml with the production version, and also repalces the .htaccess with the production version (YMMV)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;desc "fix up database and .htaccess"
task :after_update_code do
  run "cp #{release_path}/config/database.yml.templ #{release_path}/config/database.yml"
  run "cp #{release_path}/public/dot.htaccess.deploy #{release_path}/public/.htaccess"
end
&lt;/code&gt;&lt;/pre&gt;</description>
      <pubDate>Fri, 26 May 2006 17:08:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:a34dca64fd0c31ef826145563d45bd57</guid>
      <author>Jim Morris</author>
      <link>http://blog.wolfman.com/articles/2006/05/26/capistrano-local-deploy-recipe</link>
      <category>Rails</category>
      <category>Ruby</category>
      <category>ruby</category>
      <category>rails</category>
      <category>capistrano</category>
      <category>deployment</category>
      <trackback:ping>http://blog.wolfman.com/articles/trackback/3</trackback:ping>
    </item>
  </channel>
</rss>
