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

Capistrano iliti kako Rubyem deployati PHP kod

Goran Jurić
December 06, 2012

Capistrano iliti kako Rubyem deployati PHP kod

Goran Jurić

December 06, 2012
Tweet

More Decks by Goran Jurić

Other Decks in Programming

Transcript

  1. Deploying
    Goran Jurić
    • mail: [email protected]
    • twitter: @goran_juric

    View full-size slide

  2. Capistrano
    • Deployanje aplikacije ne mora biti komplicirano!
    • Capistano nije build alat
    • Deployanje na *nix poslužitelje
    • Ruby
    • Client-side aplikacija

    View full-size slide

  3. Ideja
    • razdvojiti foldere i datoteke prema namjeni
    ◦ aplikacija (PHP, templates, ...)
    ◦ site-specific (config, logs, user uploads)
    • update-ati aplikacijske datoteke
    • polinkati site-specific datoteke i foldere
    • promijeniti symbolic link da pokazuje na novu verziju
    • maintenance (clear cache, APC, reload web servera, ...)

    View full-size slide

  4. Implementacija
    /var/www/example.com/
    |--current -> s. l. na zadnji release
    |--releases
    |-----20121124172616
    |-----20121124172617
    |-----20121124172618
    |--shared
    |----cached-copy -> git cache
    |----system -> site specific files
    |------data
    |--------logs
    |------public
    |--------images

    View full-size slide

  5. Prednosti
    • one step deployment
    • atomic operacija
    • automatizacija maintenance poslova
    • deployanje na više poslužitelja od jednom
    • različiti procesi u ovisnosti o namjeni poslužitelja
    • mogućnost rollback-a

    View full-size slide

  6. Instalacija
    • gem install capistrano
    • gem install railsless-deploy

    View full-size slide

  7. Priprema
    ./ Capfile
    |- config/
    |- deploy/
    | |- production.rb
    | |- staging.rb
    |- deploy.rb
    |- railsless-deploy.rb

    View full-size slide

  8. Priprema #2
    Capfile
    1 require "./config/railsless-deploy.rb"
    2 load 'config/deploy' if respond_to?(:namespace)
    railsless-deploy.rb
    https://github.com/leehambley/railsless-deploy

    View full-size slide

  9. Environments
    production.rb
    1 set :production1, "172.16.20.1"
    2 set :production2, "172.16.20.2"
    3 set :deploy_to, "/var/www/#{application}"
    4 set :port, 12345
    5
    6 server production1, :web, :app, :db
    7 server production2, :web, :app, :db
    staging.rb
    1 set :staging1, "192.168.5.1"
    2 set :deploy_to, "/var/www/#{application}"
    3 set :port, 22
    4
    5 server staging1, :web, :app, :db

    View full-size slide

  10. deploy.rb
    1 set :default_stage, "staging"
    2 set :stages, %w(production staging)
    3 require 'capistrano/ext/multistage'
    4
    5 set :application, "example.com" #ime foldera!!
    6
    7 # SCM OPTIONS
    8 set :scm, :git # Može i :svn ili :copy
    9 set :repository, "[email protected]:repo.git"
    10 set :branch, 'master'
    11 #set :scm_password, "some-password" # optional
    12 default_run_options[:pty] = true
    13
    14 # SSH OPTIONS
    15 set :user, "root"
    16 set :use_sudo, false

    View full-size slide

  11. deploy.rb #2
    1 # CAPISTRANO OPTIONS
    2 set :keep_releases, 3
    3 set :deploy_via, :remote_cache
    4 set :copy_exclude, [".git", ".gitignore"]
    5
    6 # APPLICATION SYMBOLIC LINKS
    7 set :app_symlink_folders, ["vendor", "public/images", "data/logs"]
    8 set :app_symlink_files, ["config.php"]
    9
    10 # CUSTOMIZE TASKS
    11 namespace :deploy do
    12
    13 desc "Symlink directories that need to remain between deployments."
    14 task :create_shared_resources do
    15 if app_symlink_folders
    16 app_symlink_folders.each do |link|
    17 run "mkdir -p #{shared_path}/system/#{link}"
    18 end
    19 end
    20 end

    View full-size slide

  12. deploy.rb #3
    1 desc "Customize the finalize_update task"
    2 task :finalize_update, :except => { :no_release => true } do
    3 run "chown -R www-data:www-data #{latest_release}"
    4
    5 symlink_shared_resources
    6 cleanup
    7 end
    8
    9 desc "Symlink folders"
    10 task :symlink_shared_resources, :except => { :no_release => true } do
    11 if app_symlink_folders
    12 app_symlink_folders.each do |link|
    13 run "rm -rf #{latest_release}/#{link}"
    14 run "ln -s #{shared_path}/system/#{link} #{latest_release}/#{link}"
    15 end
    16 end
    17 end
    18
    19 desc "Symlink folders"
    20 ....
    21 end

    View full-size slide

  13. Finalni koraci
    • Prije prvog deploy-a:
    ◦ Promijeniti DocumentRoot (Apache) ili root (nginx) direktivu
    ◦ $ cap production deploy:setup
    ◦ $ cap deploy:setup

    View full-size slide

  14. Napokon
    • Deployanje nove verije:
    ◦ git commit -a -m "Nova verzija"
    ◦ git push
    ◦ cap production deploy
    • Rollback:
    ◦ cap production deploy:rollback

    View full-size slide

  15. Ideje
    • DB migracije (up & down)
    • maintenance stranica prilikom migracija baza
    • composer.phar install/update
    • cache cleanup & warmup

    View full-size slide

  16. Drugi alati
    • Webistrano
    • Fredistrano
    • Deployinator
    • Fabric
    • Strano

    View full-size slide

  17. FPM
    Effing Package Management
    • https://github.com/jordansissel/fpm
    • Creating packages easily (deb, rpm, etc)
    • Tweaking existing packages (removing files, changing metadata/dependencies)
    • Stripping pre/post/maintainer scripts from packages

    View full-size slide

  18. Izvori
    • gem (autodownloaded)
    • python modules (autodownload)
    • pear (autodownload)
    • directories
    • rpm
    • deb
    • node packages (npm)

    View full-size slide

  19. Destinacije
    • deb
    • rpm
    • solaris
    • tar
    • directories

    View full-size slide

  20. Oneliner
    1 gem install fpm
    2 cd /moj-projekt/
    3 fpm -s dir -t deb -a i386 -n rac-api -v ${version} --vendor Ccentar /
    4 --prefix /var/www ./
    Na serveru
    1 dpkg -i rac-api_0.3.5_i386.deb

    View full-size slide

  21. The end
    Hvala
    * mail: [email protected]
    * twitter: @goran_juric
    * blog: http://gogs.info/
    Built with Landslide:
    https://github.com/adamzap/landslide

    View full-size slide