Skip to content

Instantly share code, notes, and snippets.

@csouls
Created April 29, 2014 12:48
Show Gist options
  • Save csouls/11399283 to your computer and use it in GitHub Desktop.
Save csouls/11399283 to your computer and use it in GitHub Desktop.
config/deploy.rb on simple deploy
namespace :deploy do
set :db_user, 'set_db_user'
set :db_password, 'set_db_password'
set(:environment) { rails_env }
set :master, 'localhost'
set :slaves, []
set :database_name, "dbprefix_#{rails_env}"
# memcached config => [hostname:port]
set :memcache_servers, ['localhost:11211']
# redis config => [hostname, db_num]
set :redis_game, [['localhost', 0], ['localhost', 1]]
set :redis_game_slaves, []
namespace :simple do
desc "Setup a GitHub-style deployment."
task :setup, :except => { :no_release => true } do
transaction do
on_rollback { run "rm -fr #{deploy_to}" }
run "mkdir -p #{releases_path} && chmod g+rw #{releases_path}"
# Then clone the code and change to the given branch
unless deployed_dir_exists?(".git")
run "umask 002 && git clone #{repository} #{releases_path}/current"
end
run 'git config --global user.email "deploy_user_email"'
run 'git config --global user.name "deploy_user_name"'
end
end
namespace :symlinks do
desc "Make all the symlinks"
task :make, :roles => :app, :except => { :no_release => true } do
symlinks = {
'assets' => 'public/assets',
'system' => 'public/system',
'log' => 'log',
'pids' => 'tmp/pids',
'sockets' => 'tmp/sockets',
}
# needed for some of the symlinks
run "rm -rf #{current_path} && ln -s #{releases_path}/current #{current_path}"
run "mkdir -p #{releases_path}/current/tmp"
commands = symlinks.map do |from, to|
"rm -rf #{current_path}/#{to} && mkdir -p #{shared_path}/#{from} && ln -s #{shared_path}/#{from} #{current_path}/#{to}"
end
commands << "rm -rf #{shared_path}/log && ln -s /media/ephemeral0/rails #{shared_path}/log"
run "cd #{current_path} && #{commands.join(" && ")}"
end
after "deploy:simple:setup", "deploy:simple:symlinks:make"
end
desc "Update the deployed code."
task :update_code, :except => { :no_release => true } do
on_rollback { git "reset --hard #{latest_tag}" if latest_tag }
git "fetch && git reset --hard origin/#{branch}"
run_current "bundle install" if trigger_update?("Gemfile.lock")
end
after "deploy:simple:setup", "deploy:simple:update_code"
# Tag `HEAD` with the release tag and message
desc "Update the REVISION."
task :tag, :except => { :no_release => true } do
set :release_tag, release_tag_from_repository
set :release_message, "Deployed at #{Time.now}"
on_rollback { git "tag -d #{release_tag}" }
if changed_files.count > 0
git "tag #{release_tag} -m '#{release_message}'"
end
end
set(:setup_database_triggers, %w(templates/database.yml.erb templates/shards.yml.erb))
namespace :conf do
desc 'Setup database.yml on simple deploy'
task :database do
if setup_database_triggers.detect {|path| trigger_update?(path)}
put conf_template('database.yml', binding), "#{current_path}/config/database.yml"
unless slaves.empty?
put conf_template('shards.yml', binding), "#{current_path}/config/shards.yml"
end
end
end
after "deploy:simple:update_code", "deploy:simple:conf:database"
desc 'Setup memcached.yml'
task :memcached do
if trigger_update?('templates/memcached.yml.erb')
put conf_template('memcached.yml', binding), "#{current_path}/config/memcached.yml"
end
end
after "deploy:simple:update_code", "deploy:simple:conf:memcached"
desc 'Setup redis.yml'
task :redis do
if trigger_update?('templates/redis.yml.erb')
put conf_template('redis.yml', binding), "#{current_path}/config/redis.yml"
end
end
after "deploy:simple:update_code", "deploy:simple:conf:redis"
end
desc "Create database"
task :create_database, :roles => :db, :except => { no_release: true } do
if setup_database_triggers.detect {|path| trigger_update?(path)}
run "cd #{current_path} && bundle exec rake db:create"
end
end
after "deploy:simple:conf:database", "deploy:simple:create_database"
desc 'Run the migrate rake task if migrations changed.'
task :migrate do
if trigger_update?('db/migrate')
run_bundle "rake db:migrate"
end
end
after "deploy:simple:update_code", "deploy:simple:migrate"
namespace :seed do
[:update, :truncate].each do |act|
desc "#{act} Game Master data if changed from previous version."
task act, :roles => :db, :except => {no_release: true} do
cond = act == :truncate ? "TRUNCATE=1" : ""
if trigger_update?("db/seeds")
tables = changed_files.grep(/\Adb\/seeds.*\.yml\Z/).map{|p| p.split('/').last.gsub('.yml', '') }
run_bundle "rake db:seed_fu TABLES=#{tables.join(',')} #{cond}"
end
end
end
after "deploy:simple:update_code", "deploy:simple:seed:update"
end
namespace :assets do
set(:asset_precompilation_triggers, %w(app/assets vendor/assets Gemfile.lock config))
desc 'Run the asset precompilation rake task if assets changed.'
task :precompile do
if asset_precompilation_triggers.detect {|path| trigger_update?(path)}
run_bundle "rake RAILS_GROUPS=assets assets:precompile"
end
end
after "deploy:simple:update_code", "deploy:simple:assets:precompile"
end
desc "Restart the application following a deploy"
task :restart do
top.unicorn.restart
end
desc "Remove all deployed files"
task :destroy do
sudo "rm -rf #{releases_path}/current"
end
desc "Rollback to previous release."
task :rollback, :except => { :no_release => true } do
if latest_tag
git "tag -d #{latest_tag}"
git "reset --hard #{latest_tag(false)}"
restart
else
abort "This app is not currently deployed"
end
end
after "deploy:simple:setup", "god:start"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment