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