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
!
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)}"
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
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