Slide 1

Slide 1 text

Deployment kodu z Capistrano

Slide 2

Slide 2 text

Typowy proces • Aktualizacja kodu • Konfiguracja • Instalacja zależności • Aktualizacja bazy danych • Uruchomienie aplikacji

Slide 3

Slide 3 text

Proste rozwiązanie 1. Pobierz najnowszą wersje kodu 2. Zaktualizuj wartości w plikach konfiguracyjnych 3. Zainstaluj zależne biblioteki A, B i C 4. Uruchom w bazie plik migrate.sql 5. Zrestartuj serwer

Slide 4

Slide 4 text

Problemy • Plan awaryjny • Aktualizacja wielu serwerów jednocześnie • Współdzielenie plików pomiędzy releasami • Zero downtime

Slide 5

Slide 5 text

Capistrano • Narzędzie do zautomatyzowanego zarządzania zdalnymi serwerami • Pozwala w przyjazny sposób definiować i wykonywać zadania lub całe ciągi zadań na zdalnych maszynach • Ruby gem • Nakładka na gem SSHKit

Slide 6

Slide 6 text

Instalacja $ gem install capistrano $ cap install !

Slide 7

Slide 7 text

Instalacja "## Capfile "## config $ "## deploy $ $ "## production.rb $ $ %## staging.rb $ %## deploy.rb %## lib %## capistrano %## tasks

Slide 8

Slide 8 text

Capfile # Load DSL and Setup Up Stages require 'capistrano/setup' ! # Includes default deployment tasks require 'capistrano/deploy' ! # Includes tasks from other gems included in your Gemfile # # require 'capistrano/rails' # require 'capistrano/laravel' # require 'capistrano/symfony' # require 'capistrano/npm' ! # Loads custom tasks from `lib/capistrano/tasks' if you have any defined. Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }

Slide 9

Slide 9 text

deploy.rb set :application, "my_app" set :scm, "git" set :repo_url, "[email protected]/me/my_app.git" ! set :branch, "master" set :deploy_to, "/var/www/my_app"

Slide 10

Slide 10 text

deploy.rb set :application, "my_app" set :scm, "git" set :repo_url, "[email protected]/me/my_app.git" ! set :branch, "master" set :deploy_to, "/var/www/#{fetch(:application)}"

Slide 11

Slide 11 text

production.rb role :app, %w{[email protected] [email protected]} role :web, %w{[email protected]} role :db, %w{[email protected]}

Slide 12

Slide 12 text

Zadania $ cap -T cap deploy cap deploy:check cap deploy:rollback ! $ cap production deploy $ cap production deploy:check

Slide 13

Slide 13 text

Setup serwera $ mkdir -p /var/www/my_app $ chown -R deploy /var/www/my_app

Slide 14

Slide 14 text

Setup serwera /var/www/my_app "## releases %## shared "## bin "## config "## log "## public "## tmp %## vendor

Slide 15

Slide 15 text

Deployment /var/www/my_app "## current (-> releases/20140521130616) "## releases $ %## 20140521130616 "## repo "## releases.log %## shared

Slide 16

Slide 16 text

revisions.log $ cat revisions.log Branch master (at 3fa7748) deployed as release 20140521130616 by michal

Slide 17

Slide 17 text

Przydatne opcje set :linked_files, %w{config/database.yml} ! set :linked_dirs, %w{bin log tmp vendor public/system} ! set :keep_releases, 5 ! ask :branch, "master"

Slide 18

Slide 18 text

Zadania namespace :deploy do task :my_task do # treść end end

Slide 19

Slide 19 text

check_uptime on release_roles(:all) do |host| info "Running my task on #{host}" execute :uptime end

Slide 20

Slide 20 text

Flow # check everything, start a deployment deploy:starting ! # update server(s) with a new release deploy:updating ! # publish the new release deploy:publishing ! # finish the deployment, clean up everything deploy:finishing

Slide 21

Slide 21 text

Flow deploy:starting deploy:started deploy:updating deploy:updated deploy:publishing deploy:published deploy:finishing deploy:finished ! before :starting, :my_task after :finishing, :my_other_task

Slide 22

Slide 22 text

Rollback deploy:starting deploy:started deploy:reverting deploy:reverted deploy:publishing deploy:published deploy:finishing_rollback deploy:finished

Slide 23

Slide 23 text

Ruby on Rails Flow deploy deploy:starting deploy:started deploy:updating deploy:updated deploy:publishing deploy:published deploy:finishing deploy:finished

Slide 24

Slide 24 text

Ruby on Rails Flow deploy deploy:starting [before] deploy:ensure_stage deploy:set_shared_assets deploy:check deploy:started deploy:updating deploy:updated deploy:publishing deploy:published deploy:finishing deploy:finished

Slide 25

Slide 25 text

Ruby on Rails Flow deploy deploy:starting deploy:started deploy:updating git:create_release deploy:symlink:shared deploy:updated deploy:publishing deploy:published deploy:finishing deploy:finished

Slide 26

Slide 26 text

Ruby on Rails Flow deploy deploy:starting deploy:started deploy:updating deploy:updated [before] deploy:bundle [after] deploy:migrate deploy:compile_assets deploy:normalize_assets deploy:publishing deploy:published deploy:finishing deploy:finished

Slide 27

Slide 27 text

Ruby on Rails Flow deploy deploy:starting deploy:started deploy:updating deploy:updated deploy:publishing deploy:symlink:release deploy:restart deploy:published deploy:finishing deploy:finished

Slide 28

Slide 28 text

Ruby on Rails Flow deploy deploy:starting deploy:started deploy:updating deploy:updated deploy:publishing deploy:published deploy:finishing deploy:cleanup deploy:finished

Slide 29

Slide 29 text

Ruby on Rails Flow deploy deploy:starting deploy:started deploy:updating deploy:updated deploy:publishing deploy:published deploy:finishing deploy:finished deploy:log_revision

Slide 30

Slide 30 text

Best practices • Trzymać konfigurację deploymentu w repozytorium • Nie trzymać wrażliwych danych w repozytorium, tylko w shared na serwerze • Kompilować kod na serwerze zamiast trzymać skompilowany kod w repozytorium • Dla customowych zadań napisać hooki do deploy:starting i deploy:reverting • Rozbudować deploy:check o sprawdzanie zależnych bibliotek • Nie próbować zautomatyzować absolutnie wszystkiego

Slide 31

Slide 31 text

Pytania? Michał Szajbe ! monterail.com ! @szajbus