-
-
Save andyinabox/1394913 to your computer and use it in GitHub Desktop.
Silverstripe + Capistrano + Git recipe
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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