capistrano2

31
Capistrano 2 Beyond Hassle-Free Deployment Luca Mearelli Pisa - Oct. 27, 2007

Post on 20-Oct-2014

2.019 views

Category:

Technology


0 download

DESCRIPTION

An introduction to deploying rails applications with capistrano I gave at RailsToItaly in 2007

TRANSCRIPT

Page 1: Capistrano2

Capistrano 2Beyond Hassle-Free Deployment

Luca MearelliPisa - Oct. 27, 2007

Page 2: Capistrano2
Page 3: Capistrano2

Rails is fun

Page 4: Capistrano2

Rails is fun

Rails is TOO MUCH fun

Page 5: Capistrano2

Deployment

Page 6: Capistrano2

System Administration

Page 7: Capistrano2

Rails : Web development

=

Capistrano : Sys.administration

Page 8: Capistrano2

•SSH to the remote machines

•Posix compatible shell

•Same password or public key

•a bit of ruby knowledge

•works from a command line

Capistrano basics

Page 9: Capistrano2

•Capfile (makefile, rakefile, ...)

•It’s ruby

Capistrano basics

task :dump_db, :hosts => "database.spazidigitali.com" do run "mysqldump -u deploy sd_production > /home/luca/dumps/db.sql"end

cap dump_db

Page 10: Capistrano2

role :sd_db, "database.spazidigitali.com"

task :dump_db do run "mysqldump -u deploy sd_production > /home/luca/dumps/db.sql"end

task :free_space do run "df -h"end

cap dump_db

Page 11: Capistrano2

set :gateway, "firewall.spazidigitali.com"role :sd_db, "database.spazidigitali.com"

task :dump_db do run "mysqldump -u deploy sd_production > /home/luca/dumps/db.sql"end

task :free_space do run "df -h"end

cap dump_db

Page 12: Capistrano2

set :gateway, "firewall.spazidigitali.com"role :sd_db, "database.spazidigitali.com", "replica.spazidigitali.com"

task :dump_db do run "mysqldump -u deploy sd_production > /home/luca/dumps/db.sql"end

task :free_space do run "df -h"end

cap dump_db

Page 13: Capistrano2

set :gateway, "firewall.spazidigitali.com"role :sd_db, "database.spazidigitali.com", "replica.spazidigitali.com"role :sd_app, "mongrels.spazidigitali.com"

task :dump_db, :roles=>:sd_db do run "mysqldump -u deploy sd_production > /home/luca/dumps/db.sql"end

task :free_space, :roles=>[:sd_db, :sd_app ] do run "df -h"end

cap dump_db

Page 14: Capistrano2

set :gateway, "firewall.spazidigitali.com"role :sd_db, "database.spazidigitali.com", "replica.spazidigitali.com"role :sd_app, "mongrels.spazidigitali.com"

namespace :spazidig do desc "Dumping our DBs" task :dump_db, :roles=>:sd_db do run "mysqldump -u deploy sd_production > /home/luca/dumps/db.sql" end

desc "Checking free space" task :free_space, :roles=>[:sd_db, :sd_app ]do run "df -h" endend

cap spazidig:dump_db

Page 15: Capistrano2

set :gateway, "firewall.spazidigitali.com"role :sd_db, "database.spazidigitali.com", "replica.spazidigitali.com"role :sd_app, "mongrels.spazidigitali.com"

namespace :spazidig do desc "What??" task :default do run "uname -a" end desc "Dumping our DBs" task :dump_db, :roles=>:sd_db do run "mysqldump -u deploy sd_production > /home/luca/dumps/db.sql" end

desc "Checking free space" task :free_space, :roles=>[:sd_db, :sd_app ]do run "df -h" endend

cap dump_dbcap spazidigcap spazidig:dump_dbcap spazidig:free_space

Page 16: Capistrano2

set :gateway, "firewall.spazidigitali.com"role :sd_db, "database.spazidigitali.com", "replica.spazidigitali.com"role :sd_app, "mongrels.spazidigitali.com"

set :destination, "db.sql"

namespace :spazidig do desc "Dumping our DBs" task :dump_db, :roles=>:sd_db do run "mysqldump -u deploy sd_production > /home/luca/dumps/#{destination}.sql" endend

cap spazidig:dump_db

Page 17: Capistrano2

set :gateway, "firewall.spazidigitali.com"role :sd_db, "database.spazidigitali.com", "replica.spazidigitali.com"role :sd_app, "mongrels.spazidigitali.com"

set :destination, "db.sql"

set(:database) do Capistrano::CLI.ui.ask "Which database?: "end

namespace :spazidig do desc "Dumping our DBs" task :dump_db, :roles=>:sd_db do run "mysqldump -u deploy #{database} > /home/luca/dumps/#{destination}.sql" endend

cap spazidig:dump_db

Page 18: Capistrano2

task :deploy do transaction do try_this then_do_that endend

task :try_this do on_rollback { run "do_cleanup" } #...end

task :then_do_that do on_rollback { run "do_super_cleanup" } #...end

Page 19: Capistrano2

on :event, :callback, :only => %w(tasks_to_do) # :load, :exit, :start, :finish, :begin, :after

trigger :notify, current_task

on :notify, :callback

Page 20: Capistrano2

load_paths << "config/deploy"case ENV['STAGE'] when "production" then load "production"when "staging" then load "staging"else abort "unknown stage: #{ENV['STAGE']}"end

Page 21: Capistrano2

before :deploy, :run_tests after "deploy:update_code", :link_database_yml task :run_tests do system "rake" or abort "tests failed"end task :link_database_yml do run "ln -s #{release_path}/config/database.yml #{shared_path}/database.yml" end

Page 22: Capistrano2

Cap

•cap -T

•cap <some task>

•cap invoke COMMAND="df -h"

•cap invoke COMMAND="df -h" ROLES=sd_db

•cap invoke COMMAND="df -h" HOSTS=www.spazidigitali.com

•cap shell

Page 23: Capistrano2

Capify

•Creates a Capfile

•Creates a deploy “configuration” file

capify .

Page 24: Capistrano2

Cap•cap deploy:setup

•cap deploy:check

•cap deploy:cold

•cap deploy:update

•cap deploy:migrate

•cap deploy:start

•cap deploy

•cap deploy:rollback

•cap deploy:migrations

•cap deploy:web:disable

•cap deploy:web:enable

•cap deploy:cleanup

Page 25: Capistrano2

deploy:setup•<deploy_to>

•current

•releases

•200706060120

•200702020815

•shared

•log

•pids

•system

Page 26: Capistrano2

deploy:check

depend :remote, :gem, 'rpdf', '>=1.1.4'depend :remote, :directory, "/tmp/rails"depend :remote, :writable, "/dir/file.log"depend :local, :command, "gem"depend :remote, :command, "mysqldump"

Page 27: Capistrano2

deploy:cold

•copies the code - cap deploy:update

•migrates the database - cap deploy:migrate

•starts the service - cap deploy:start

Page 28: Capistrano2

Variables•:ssh_options

•:application

•:repository

•:scm

•:deploy_via

•:deploy_to

•:revision

•:use_sudo

•:group_writable

•:rake

•:current_path

•:release_path

•:shared_path

Page 29: Capistrano2

Deployment strategies

•Checkout (classic capistrano)

•Remote cache (svn up)

•Export

•Copy (via checkout or export, with compression)

Page 30: Capistrano2

Example**sorta real

Page 31: Capistrano2

That’s all folks

•Luca Mearelli

•http://spazidigitali.com

[email protected]