- # 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"