André Roaldseth
Developer at NAV
André Roaldseth - @androa
Originally a tool for deploying code.
$ cap production shell triggering load callbacks * executing `production' triggering start callbacks for `shell' * executing `multistage:ensure' * executing `shell' ============================================================ Welcome to the interactive Capistrano shell! This is an experimental feature, and is liable to change in future releases. Type 'help' for a summary of how to use the shell. ------------------------------------------------------------ cap> echo "Hello" ** [out :: server-web-02.int.vgnett.no] Hello ** [out :: server-web-01.int.vgnett.no] Hello
$ cd my_project $ capify .
load 'deploy' # Default deploy recipe
load 'config/deploy' # Local customized recipe
set :application "vgtv" set :scm, :subversion
set :repository, "svn+ssh://svn.int.vgnett.no/svn/somerepo"
set :deploy_via, :remote_cache
ssh_options[:forward_agent] = true set :deploy_to, "/services/application/#{application}" role :web "server-web-01.int.vgnett.no" role :web "server-web-02.int.vgnett.no" set :use_sudo, false after "deploy:restart", "deploy:cleanup" set :shared_children, %w{} set :public_children, %w{css js img}
First time for a new server:
$ cap deploy:setup
Creates this folder structure:
$ tree . |-- current -> releases/20120927122114/ |-- releases | |-- 20120924121738 | |-- 20120926075745 | `-- 20120927122114 `-- shared `-- logs
Every following deploy:
$ cap deploy
config/deploy.rb:
require "capistrano/ext/multistage" set :stages, %w{production staging} set :default_stage, "staging" set :stage_dir "configs/stages"
config/stages/production.rb
role :web, "production-web-01.int.vgnett.no" role :web, "production-web-02.int.vgnett.no"
config/stages/staging.rb
role :web, "staging-web-01.int.vgnett.no"
$ cap deploy
$ cap staging deploy
$ cap production deploy
$ cap -T cap deploy # Deploys your project. cap deploy:check # Test deployment dependencies. cap deploy:cleanup # Clean up old releases. ... cap invoke # Invoke a single command on the remotes cap shell # Begin an interactive Capistrano session
Run a single task:
$ cap production deploy:cleanup
before "deploy:create_symlink", "deploy:set_environment" namespace :deploy do task :set_environment do run "cp #{current_release}/public/.htaccess-dist " + "#{current_release}/public/.htaccess" run "sed -i -r 's/APPLICATION_ENV \\w+/APPLICATION_ENV " + "#{stage}/' #{current_release}/public/.htaccess" end end
before "deploy:create_symlink", "deploy:preprocess_less"
namespace :deploy do
task :preprocess_less do
run "lessc -x #{current_release}/public/css/main.less " +
"#{current_release}/public/css/compressed.css"
run "sed -i -r 's/main\.less/main.css/' " +
"#{current_release}/application/layouts/layout.phtml" run "rm #{current_release/public/css/*.less"
end
end
before "deploy:create_symlink", "deploy:preprocess_rjs" namespace :deploy do task :preprocess_rjs do run "mv #{current_release}/public/js " + "#{current_release}/public/js-src" run "mkdir #{current_release}/public/js" run "r.js -o #{current_release}/tools/js/build.js " + "baseUrl=#{current_release}/public/js-src/ " + "out=#{current_release}/public/js/bootstrap.js" run "rm -rf #{current_release}/public/js-src/" end end
before "deploy:create_symlink", "deploy:move_static_files" set :static_server, "static.int.vgnett.no" set :static_path, "/services/static/files" namespace :deploy do task :move_static_files do run "rsync -O --exclude=.svn -a " + "#{current_release}/public/images/" + "#{static_server}:#{static_path" run "rm -rf #{current_release}/public/images/" end end
By André Roaldseth