<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: switchtower code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Wed, 27 Aug 2008 23:48:59 GMT</pubDate>
    <description>DZone Snippets: switchtower code</description>
    <item>
      <title>deploy your rails apps on edge rails</title>
      <link>http://snippets.dzone.com/posts/show/1370</link>
      <description>lib/tasks/rails.rake&lt;br /&gt;&lt;code&gt;&lt;br /&gt;desc "Checks out rails"&lt;br /&gt;task :init do&lt;br /&gt;  ENV['SHARED_PATH']  = '../../shared' unless ENV['SHARED_PATH']&lt;br /&gt;  ENV['RAILS_PATH'] ||= File.join(ENV['SHARED_PATH'], 'rails')&lt;br /&gt; &lt;br /&gt;  checkout_path = File.join(ENV['RAILS_PATH'], 'trunk')&lt;br /&gt;  export_path   = "#{ENV['RAILS_PATH']}/rev_#{ENV['REVISION']}"&lt;br /&gt;  symlink_path  = 'vendor/rails'&lt;br /&gt;&lt;br /&gt;  # do we need to checkout the file?&lt;br /&gt;  unless File.exists?(checkout_path)&lt;br /&gt;    puts 'setting up rails trunk'    &lt;br /&gt;    get_framework_for checkout_path do |framework|&lt;br /&gt;      system "svn co http://dev.rubyonrails.org/svn/rails/trunk/#{framework}/lib #{checkout_path}/#{framework}/lib --quiet"&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  # do we need to export the revision?&lt;br /&gt;  unless File.exists?(export_path)&lt;br /&gt;    puts "setting up rails rev #{ENV['REVISION']}"&lt;br /&gt;    get_framework_for export_path do |framework|&lt;br /&gt;      system "svn up #{checkout_path}/#{framework}/lib -r #{ENV['REVISION']} --quiet"&lt;br /&gt;      system "svn export #{checkout_path}/#{framework}/lib #{export_path}/#{framework}/lib"&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  puts 'linking rails'&lt;br /&gt;  rm_rf   symlink_path&lt;br /&gt;  mkdir_p symlink_path&lt;br /&gt;&lt;br /&gt;  get_framework_for symlink_path do |framework|&lt;br /&gt;    ln_s File.expand_path("#{export_path}/#{framework}/lib"), "#{symlink_path}/#{framework}/lib"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def get_framework_for(*paths)&lt;br /&gt;  %w( railties actionpack activerecord actionmailer activesupport actionwebservice ).each do |framework|&lt;br /&gt;    paths.each { |path| mkdir_p "#{path}/#{framework}" }&lt;br /&gt;    yield framework&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Switchtower recipe code:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;set :rails_version, 3517&lt;br /&gt;desc "Checks out rails rev ##{rails_version}"&lt;br /&gt;task :after_symlink do&lt;br /&gt;  run &lt;&lt;-CMD&lt;br /&gt;    cd #{current_release} &amp;&amp;&lt;br /&gt;    rake init REVISION=#{rails_version} RAILS_PATH=/home/username/projects/rails&lt;br /&gt;  CMD&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 07 Feb 2006 11:07:28 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/1370</guid>
      <author>technoweenie (Rick Olson)</author>
    </item>
    <item>
      <title>freeze_edge for switchtower deployments</title>
      <link>http://snippets.dzone.com/posts/show/858</link>
      <description>I run this rake task in the after_symlink event of switchtower to set up the newly deployed app's config files.  I rewrote the freeze_edge task to be a little more efficient:&lt;br /&gt;&lt;br /&gt;1. checks out rails trunk to shared/rails/trunk if needed&lt;br /&gt;2. updates rails trunk to revision used by the app&lt;br /&gt;3. exports that revision to shared/rails/rev_xxxx&lt;br /&gt;4. links that revision to current/vendor/rails&lt;br /&gt;&lt;br /&gt;This way, my app only has a single checkout of the rails trunk.  Multiple deployments do not checkout fresh copies, but update to the desired revision and export.  If you make multiple deployments using the same rails revision, then only the symlink action is performed.  This speeds the task up considerably, and conserves disk space and network traffic.&lt;br /&gt;&lt;br /&gt;Set rails version in deploy.rb:&lt;br /&gt;&lt;code&gt;set :rails_version, 2871&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Create after_symlink task:&lt;br /&gt;&lt;code&gt;desc "Checks out rails rev ##{rails_version}"&lt;br /&gt;task :after_symlink do&lt;br /&gt;  run "cd #{current_release} &amp;&amp; rake init SHARED_PATH=#{shared_path} CURRENT_RELEASE=#{current_release} REVISION=#{rails_version}"&lt;br /&gt;end&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;init task:&lt;br /&gt;&lt;code&gt;desc "Performs an export of the rails trunk"&lt;br /&gt;task :init do&lt;br /&gt;  return unless ENV['SHARED_PATH'] and ENV['CURRENT_RELEASE']&lt;br /&gt;  puts 'copying files...'&lt;br /&gt;  cp "#{ENV['SHARED_PATH']}/database.yml",  "#{ENV['CURRENT_RELEASE']}/config"&lt;br /&gt;  cp "#{ENV['SHARED_PATH']}/dispatch.fcgi", "#{ENV['CURRENT_RELEASE']}/public"&lt;br /&gt;&lt;br /&gt;  puts 'setting permissions...'&lt;br /&gt;  chmod 0600, "#{ENV['CURRENT_RELEASE']}/config/database.yml"&lt;br /&gt;  chmod 0700, "#{ENV['CURRENT_RELEASE']}/public/dispatch.fcgi"&lt;br /&gt;  &lt;br /&gt;  checkout_path = "#{ENV['SHARED_PATH']}/rails/trunk"&lt;br /&gt;  export_path = "#{ENV['SHARED_PATH']}/rails/rev_#{ENV['REVISION']}"&lt;br /&gt;  symlink_path = "#{ENV['CURRENT_RELEASE']}/vendor/rails"&lt;br /&gt;&lt;br /&gt;  # do we need to checkout the file?&lt;br /&gt;  unless File.exists?(checkout_path)&lt;br /&gt;    puts 'setting up rails trunk'    &lt;br /&gt;    get_framework_for checkout_path do |framework|&lt;br /&gt;      system "svn co http://dev.rubyonrails.org/svn/rails/trunk/#{framework}/lib #{checkout_path}/#{framework}/lib --quiet"&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  # do we need to export the revision?&lt;br /&gt;  unless File.exists?(export_path)&lt;br /&gt;    puts "setting up rails rev #{ENV['REVISION']}"&lt;br /&gt;    get_framework_for export_path, symlink_path do |framework|&lt;br /&gt;      system "svn up #{checkout_path}/#{framework}/lib -r #{ENV['REVISION']} --quiet"&lt;br /&gt;      system "svn export #{checkout_path}/#{framework}/lib #{export_path}/#{framework}/lib"&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  puts 'linking rails'&lt;br /&gt;  rm_rf   "vendor/rails"&lt;br /&gt;  mkdir_p "vendor/rails"&lt;br /&gt;&lt;br /&gt;  get_framework_for checkout_path, export_path, symlink_path do |framework|&lt;br /&gt;    ln_s File.expand_path("#{export_path}/#{framework}/lib"), "#{ENV['CURRENT_RELEASE']}/vendor/rails/#{framework}/lib"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def get_framework_for(*paths)&lt;br /&gt;  %w( railties actionpack activerecord actionmailer activesupport actionwebservice ).each do |framework|&lt;br /&gt;    paths.each { |path| mkdir_p "#{path}/#{framework}" }&lt;br /&gt;    yield framework&lt;br /&gt;  end&lt;br /&gt;end&lt;/code&gt;</description>
      <pubDate>Sat, 05 Nov 2005 05:14:43 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/858</guid>
      <author>technoweenie (Rick Olson)</author>
    </item>
    <item>
      <title>restart rails app in switchtower on textdrive</title>
      <link>http://snippets.dzone.com/posts/show/857</link>
      <description>You'll have to override the standard Switchtower restart task if you don't have sudo access:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;desc "Restart the FCGI processes on the app server."&lt;br /&gt;task :restart, :roles =&gt; :app do&lt;br /&gt;  run "ruby #{current_path}/script/process/reaper"&lt;br /&gt;end&lt;/code&gt;&lt;br /&gt;</description>
      <pubDate>Sat, 05 Nov 2005 05:06:56 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/857</guid>
      <author>technoweenie (Rick Olson)</author>
    </item>
    <item>
      <title>manual reaping of fcgi processes</title>
      <link>http://snippets.dzone.com/posts/show/639</link>
      <description>These are the signals that SwitchTower's reaper uses:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;# reload&lt;br /&gt;kill -s HUP @pid&lt;br /&gt;&lt;br /&gt;# graceful&lt;br /&gt;kill -s TERM @pid&lt;br /&gt;&lt;br /&gt;# kill&lt;br /&gt;kill -9 @pid&lt;br /&gt;&lt;br /&gt;# usr1&lt;br /&gt;kill -s USR1 @pid&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 07 Sep 2005 01:18:57 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/639</guid>
      <author>technoweenie (Rick Olson)</author>
    </item>
    <item>
      <title>checkout rails and apply patches with a rake task</title>
      <link>http://snippets.dzone.com/posts/show/591</link>
      <description>see my &lt;a href="http://weblog.digett.com/2005/08/21/add-the-latest-version-of-rails-when-deploying/"&gt;blog post&lt;/a&gt; about this...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;desc "Performs an export of the rails trunk"&lt;br /&gt;task :rails_export =&gt; :environment do&lt;br /&gt;  FileUtils.rm_rf "#{RAILS_ROOT}/vendor/rails"&lt;br /&gt;  puts 'exporting... ' + ENV["VERSION"].to_s &lt;br /&gt;  `svn export http://dev.rubyonrails.org/svn/rails/trunk#{ENV["VERSION"] ? "@#{ENV['VERSION']}" : ""} #{RAILS_ROOT}/vendor/rails`&lt;br /&gt;  puts 'applying patches...'&lt;br /&gt;  FileList[File.expand_path("#{RAILS_ROOT}/config/diffs/*.diff")].sort.each do |diff_file|&lt;br /&gt;    %x{cd #{File.expand_path("#{RAILS_ROOT}/vendor/rails")} &amp;&amp; cat #{File.expand_path(diff_file)} | patch -p0}&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Does an svn export from rails.  Provide a revision if you don't want to check out the latest.  It then applies patches in config/diffs in alphabetical order.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;rake rails_export VERSION=2000&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Here is a SwitchTower recipe to perform this action automatically:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;set :rails_version, '2031' # custom ST variable&lt;br /&gt;&lt;br /&gt;desc "Checks out rails rev ##{rails_version}"&lt;br /&gt;task :after_symlink do&lt;br /&gt;  run "cd #{current_release} &amp;&amp; rake rails_export VERSION=#{rails_version}"&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 23 Aug 2005 00:05:04 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/591</guid>
      <author>technoweenie (Rick Olson)</author>
    </item>
  </channel>
</rss>
