Upgrade to Pro — share decks privately, control downloads, hide ads and more …

eZ Publish meets Capistrano

eZ Publish meets Capistrano

Presented during the flash talk session at the eZUnConference 2012 in Cologne.

Gives a short feedback on how using Capistrano can be interesting when it comes to deploy eZ Publish application.

It also introduces AlCapON which is a bunch of Capistrano recipes made specially for eZ Publish (still an alpha/poc version)

Arnaud Lafon

October 18, 2012
Tweet

Other Decks in Programming

Transcript

  1. CODE BUG FIX COMMIT TEST OUR CODE TEST CODE FROM

    SOMEONE ELSE jeudi 18 octobre 12
  2. CODE BUG FIX COMMIT TEST OUR CODE LAST MINUTE PATCHES

    TEST CODE FROM SOMEONE ELSE jeudi 18 octobre 12
  3. CODE BUG FIX COMMIT TEST OUR CODE LAST MINUTE PATCHES

    TEST CODE FROM SOMEONE ELSE jeudi 18 octobre 12
  4. What DEPLOYMENT means ? IT HAS TO BE as FAST

    as possible jeudi 18 octobre 12
  5. What DEPLOYMENT means ? IT HAS TO BE as FAST

    as possible RELIABLE jeudi 18 octobre 12
  6. What DEPLOYMENT means ? IT HAS TO BE as FAST

    as possible RELIABLE STABLE jeudi 18 octobre 12
  7. What DEPLOYMENT means ? IT HAS TO BE as FAST

    as possible RELIABLE STABLE IT MUST jeudi 18 octobre 12
  8. What DEPLOYMENT means ? IT HAS TO BE as FAST

    as possible RELIABLE STABLE IT MUST provide ROLLBACK FEATURES jeudi 18 octobre 12
  9. What DEPLOYMENT means ? IT HAS TO BE as FAST

    as possible RELIABLE STABLE IT MUST provide ROLLBACK FEATURES deal with MULTIPLE ENVIRONMENTS jeudi 18 octobre 12
  10. What DEPLOYMENT means ? IT HAS TO BE as FAST

    as possible RELIABLE STABLE IT MUST provide ROLLBACK FEATURES var/ FOLDERS take of your deal with MULTIPLE ENVIRONMENTS jeudi 18 octobre 12
  11. What DEPLOYMENT means ? IT HAS TO BE as FAST

    as possible RELIABLE STABLE IT MUST provide ROLLBACK FEATURES var/ FOLDERS take of your deal with MULTIPLE ENVIRONMENTS OBVIOUSLY, YOU ONLY HAVE ONE PRODUCTION SERVER... NO ??? jeudi 18 octobre 12
  12. What DEPLOYMENT means ? IT HAS TO BE as FAST

    as possible RELIABLE STABLE IT MUST provide ROLLBACK FEATURES var/ FOLDERS take of your deal with MULTIPLE ENVIRONMENTS OBVIOUSLY, YOU ONLY HAVE ONE PRODUCTION SERVER... NO ??? be able to manage MORE THAN 1 SERVER jeudi 18 octobre 12
  13. DEPLOYMENT PROCESS - example Pre-deployment operations REPLACE THIS WITH YOUR

    OWN PROCESSES USERS TESTS CONTINUOUS INTEGRATION jeudi 18 octobre 12
  14. DEPLOYMENT PROCESS - example Source code operations Pre-deployment operations REPLACE

    THIS WITH YOUR OWN PROCESSES USERS TESTS CONTINUOUS INTEGRATION jeudi 18 octobre 12
  15. DEPLOYMENT PROCESS - example Source code operations TAG GIT PUSH

    on a ref. repository anything... Pre-deployment operations REPLACE THIS WITH YOUR OWN PROCESSES USERS TESTS CONTINUOUS INTEGRATION jeudi 18 octobre 12
  16. DEPLOYMENT PROCESS - example Source code operations TAG GIT PUSH

    on a ref. repository anything... Pre-deployment operations REPLACE THIS WITH YOUR OWN PROCESSES USERS TESTS CONTINUOUS INTEGRATION Production servers operations jeudi 18 octobre 12
  17. DEPLOYMENT PROCESS - example Source code operations TAG GIT PUSH

    on a ref. repository anything... Pre-deployment operations REPLACE THIS WITH YOUR OWN PROCESSES USERS TESTS CONTINUOUS INTEGRATION Production servers operations UPDATE SOURCE CODE WARM UP CACHE GO LIVE with the new version jeudi 18 octobre 12
  18. CAPISTRAwhat ? CAPISTRANO IS JUST A BUNCH OF SCRIPTS IS

    WRITTEN IN RUBY FOR RAILS HAS MULTIPLE DEPLOYMENT STRATEGY jeudi 18 octobre 12
  19. CAPISTRAwhat ? WORKS WITH GIT SVN ... CAPISTRANO IS JUST

    A BUNCH OF SCRIPTS IS WRITTEN IN RUBY FOR RAILS HAS MULTIPLE DEPLOYMENT STRATEGY jeudi 18 octobre 12
  20. CAPISTRAwhat ? WORKS WITH GIT SVN ... COMMAND LINE BASED

    CAPISTRANO IS JUST A BUNCH OF SCRIPTS IS WRITTEN IN RUBY FOR RAILS HAS MULTIPLE DEPLOYMENT STRATEGY jeudi 18 octobre 12
  21. CAPISTRAwhat ? WORKS WITH GIT SVN ... COMMAND LINE BASED

    CAPISTRANO IS JUST A BUNCH OF SCRIPTS IS WRITTEN IN RUBY FOR RAILS HAS MULTIPLE DEPLOYMENT STRATEGY VERY BASIC REQUIREMENTS jeudi 18 octobre 12
  22. CAPISTRAwhat ? WORKS WITH GIT SVN ... COMMAND LINE BASED

    CAPISTRANO IS JUST A BUNCH OF SCRIPTS IS WRITTEN IN RUBY FOR RAILS HAS MULTIPLE DEPLOYMENT STRATEGY VERY BASIC REQUIREMENTS LOCAL MACHINE RUBY jeudi 18 octobre 12
  23. CAPISTRAwhat ? WORKS WITH GIT SVN ... COMMAND LINE BASED

    CAPISTRANO IS JUST A BUNCH OF SCRIPTS IS WRITTEN IN RUBY FOR RAILS HAS MULTIPLE DEPLOYMENT STRATEGY VERY BASIC REQUIREMENTS LOCAL MACHINE RUBY REMOTE SERVERS SSH SERVER NO RUBY REQUIRED UNIX-LIKE OS jeudi 18 octobre 12
  24. BEFORE & AFTER TRIGGERS BASED ON TASKS setup check deploy:default

    deploy:update deploy:update_code deploy:finalize_code deploy:symlink deploy:restart jeudi 18 octobre 12
  25. BEFORE & AFTER TRIGGERS BUILDS & SENDS REQUESTS OVER SSH

    BASED ON TASKS setup check deploy:default deploy:update deploy:update_code deploy:finalize_code deploy:symlink deploy:restart jeudi 18 octobre 12
  26. BEFORE & AFTER TRIGGERS BUILDS & SENDS REQUESTS OVER SSH

    MAKES USE OF SYMLINKS BASED ON TASKS setup check deploy:default deploy:update deploy:update_code deploy:finalize_code deploy:symlink deploy:restart jeudi 18 octobre 12
  27. BEFORE & AFTER TRIGGERS BUILDS & SENDS REQUESTS OVER SSH

    MAKES USE OF SYMLINKS BASED ON TASKS setup check deploy:default deploy:update deploy:update_code deploy:finalize_code deploy:symlink deploy:restart ROLLBACK jeudi 18 octobre 12
  28. BASIC SETUP RubyGems >= 1.3.x if needed => $ apt-get

    install rubygems Requirements $ gem instal capistrano jeudi 18 octobre 12
  29. BASIC SETUP $ capify . [add] making directory './config' [add]

    writing './config/deploy.rb' [add] writing './Capfile' [done] capified! Capify your app locally RubyGems >= 1.3.x if needed => $ apt-get install rubygems Requirements $ gem instal capistrano jeudi 18 octobre 12
  30. set :application, "myapp" set :repository, "[email protected]:myapp.git" set :deploy_to, "/var/www/#{application}" set

    :user, "deploymentuser" set :branch, "devel" # Or : accurev, bzr, cvs, darcs, git, mercurial, perforce, subversion or none set :scm, :git role :web, "www.myapp.com" # Your HTTP server, Apache/etc role :web, "78.123.21.5" # Another front server role :db, "www.myapp.com",:primary => true # Your main MySQL server role :db, "78.123.21.5" # A slave SQL server config/deploy.rb jeudi 18 octobre 12
  31. require 'capistrano/ext/multistage' set :stages, %w(local devel preproduction production) set :default_stage,

    "devel" config/deploy.rb $ gem install capistrano-ext DEAL WITH MULTISTAGE jeudi 18 octobre 12
  32. require 'capistrano/ext/multistage' set :stages, %w(local devel preproduction production) set :default_stage,

    "devel" config/deploy.rb config/deploy/devel.rb $ gem install capistrano-ext DEAL WITH MULTISTAGE jeudi 18 octobre 12
  33. require 'capistrano/ext/multistage' set :stages, %w(local devel preproduction production) set :default_stage,

    "devel" config/deploy.rb role :web, ‘dev.myapp.com’ config/deploy/devel.rb $ gem install capistrano-ext DEAL WITH MULTISTAGE jeudi 18 octobre 12
  34. require 'capistrano/ext/multistage' set :stages, %w(local devel preproduction production) set :default_stage,

    "devel" config/deploy.rb role :web, ‘dev.myapp.com’ config/deploy/devel.rb config/deploy/qa.rb $ gem install capistrano-ext DEAL WITH MULTISTAGE jeudi 18 octobre 12
  35. require 'capistrano/ext/multistage' set :stages, %w(local devel preproduction production) set :default_stage,

    "devel" config/deploy.rb role :web, ‘dev.myapp.com’ config/deploy/devel.rb config/deploy/preproduction.rb config/deploy/qa.rb $ gem install capistrano-ext DEAL WITH MULTISTAGE jeudi 18 octobre 12
  36. require 'capistrano/ext/multistage' set :stages, %w(local devel preproduction production) set :default_stage,

    "devel" config/deploy.rb role :web, ‘dev.myapp.com’ config/deploy/devel.rb config/deploy/preproduction.rb config/deploy/production.rb config/deploy/qa.rb $ gem install capistrano-ext DEAL WITH MULTISTAGE jeudi 18 octobre 12
  37. require 'capistrano/ext/multistage' set :stages, %w(local devel preproduction production) set :default_stage,

    "devel" config/deploy.rb role :web, ‘dev.myapp.com’ config/deploy/devel.rb config/deploy/preproduction.rb config/deploy/production.rb config/deploy/qa.rb ..... $ gem install capistrano-ext DEAL WITH MULTISTAGE jeudi 18 octobre 12
  38. eZ Publish — Capistrano $ gem install alcapon $ capezit

    . [add] writing './extension/alcapon/config/ezpublish.rb' [add] writing './extension/alcapon/config/deploy.rb' [add] writing './extension/alcapon/config/deploy/production.rb' [add] writing './extension/alcapon/config/deploy/devel.rb' [add] writing './Capfile' [done] Your eZ Publish project is now controlled by AlCapON ! Capezit jeudi 18 octobre 12
  39. eZ Publish — Capistrano $ gem install alcapon $ capezit

    . [add] writing './extension/alcapon/config/ezpublish.rb' [add] writing './extension/alcapon/config/deploy.rb' [add] writing './extension/alcapon/config/deploy/production.rb' [add] writing './extension/alcapon/config/deploy/devel.rb' [add] writing './Capfile' [done] Your eZ Publish project is now controlled by AlCapON ! Capezit Dedicated tasks to eZ jeudi 18 octobre 12
  40. eZ Publish — Capistrano $ gem install alcapon $ capezit

    . [add] writing './extension/alcapon/config/ezpublish.rb' [add] writing './extension/alcapon/config/deploy.rb' [add] writing './extension/alcapon/config/deploy/production.rb' [add] writing './extension/alcapon/config/deploy/devel.rb' [add] writing './Capfile' [done] Your eZ Publish project is now controlled by AlCapON ! Capezit Dedicated tasks to eZ LOCAL jeudi 18 octobre 12
  41. eZ Publish — Capistrano $ gem install alcapon $ capezit

    . [add] writing './extension/alcapon/config/ezpublish.rb' [add] writing './extension/alcapon/config/deploy.rb' [add] writing './extension/alcapon/config/deploy/production.rb' [add] writing './extension/alcapon/config/deploy/devel.rb' [add] writing './Capfile' [done] Your eZ Publish project is now controlled by AlCapON ! Capezit Dedicated tasks to eZ LOCAL REMOTE SERVER(S) jeudi 18 octobre 12
  42. eZ Publish — Capistrano $ gem install alcapon $ capezit

    . [add] writing './extension/alcapon/config/ezpublish.rb' [add] writing './extension/alcapon/config/deploy.rb' [add] writing './extension/alcapon/config/deploy/production.rb' [add] writing './extension/alcapon/config/deploy/devel.rb' [add] writing './Capfile' [done] Your eZ Publish project is now controlled by AlCapON ! Capezit Dedicated tasks to eZ LOCAL REMOTE SERVER(S) DATABASE IMPORT EXPORT jeudi 18 octobre 12
  43. eZ Publish — Capistrano $ gem install alcapon $ capezit

    . [add] writing './extension/alcapon/config/ezpublish.rb' [add] writing './extension/alcapon/config/deploy.rb' [add] writing './extension/alcapon/config/deploy/production.rb' [add] writing './extension/alcapon/config/deploy/devel.rb' [add] writing './Capfile' [done] Your eZ Publish project is now controlled by AlCapON ! Capezit Dedicated tasks to eZ LOCAL REMOTE SERVER(S) DATABASE IMPORT EXPORT VAR SYNC jeudi 18 octobre 12
  44. eZ Publish — Capistrano $ gem install alcapon $ capezit

    . [add] writing './extension/alcapon/config/ezpublish.rb' [add] writing './extension/alcapon/config/deploy.rb' [add] writing './extension/alcapon/config/deploy/production.rb' [add] writing './extension/alcapon/config/deploy/devel.rb' [add] writing './Capfile' [done] Your eZ Publish project is now controlled by AlCapON ! Capezit Dedicated tasks to eZ LOCAL REMOTE SERVER(S) DATABASE IMPORT EXPORT VAR SYNC AUTOLOADS & CACHE jeudi 18 octobre 12
  45. eZ Publish — Capistrano $ gem install alcapon $ capezit

    . [add] writing './extension/alcapon/config/ezpublish.rb' [add] writing './extension/alcapon/config/deploy.rb' [add] writing './extension/alcapon/config/deploy/production.rb' [add] writing './extension/alcapon/config/deploy/devel.rb' [add] writing './Capfile' [done] Your eZ Publish project is now controlled by AlCapON ! Capezit Dedicated tasks to eZ LOCAL REMOTE SERVER(S) DATABASE IMPORT EXPORT VAR SYNC AUTOLOADS & CACHE MANAGEMENT jeudi 18 octobre 12
  46. eZ Publish — Capistrano $ gem install alcapon $ capezit

    . [add] writing './extension/alcapon/config/ezpublish.rb' [add] writing './extension/alcapon/config/deploy.rb' [add] writing './extension/alcapon/config/deploy/production.rb' [add] writing './extension/alcapon/config/deploy/devel.rb' [add] writing './Capfile' [done] Your eZ Publish project is now controlled by AlCapON ! Capezit Dedicated tasks to eZ LOCAL REMOTE SERVER(S) DATABASE IMPORT EXPORT VAR SYNC AUTOLOADS & CACHE MANAGEMENT jeudi 18 octobre 12
  47. eZ Publish — Capistrano $ gem install alcapon $ capezit

    . [add] writing './extension/alcapon/config/ezpublish.rb' [add] writing './extension/alcapon/config/deploy.rb' [add] writing './extension/alcapon/config/deploy/production.rb' [add] writing './extension/alcapon/config/deploy/devel.rb' [add] writing './Capfile' [done] Your eZ Publish project is now controlled by AlCapON ! Capezit Dedicated tasks to eZ LOCAL REMOTE SERVER(S) DATABASE IMPORT EXPORT VAR SYNC AUTOLOADS & CACHE MANAGEMENT jeudi 18 octobre 12
  48. eZ Publish — Capistrano $ gem install alcapon $ capezit

    . [add] writing './extension/alcapon/config/ezpublish.rb' [add] writing './extension/alcapon/config/deploy.rb' [add] writing './extension/alcapon/config/deploy/production.rb' [add] writing './extension/alcapon/config/deploy/devel.rb' [add] writing './Capfile' [done] Your eZ Publish project is now controlled by AlCapON ! Capezit Dedicated tasks to eZ LOCAL REMOTE SERVER(S) DATABASE IMPORT EXPORT VAR SYNC AUTOLOADS & CACHE MANAGEMENT jeudi 18 octobre 12
  49. eZ Publish — Capistrano $ gem install alcapon $ capezit

    . [add] writing './extension/alcapon/config/ezpublish.rb' [add] writing './extension/alcapon/config/deploy.rb' [add] writing './extension/alcapon/config/deploy/production.rb' [add] writing './extension/alcapon/config/deploy/devel.rb' [add] writing './Capfile' [done] Your eZ Publish project is now controlled by AlCapON ! Capezit Dedicated tasks to eZ LOCAL REMOTE SERVER(S) DATABASE IMPORT EXPORT VAR SYNC AUTOLOADS & CACHE MANAGEMENT jeudi 18 octobre 12
  50. eZ Publish — Capistrano $ gem install alcapon $ capezit

    . [add] writing './extension/alcapon/config/ezpublish.rb' [add] writing './extension/alcapon/config/deploy.rb' [add] writing './extension/alcapon/config/deploy/production.rb' [add] writing './extension/alcapon/config/deploy/devel.rb' [add] writing './Capfile' [done] Your eZ Publish project is now controlled by AlCapON ! Capezit Dedicated tasks to eZ LOCAL REMOTE SERVER(S) DATABASE IMPORT EXPORT VAR SYNC AUTOLOADS & CACHE MANAGEMENT jeudi 18 octobre 12
  51. OTHER COOL FEATURES depend :remote, :command, "php" depend :remote, :match,

    "php -r \"echo(version_compare(PHP_VERSION,'5.2.14')?'ok':'ko');\"", "ok" depend :remote, :match, "php -m | grep curl", "curl" system check (ezpublish.rb) jeudi 18 octobre 12
  52. OTHER COOL FEATURES depend :remote, :command, "php" depend :remote, :match,

    "php -r \"echo(version_compare(PHP_VERSION,'5.2.14')?'ok':'ko');\"", "ok" depend :remote, :match, "php -m | grep curl", "curl" system check (ezpublish.rb) check if you have local changes jeudi 18 octobre 12
  53. OTHER COOL FEATURES depend :remote, :command, "php" depend :remote, :match,

    "php -r \"echo(version_compare(PHP_VERSION,'5.2.14')?'ok':'ko');\"", "ok" depend :remote, :match, "php -m | grep curl", "curl" system check (ezpublish.rb) check if you have local changes $ cap capez:dev:local_check /Users/alafon/Sites/alcapon-demo/local-install triggering load callbacks * 10:23:51 == Currently executing `devel' triggering start callbacks for `capez:dev:local_check' * 10:23:51 == Currently executing `multistage:ensure' * 10:23:51 == Currently executing `capez:dev:local_check' Checking your local git... You have new files Abort ? y/n (n) n You have 1 commits that need to be pushed Push them before deployment ? y/n (y) n jeudi 18 octobre 12
  54. Cmnd_Alias DEPLOY_SHELLS = /bin/mkdir, /bin/chmod, /bin/chown, / bin/chgrp, /bin/ln, /usr/bin/php

    user ALL=(user) NOPASSWD: DEPLOY_SHELLS user ALL=(apache) NOPASSWD: DEPLOY_SHELLS give specific sudo rights to your deployment user use publickey on the remote server $ ssh-copy-id ~/.ssh/publickkey.pub [email protected] A few tips jeudi 18 octobre 12
  55. Not CLUSTER aware SCM tagging operations during deployment Only MySQL

    supported for backup Permissions issues Enable debug on remotes Not implemented yet ... .... Automated database backup during deployment with ROLLBACK SUPPORT jeudi 18 octobre 12