Slide 1

Slide 1 text

Deploying Web Applications with Capistrano Andrew Turner, @galenandrew joind.in/13561

Slide 2

Slide 2 text

Deployments & Capistrano

Slide 3

Slide 3 text

Common Methods • Server-side Editing • FTP Upload / File Syncing • Remote Repositories • Webhooks / Git Hooks • Third Party Services • Package or Binary • Continuous Integration

Slide 4

Slide 4 text

Challenges • Often a manual process • Varying levels of risk for error • Potential downtime • Little or no history of deployments • Process can be hard to document or easily distribute • Difficult to manage for multiple environments • Updates can be difficult to undo …especially when a deployment crashes the live site!

Slide 5

Slide 5 text

Capistrano is a remote multi-server automation tool …that provides repeatable deployments, versioned releases and easy rollbacks

Slide 6

Slide 6 text

About Capistrano • Installed as a Ruby Gem • Works with any language/project • Easily extensible for custom deployment requirements • Distributable across developers/teams • Includes multi-server and multi-environment deployments

Slide 7

Slide 7 text

How Capistrano Works • Deployment scripts are tracked in project repository • Initiate deployment commands locally • Leverages SSH to connect to server • Deploys code from your remote repository
 (not your local code)

Slide 8

Slide 8 text

How Capistrano Works • Keeps releases in separate directories on server • Live site is a symlink to latest deployed release • Retains log of deployment meta data 
 (who, what, when) • Provides ability to easily rollback releases

Slide 9

Slide 9 text

local server repository local connects to server via SSH server updates project code from repository deploy command is issued on local server issues a new release and logs deployment

Slide 10

Slide 10 text

Getting Started & Configuration

Slide 11

Slide 11 text

local server repository

Slide 12

Slide 12 text

Installation: local gem install capistrano Install Capistrano

Slide 13

Slide 13 text

Set Up / Directory Structure: local cap install Initialize Capistrano in your project ├── Capfile ├── config/ │ ├── deploy/ │ │ ├── production.rb │ │ └── staging.rb │ └── deploy.rb └── lib/ └── capistrano/ └── tasks/ Note: Run this command in the root directory of your project.

Slide 14

Slide 14 text

Configuration Details # Load DSL and set up stages require 'capistrano/setup' # Include default deployment tasks require 'capistrano/deploy' # Include additional tasks from other gems or Capistrano plugins # # require 'capistrano/composer' # require 'capistrano/laravel' # require 'capistrano/npm' # require 'capistrano/grunt' # Load custom tasks from `lib/capistrano/tasks` if you have any defined Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r } Define and load Capistrano dependencies Capfile Documentation: http://capistranorb.com/documentation/getting-started/configuration/

Slide 15

Slide 15 text

Configuration Details # Application Details # ================== set :application, 'my_app_name' set :repo_url, '[email protected]:me/my_repo.git' set :deploy_to, '/var/www/my_app_name' # Shared Assets # ================== set :linked_files, fetch(:linked_files, []).push('.env') set :linked_dirs, fetch(:linked_dirs, []).push('tmp', 'vendor') # Deployment Details # ================== set :scm, :git set :keep_releases, 5 set :log_level, :debug Set global deployment options config/deploy.rb Documentation: http://capistranorb.com/documentation/getting-started/configuration/

Slide 16

Slide 16 text

Configuration Details # Environment Details # ================== set :stage, :production set :branch, 'master' # Server Details # ================== server 'example.com', user: 'deploy', roles: %w{web app db} set :ssh_options, { auth_methods: %w(publickey password), keys: %w(~/.ssh/id_rsa.pub), forward_agent: false } Set environment specific deployment options config/deploy/production.rb Documentation: http://capistranorb.com/documentation/getting-started/configuration/

Slide 17

Slide 17 text

local server repository

Slide 18

Slide 18 text

Set Up / Directory Structure: server Set up / confirm server requirements (cold start) Note: This command is still run locally but must be run after you finish configuring the environment deployment scripts (e.g. config/deploy/production.rb). cap production deploy:check

Slide 19

Slide 19 text

Set Up / Directory Structure: server current is a symlink to the latest deployed release in the releases directory. ├── current ├── releases/ │ ├── 20150330134948/ │ ├── 20150405103040/ │ └── 20150417092653/ ├── repo/ ├── shared/ └── revisions.log IMPORTANT:
 You must configure your server’s web root to point to the current symlink,
 e.g. /var/www/my_app_name/current

Slide 20

Slide 20 text

local server repository

Slide 21

Slide 21 text

Usage

Slide 22

Slide 22 text

Usage Deploy Rollback IMPORTANT:
 When you issue the rollback command, it reverts to the next latest release and 
 deletes the latest (bad) release. cap production deploy:rollback cap production deploy

Slide 23

Slide 23 text

Usage

Slide 24

Slide 24 text

Advanced Features & Customization

Slide 25

Slide 25 text

Custom Tasks & Hooks # Simple Custom Task # ================== namespace :example do task :simple_task_name do on roles(:all) do # Custom task actions info "simple task!” end end end Documentation: http://capistranorb.com/documentation/getting-started/tasks/ # Before/After Hooks (existing custom task) # ================== before :starting, :simple_task_name # Before/After Hooks (inline custom task) # ================== after :finishing, :simple_task_name do on roles(:all) do # Custom task actions info "simple task!” end end

Slide 26

Slide 26 text

Default Tasks cap deploy # Deploy a new release cap deploy:check # Check required files and directories exist cap deploy:check:directories # Check shared and release directories exist cap deploy:check:linked_dirs # Check directories to be linked exist in shared cap deploy:check:linked_files # Check files to be linked exist in shared cap deploy:check:make_linked_dirs # Check directories of files to be linked exist in shared cap deploy:cleanup # Clean up old releases cap deploy:cleanup_rollback # Remove and archive rolled-back release cap deploy:finished # Finished cap deploy:finishing # Finish the deployment, clean up server(s) cap deploy:finishing_rollback # Finish the rollback, clean up server(s) cap deploy:log_revision # Log details of the deploy cap deploy:published # Published cap deploy:publishing # Publish the release cap deploy:revert_release # Revert to previous release timestamp cap deploy:reverted # Reverted cap deploy:reverting # Revert server(s) to previous release cap deploy:rollback # Rollback to previous release cap deploy:set_current_revision # Place a REVISION file in the current release path cap deploy:started # Started cap deploy:starting # Start a deployment, make sure server(s) ready cap deploy:symlink:linked_dirs # Symlink linked directories cap deploy:symlink:linked_files # Symlink linked files cap deploy:symlink:release # Symlink release to current cap deploy:symlink:shared # Symlink files and directories from shared to release cap deploy:updated # Updated cap deploy:updating # Update server(s) by setting up a new release cap install # Install Capistrano, cap install STAGES=staging,production cap --tasks

Slide 27

Slide 27 text

Customizations Use variables to make it DRY Deploy specific commit or default to branch set :branch, ENV['REVISION'] || 'master' set :deploy_to, '/var/www/#{fetch(:application)}/#{fetch(:stage)}' REVISION=b92ec94d87786cc2f34f78e45e158a5391c7f912 cap production deploy Initialize multiple custom stages cap install STAGES=development,qa,staging,production

Slide 28

Slide 28 text

Customizations Integrate with OS X Notification Center Notify Slack about deployments require 'slackistrano' require 'capistrano-nc/nc' set :slack_webhook, 'https://hooks.slack.com/services/XXX/XXX/XXX' https://github.com/supremegolf/slackistrano https://github.com/capistrano/notification-center

Slide 29

Slide 29 text

Additional Resources • Capistrano RB Documentation
 http://capistranorb.com • Capistrano GitHub
 https://github.com/capistrano • Capistrano Plugins
 https://github.com/capistrano-plugins • Capistrano Laravel
 https://github.com/capistrano/laravel • Capistrano Composer
 https://github.com/capistrano/composer • Deploying WordPress with Capistrano
 https://roots.io/screencasts/deploying-wordpress-with-capistrano/ • Slides to this deck
 https://joind.in/13561 or https://speakerdeck.com/galenandrew

Slide 30

Slide 30 text

Thank you! Deploying Web Applications with Capistrano Andrew Turner, @galenandrew joind.in/13561