140 lines
4.8 KiB
Ruby
140 lines
4.8 KiB
Ruby
# BACKGROUND:
|
|
# To describe the idea here -- these are capistrano "recipes" which are a bit like rake tasks
|
|
# You wrap all the fiddly systems scripts and things that you need to do for a deploy into these nice neat little individual tasks
|
|
# and then you can chain the tasks together
|
|
#
|
|
# when you run "cap deploy:migrate" let's say, all the things you've told to run before or after it go automatically
|
|
# eg this line in deploy/production.rb:
|
|
# before "deploy:migrate", "production_only:backup_db"
|
|
# says, if I run "cap deploy:migrate production" then before doing any of the actual work of the deploy,
|
|
# run the task called "production_only:backup_db" which is defined in deploy.rb
|
|
#
|
|
# namespace :production_only do
|
|
# # Back up the production database
|
|
# task :backup_db, roles: :db do
|
|
# run "/static/bin/backup_database.sh &"
|
|
# end
|
|
# end
|
|
#
|
|
# which says, run this script backup_database.sh
|
|
# and run it on the machine that has the ":db" role
|
|
#
|
|
# The roles are defined in each of deploy/production.rb and deploy/staging.rb,
|
|
# and can be set differently for whichever system you are deploying to.
|
|
#
|
|
# Several tasks run automatically based on behind-the-scenes magic
|
|
#
|
|
require "./config/boot"
|
|
require "active_support/core_ext/hash/keys"
|
|
|
|
# takes care of the bundle install tasks
|
|
require 'bundler/capistrano'
|
|
|
|
# deploy to different environments with tags
|
|
require 'capistrano/ext/multistage'
|
|
set :stages, %w[staging production]
|
|
set :default_stage, "staging"
|
|
#require 'capistrano/gitflow_version'
|
|
|
|
# use rvm
|
|
require "rvm/capistrano"
|
|
set :rvm_ruby_string, ENV['GEM_HOME'].gsub(/.*\//, "")
|
|
set :rvm_type, :user
|
|
|
|
# user settings
|
|
set :user, "ao3app"
|
|
set :auth_methods, "publickey"
|
|
#ssh_options[:verbose] = :debug
|
|
ssh_options[:auth_methods] = %w(publickey)
|
|
set :use_sudo, false
|
|
default_run_options[:shell] = '/bin/bash'
|
|
|
|
# basic settings
|
|
set :application, "otwarchive"
|
|
set :deploy_to, "/home/ao3app/app"
|
|
set :keep_releases, 4
|
|
|
|
set :mail_to, "otw-coders@transformativeworks.org otw-testers@transformativeworks.org"
|
|
|
|
# git settings
|
|
set :scm, :git
|
|
set :repository, "https://github.com/otwcode/otwarchive.git"
|
|
set :deploy_via, :remote_cache
|
|
|
|
set :servers, -> { YAML.load_file(File.join(__dir__, "servers.yml")).deep_symbolize_keys[fetch(:stage)] }
|
|
|
|
# overwrite default capistrano deploy tasks
|
|
namespace :deploy do
|
|
desc "Restart the unicorns"
|
|
task :restart do
|
|
find_servers(roles: [:app, :web]).each do |server|
|
|
puts "restart on #{server.host}"
|
|
run "cd ~/app/current ; bundle exec rake skins:cache_chooser_skins RAILS_ENV=#{rails_env}", hosts: server.host
|
|
run "/home/ao3app/bin/unicorns_reload", hosts: server.host
|
|
end
|
|
end
|
|
|
|
desc "Restart the resque workers"
|
|
task :restart_workers, roles: :workers do
|
|
run "/home/ao3app/bin/workers_reload"
|
|
end
|
|
|
|
desc "Restart the schedulers"
|
|
task :restart_schedulers, roles: :schedulers do
|
|
run "/home/ao3app/bin/scheduler_reload"
|
|
end
|
|
|
|
desc "Get the config files"
|
|
task :update_configs, roles: [:app, :web, :workers, :schedulers] do
|
|
run "/home/ao3app/bin/create_links_on_install"
|
|
end
|
|
|
|
desc "Update the web-related whenever tasks"
|
|
task :update_cron_web, roles: :web do
|
|
# run "bundle exec whenever --update-crontab web -f config/schedule_web.rb"
|
|
run "echo cron entries are currently managed by hand"
|
|
end
|
|
|
|
# This should only be one machine
|
|
desc "update the crontab for whatever machine should run the scheduled tasks"
|
|
task :update_cron, roles: :app, only: {primary: true} do
|
|
# run "bundle exec whenever --update-crontab #{application}"
|
|
run "echo cron entries are currently managed by hand"
|
|
end
|
|
|
|
# Needs to run on web (front-end) servers, but they must also have rails installed
|
|
desc "Re-caches the site skins"
|
|
task :reload_site_skins do
|
|
find_servers(roles: :web).each do |server|
|
|
puts "Caching skins on #{server.host}"
|
|
run "cd ~/app/current ; bundle exec rake skins:cache_chooser_skins RAILS_ENV=#{rails_env} ; cd ~/app ; rm web_old ; ln -f -s `readlink -f current` web_new ; mv web web_old ; mv web_new web", hosts: server.host
|
|
sleep (10)
|
|
end
|
|
end
|
|
end
|
|
|
|
# ORDER OF EVENTS
|
|
# Calling "cap deploy" runs:
|
|
# deploy:update which runs:
|
|
# deploy:update_code
|
|
# deploy:symlink
|
|
# deploy:restart
|
|
#
|
|
# Calling "cap deploy:migrations" inserts the task "deploy:migrate" before deploy:symlink
|
|
#
|
|
|
|
# after and before task triggers that should run on both staging and production
|
|
#before "deploy:migrate", "deploy:web:disable"
|
|
#after "deploy:migrate", "extras:run_after_tasks"
|
|
|
|
#before "deploy:symlink", "deploy:web:enable_new"
|
|
#after "deploy:symlink", "extras:update_revision"
|
|
|
|
after "deploy:restart", "deploy:update_cron"
|
|
after "deploy:restart", "deploy:update_cron_web"
|
|
#after "deploy:restart", "extras:restart_delayed_jobs"
|
|
#after "deploy:restart", "deploy:cleanup"
|
|
|
|
after "deploy:restart", "deploy:restart_workers"
|
|
after "deploy:restart", "deploy:restart_schedulers"
|
|
after "deploy:symlink", "deploy:update_configs"
|