Skip to content

Instantly share code, notes, and snippets.

@frankyston
Forked from aujkis/deploy.rb
Created January 11, 2016 17:16
Show Gist options
  • Save frankyston/935ddf9860d269d0a27e to your computer and use it in GitHub Desktop.
Save frankyston/935ddf9860d269d0a27e to your computer and use it in GitHub Desktop.
# Mina Deploy
# ===========
#
# Adapted from Creative deploy stack in Manabalss v4, Mar.2015
# On first deploy do: mina setup --verbose
# Then do : mina deploy --trace
#
# Usage:
# mina deploy --verbose # Standard deploy task | mina deploy[hard,seed] to hard-reset and seed
# mina rake[db:seed]
# mina oops # deletes the deploy.lock file in case a deployment messed up.
# mina boot # starts nginx and puma
# mina reboot # restarts nginx and puma
# mina puma_hard_reset # reset after major migrations or gem additions
# mina shutdown # stops puma (for DB manipulation)
# mina rollback # symlinks current to the previous release folder and deletes last release, restarts puma
require 'mina/bundler'
require 'mina/rails'
require 'mina/git'
require 'mina/rvm' # Creative uses rvm
require 'mina/nginx'
# Configure Production server info
set :app_name, 'cpp'
set :domain, '146.185.xxx.135' # Droplet IP
set :user, 'deployer' # Username in the server to SSH to.
set :port, 'xxxx' # SSH port number.
set :ssh_options, '-A' # Needed for git sync to work, check droplet setup
set :deploy_to, "/home/deployer/apps/#{app_name}" # Creative deploys to "/home/deployer/apps/<appname>"
set :current, "#{deploy_to}/current"
# Configure git repo location
set :repository, '[email protected]:CreativeMobile/cpp.git' # Git repo SSH clone link
set :branch, 'master' # Creative deploys master branch
# Aux
set :task, ENV['task']
set :rails_env, 'production'# Creative calls the 'live' version production
set :term_mode, :system # Basic output, supports password prompt
# set :term_mode, :pretty # Does not support password input during deploy
set :bundle_binstubs, nil
task :environment do
invoke :'rvm:use[ruby-2.2.0@cpp]' # Set App's ruby here
end
# Manually create these paths in shared/ (eg: shared/config/database.yml) in your server.
set :shared_paths, ['config/database.yml', 'log', 'public/system', "puma" ]
desc "Deploys the current version to the server."
task :deploy => :environment do |t, hash|
deploy do
invoke :'git:clone'
invoke :'deploy:link_shared_paths'
invoke :'bundle:install'
invoke :'rails:db_migrate'
invoke :'rails:assets_precompile'
to :launch do
invoke :'nginx_link'
if hash.extras.include?("hard")
invoke :'puma_hard_reset'
else
invoke :'puma_reload'
end
invoke :"seed[#{hash.extras.include?("seed").to_s}]"
#invoke :'update_crontab'
#invoke :'run_resque'
invoke :'deploy:cleanup'
end
end
end
desc "Invokes a raketask"
task :invoke => :environment do
queue! "cd #{current}"
queue! "bundle exec rake #{ENV['task']} RAILS_ENV=production"
end
desc "Deletes deploy.lock to allow redeploy"
task :oops => :environment do
queue! "cd #{deploy_to}"
queue! "rm deploy.lock"
end
desc "Seed data to the database"
task :seed => :environment do |t, hash|
if hash.extras.include?("true")
puts "-----> Seeding!"
queue %[cd #{current}]
queue "bundle exec rake db:seed RAILS_ENV=production"
else
puts "-----> Seed absent, use 'mina deploy[seed]' if you need to seed\n"
end
end
desc "Reloads puma and nginx"
task :reboot => :environment do
invoke :'nginx:restart'
invoke :'puma_hard_reset'
end
desc "Reloads nginx"
task :reboot_nginx => :environment do
invoke :'nginx:restart'
end
desc "Updates the crontab"
task :update_crontab => :environment do
queue! %[cd #{current} && bundle exec whenever --update-crontab #{app_name}]
end
desc "Turns ON both nginx and puma"
task :boot => :environment do
queue! %[cd #{current}]
queue! %[bundle exec pumactl start]
invoke :'nginx:start'
end
desc "Turns OFF both nginx and puma"
task :shutdown => :environment do
queue! %[cd #{current}]
queue! %[bundle exec pumactl -p $(cat /home/deployer/apps/#{app_name}/puma/puma.pid) stop]
#invoke :'nginx:stop'
end
desc "Hard-resets puma"
task :puma_hard_reset => :environment do
queue! %[cd #{current}]
queue! %[(bundle exec pumactl -p $(cat /home/deployer/apps/#{app_name}/puma/puma.pid) stop && bundle exec pumactl start) || bundle exec pumactl start]
end
desc "Takes care of puma restart"
task :puma_reload => :environment do
queue! %[bundle exec pumactl -p $(cat /home/deployer/apps/#{app_name}/puma/puma.pid) phased-restart || bundle exec pumactl start]
end
desc "Takes care of nginx conf"
task :nginx_link => :environment do
queue! %[ln -nfs /home/deployer/apps/#{app_name}/current/config/deploy/nginx.conf /etc/nginx/sites-enabled/#{app_name}]
queue! %[ln -nfs /home/deployer/apps/#{app_name}/current/config/deploy/nginx.conf /etc/nginx/sites-available/#{app_name}]
queue! %[sudo nginx -s reload]
end
desc "Runs resque"
task :run_resque => :environment do
queue! "cd #{current}"
queue! "bundle exec rake resque:restart_workers RAILS_ENV=production"
end
resque:restart_workers
desc "Rolls back the latest release"
task :rollback => :environment do
queue! %[echo "-----> Rolling back to previous release for #{app_name}!"]
# Delete existing sym link and create a new symlink pointing to the previous release
queue %[echo -n "-----> Creating new symlink from the previous release: "]
queue %[ls "#{deploy_to}/releases" -Art | sort | tail -n 2 | head -n 1]
queue! %[ls -Art "#{deploy_to}/releases" | sort | tail -n 2 | head -n 1 | xargs -I active ln -nfs "#{deploy_to}/releases/active" "#{deploy_to}/current"]
# Remove latest release folder (active release)
queue %[echo -n "-----> Deleting active release: "]
queue %[ls "#{deploy_to}/releases" -Art | sort | tail -n 1]
queue! %[ls "#{deploy_to}/releases" -Art | sort | tail -n 1 | xargs -I active rm -rf "#{deploy_to}/releases/active"]
queue! %[cd #{current}]
queue! %[(bundle exec pumactl -p $(cat /home/deployer/apps/#{app_name}/puma/puma.pid) stop && bundle exec pumactl start) || bundle exec pumactl start]
end
# Put any custom mkdir's in here for when `mina setup` is ran.
# For Rails apps, we'll make some of the shared paths that are shared between
# all releases.
task :setup => :environment do
queue! %[mkdir -p "#{deploy_to}/shared/log"]
queue! %[chmod g+rx,u+rwx "#{deploy_to}/shared/log"]
queue! %[mkdir -p "#{deploy_to}/shared/config"]
queue! %[chmod g+rx,u+rwx "#{deploy_to}/shared/config"]
queue! %[mkdir -p "#{deploy_to}/shared/public"]
queue! %[chmod g+rx,u+rwx "#{deploy_to}/shared/public"]
queue! %[mkdir -p "#{deploy_to}/shared/public/system"]
queue! %[chmod g+rx,u+rwx "#{deploy_to}/shared/public/system"]
queue! %[touch "#{deploy_to}/shared/config/database.yml"]
queue %[echo "-----> Be sure to edit 'shared/config/database.yml'."]
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment