Skip to content

Instantly share code, notes, and snippets.

@jrochkind
Created December 11, 2012 17:24

Revisions

  1. jrochkind revised this gist Dec 11, 2012. 1 changed file with 2 additions and 5 deletions.
    7 changes: 2 additions & 5 deletions gistfile1.rb
    Original file line number Diff line number Diff line change
    @@ -25,10 +25,7 @@
    # If you want to reference the deployed feature by something other than
    # branch name:
    #
    # cap feature_demo deploy:cleanup_feature_demo -S feature=something_else
    #
    # (If you used custom branch or feature names, you'll have to supply em
    # again when you cleanup)
    # cap feature_demo deploy -S feature=something_else
    #
    # feature name is used for directory path of checkout, Apache
    # subUri, etc. shouldn't have spaces, should be a nice token.
    @@ -65,7 +62,7 @@
    # precompilation.
    set :asset_env, "#{asset_env} RAILS_RELATIVE_URL_ROOT=/#{feature}"

    set :deploy_to, "/opt/catalyst_feature_demos/#{feature}"
    set :deploy_to, "/opt/feature_demos/#{feature}"

    # I can never get capistrano sudo to work anyway, all places
    # we're going to write to just need to be writeable by the user
  2. jrochkind renamed this gist Dec 11, 2012. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. jrochkind created this gist Dec 11, 2012.
    126 changes: 126 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,126 @@
    # An experiment for a capistrano 'stage' that can actually be used to
    # deploy multiple feature branches at once.

    # Intended to be installed config/deploy/feature_demo , when using cap
    # multi-stage support: add 'feature_demo' to 'stages' in `config/deploy.rb` too.

    # Run from a git feature branch `cap feature_demo deploy` to deploy to
    # single machine we have all our feature demos on.

    # Name of feature branch will be taken from current git checkout.

    # Will be deployed to /opt/feature_demos/name_of_feature, from
    # git branch name_of_feature, AND an httpd conf will be created telling
    # passenger to deploy that app, woo.
    #
    # cap feature_demo deploy
    #
    # You WILL need to manually restart apache if this is the first time
    # you've deployed that feature demo.
    #
    # If you want to deploy a different branch than your current checkout:
    #
    # cap feature_demo deploy -S branch=some_branch
    #
    # If you want to reference the deployed feature by something other than
    # branch name:
    #
    # cap feature_demo deploy:cleanup_feature_demo -S feature=something_else
    #
    # (If you used custom branch or feature names, you'll have to supply em
    # again when you cleanup)
    #
    # feature name is used for directory path of checkout, Apache
    # subUri, etc. shouldn't have spaces, should be a nice token.
    #
    #
    # If you are done with a feature demo and want to wipe it from disk etc,
    # cap feature_demo deploy:cleanup_feature_demo
    #
    # (Have to use `feature` or `branch` args matching how you created it)




    # not using any of our special roles for cronjobs, for a feature
    # demo we just want a basic app deploy.
    server "demo.server.tld", :app, :web

    unless exists? :branch
    set :branch do
    branch = `git symbolic-ref -q HEAD`.sub(%r{^refs/heads/}, '').chomp
    raise CommandError.new("feature_demo cap stage only works if you have a checked out feature branch!") if branch == "master"
    branch
    end
    end


    unless exists? :feature
    set(:feature) { fetch :branch }
    end



    # have to tell it the SubURI we'll be deploying at for asset
    # precompilation.
    set :asset_env, "#{asset_env} RAILS_RELATIVE_URL_ROOT=/#{feature}"

    set :deploy_to, "/opt/catalyst_feature_demos/#{feature}"

    # I can never get capistrano sudo to work anyway, all places
    # we're going to write to just need to be writeable by the user
    set :use_sudo, false

    # We have a 'demo' Rails environment defined, which has config settings
    # very production-like, but uses non-production database and other external
    # APIs.
    set :rails_env, "demo"

    # For rvm-ified machine on blacklight.library
    require 'rvm/capistrano'
    set :rvm_ruby_string, '1.9.3'


    # No reason to keep old releases in our feature_demo checkouts
    set :keep_releases, 1


    set(:webroot, "/var/www/html") unless exists? :webroot
    set(:apache_conf_dir, "/etc/httpd/conf.d") unless exists? :apache_conf_dir

    unless exists? :apache_conf_file
    set(:apache_conf_file_path) { File.join(apache_conf_dir, "#{feature}.conf") }
    end

    namespace :deploy do
    task :passenger_apache_conf, :roles => [:web] do

    apache_conf = <<-EOS
    RackBaseURI /#{feature}
    <Directory #{deploy_to}>
    RailsEnv #{rails_env}
    Options -MultiViews
    </Directory>
    EOS

    put apache_conf, apache_conf_file_path
    end

    task :passenger_symlink, :roles => [:web] do
    run "ln -sf #{File.join(deploy_to, "current", "public")} #{File.join(webroot, feature)}"
    end

    end

    before "deploy:restart", "deploy:passenger_symlink", "deploy:passenger_apache_conf"

    # Want to clean up a feature branch?
    # cap deploy:cleanup_feature_demo

    namespace :deploy do
    task :cleanup_feature_demo, :roles => [:web] do
    run "rm -rf #{deploy_to}"
    run "rm -rf #{File.join(webroot, feature)}"
    run "rm -rf #{File.join(apache_conf_dir, "#{feature}.conf")}"
    end
    end