Skip to content

Instantly share code, notes, and snippets.

@andyinabox
Forked from stojg/deploy.rb
Created November 26, 2011 03:23
Show Gist options
  • Save andyinabox/1394913 to your computer and use it in GitHub Desktop.
Save andyinabox/1394913 to your computer and use it in GitHub Desktop.
Silverstripe + Capistrano + Git recipe
# My ./config directory in silverstripe looks like this:
# ./503.php <- a 503 Maintainance page
# ./_ss_environment.php <- the production environment settings
# ./deploy.rb <- is the recipe below
#
# multiple stages
set :stages, %w(staging dev production) # no info for production server yet
set :default_stage, "dev"
require 'capistrano/ext/multistage'
# Sample deploy script for each stage. Save in deploy/[stage name].rb
# ================================ deploy/dev.rb =============================
# set :deploy_to, "/path/to/server/html/root"
# server "example.com", :app, :web, :dby
#
# # User settings
# set :runner, "username"
# set :user, "username"
# set :use_sudo, false
# set :webserver_group, "www-data"
#
# # DB settings
# set :db_user, 'username'
# set :db_password, 'password'
# set :db_host, 'localhost'
# set :db_name, 'example'
#
# set :env, 'dev'
# ============================================================================
# Application settings
set :application, "example.com"
set :shared_children, %w(assets)
set :keep_releases, 4
# SCM settings
# Your git clone URL
set :repository, "username@example.com:example.git"
set :scm, "git"
set :branch, "master" # git branch to deploy
set :scm_verbose, false
# faster deploys
set :deploy_via, :remote_cache
# If git submodules is used, this is very much needed
set :git_enable_submodules, 1
# theme settings (html5-boilerplate)
set :theme_name, "example"
# --------------------------------------------
# SSH
# --------------------------------------------
ssh_options[:forward_agent] = false
default_run_options[:pty] = true # Must be set for the password prompt from git to work
ssh_options[:port] = 22
namespace :deploy do
# tasks for setting up silverstripe environment
namespace :ss do
task :env_setup, :roles => :app do
run "if [ ! -d '#{release_path}/env_#{env}' ]; then mkdir '#{release_path}/env_#{env}'; fi"
#run "touch #{release_path}/env_#{env}"
end
end
# tasks for html5-boilerplate
# deploy runs h5bp build script and creates a new theme using the release
# directory name h5bp build script needs to be customized for this to work
# correctly
namespace :h5bp do
# currently this is built locally and then uploated. better way to do this?
task :build, :roles => :app do
p `ant build -f ./themes/#{theme_name}/build/build.xml`
# run "ant build -f #{release_path}/themes/#{theme_name}/build/build.xml"
top.upload "./themes/publish", "#{latest_release}/themes/#{latest_release.split('/').last}", :via => :scp, :recursive => true
end
end
task :update_code, :except => { :no_release => true } do
on_rollback {
run "mysql -u#{db_user} -p#{db_password} -h#{db_host} #{db_name} < #{release_path}/backup.sql"
run "rm -rf #{release_path}; true"
}
strategy.deploy!
finalize_update
end
task :finalize_update, :except => { :no_release => true } do
shared_children.each{ | folder |
run "ln -s #{shared_path}/#{folder} #{latest_release}/#{folder}"
}
end
task :migrate do
top.upload "./config/_ss_environment.php", "#{latest_release}/_ss_environment.php", :via => :scp
# upload env-specific _config.php file
top.upload "./config/ss/#{env}.php", "#{latest_release}/env_#{env}/_config.php", :via => :scp
run "mkdir #{latest_release}/silverstripe-cache"
run "#{latest_release}/sapphire/sake dev/build"
run "chmod -R g+w #{latest_release}"
# run "chown -R :#{webserver-group} #{latest_release}" # don't need this on our configuration
#logger.important "the migrate action doesnt make sense in our deploy"
end
task :restart do
#logger.important "the restart task doesnt make sense in our deploy"
end
namespace :web do
desc <<-DESC
Puts the site in 503 maintaince mode
DESC
task :disable, :roles => :web, :except => { :no_release => true } do
if previous_release
logger.important "Putting site in maintaince"
top.upload "./config/503.php", "#{current_release}/maintainance.php", :via => :scp
end
end
desc <<-DESC
Removes the 503 maintaince mode
DESC
task :enable, :roles => :web, :except => { :no_release => true } do
if previous_release
logger.important "Removing sites maintaince mode"
run "rm #{current_release}/maintainance.php"
end
end
end
namespace :db do
task :backup, :except => { :no_release => true } do
logger.important "Backing up database"
run "mysqldump -u#{db_user} -p#{db_password} -h#{db_host} #{db_name} > #{latest_release}/backup.sql"
end
task :restore, :except => { :no_release => true } do
logger.important "Restoring database"
run "mysql -u#{db_user} -p#{db_password} -h#{db_host} #{db_name} < #{latest_release}/backup.sql"
end
end
end
before "deploy:migrate", "deploy:ss:env_setup"
after "deploy:migrate", "deploy:h5bp:build"
before "deploy:update_code", "deploy:web:disable"
after "deploy:symlink", "deploy:db:backup"
after "deploy:symlink", "deploy:migrate"
after "deploy:symlink", "deploy:web:enable"
after "rollback:cleanup", "deploy:db:restore"
after "deploy:update", "deploy:cleanup"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment