SlideShare a Scribd company logo
Deployment kodu
z Capistrano
Typowy proces
• Aktualizacja kodu
• Konfiguracja
• Instalacja zależności
• Aktualizacja bazy danych
• Uruchomienie aplikacji
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
Problemy
• Plan awaryjny
• Aktualizacja wielu serwerów jednocześnie
• Współdzielenie plików pomiędzy releasami
• Zero downtime
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
Instalacja
$ gem install capistrano	
$ cap install	
!
Instalacja
"## Capfile	
"## config	
$ "## deploy	
$ $ "## production.rb	
$ $ %## staging.rb	
$ %## deploy.rb	
%## lib	
%## capistrano	
%## tasks
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 }
deploy.rb
set :application, "my_app"	
set :scm, "git"	
set :repo_url, 	
	 "git@github.com/me/my_app.git"	
!
set :branch, "master"	
set :deploy_to, 	
	 "/var/www/my_app"
deploy.rb
set :application, "my_app"	
set :scm, "git"	
set :repo_url, 	
	 "git@github.com/me/my_app.git"	
!
set :branch, "master"	
set :deploy_to, 	
	 "/var/www/#{fetch(:application)}"
production.rb
role :app, %w{user@s1.com user@s2.com}	
role :web, %w{user@s1.com}	
role :db, %w{user@s1.com}
Zadania
$ cap -T	
cap deploy	
cap deploy:check	
cap deploy:rollback	
!
$ cap production deploy	
$ cap production deploy:check
Setup serwera
$ mkdir -p /var/www/my_app	
$ chown -R deploy /var/www/my_app
Setup serwera
/var/www/my_app	
"## releases	
%## shared	
"## bin	
"## config	
"## log	
"## public	
"## tmp	
%## vendor
Deployment
/var/www/my_app	
"## current (-> releases/20140521130616)	
"## releases	
$ %## 20140521130616	
"## repo	
"## releases.log 	
%## shared
revisions.log
$ cat revisions.log	
Branch master (at 3fa7748) deployed as
release 20140521130616 by michal
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"
Zadania
namespace :deploy do	
	 task :my_task do	
	 	 # treść	
	 end	
end
check_uptime
on release_roles(:all) do |host|	
info "Running my task on #{host}"	
execute :uptime	
end
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
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
Rollback
deploy:starting	
deploy:started	
deploy:reverting	
deploy:reverted	
deploy:publishing	
deploy:published	
deploy:finishing_rollback	
deploy:finished
Ruby on Rails Flow
deploy	
deploy:starting	
deploy:started	
deploy:updating	
deploy:updated	
deploy:publishing	
deploy:published	
deploy:finishing	
deploy:finished
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
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
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
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
Ruby on Rails Flow
deploy	
deploy:starting	
deploy:started	
deploy:updating	
deploy:updated 	
deploy:publishing	
deploy:published	
deploy:finishing	
deploy:cleanup	
deploy:finished
Ruby on Rails Flow
deploy	
deploy:starting	
deploy:started	
deploy:updating	
deploy:updated 	
deploy:publishing 	
deploy:published	
deploy:finishing	
deploy:finished	
deploy:log_revision
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
Pytania?
Michał Szajbe
!
monterail.com
!
@szajbus

More Related Content

What's hot

Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
Laravel Poland MeetUp
 
Ansible w praktyce
Ansible w praktyceAnsible w praktyce
Ansible w praktyce
Kamil Grabowski
 
Websockety w PHP
Websockety w PHPWebsockety w PHP
Websockety w PHP
The Software House
 
Ansible - Automatyzacja zadań IT
Ansible - Automatyzacja zadań ITAnsible - Automatyzacja zadań IT
Ansible - Automatyzacja zadań IT
Kamil Grabowski
 
Testowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStackTestowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStack
The Software House
 
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PROIDEA
 
Infrastructure As Code
Infrastructure As CodeInfrastructure As Code
Infrastructure As Code
Kamil Grabowski
 
Jak poprawić Core Web Vitals w aplikacji Next.js
Jak poprawić Core Web Vitals w aplikacji Next.jsJak poprawić Core Web Vitals w aplikacji Next.js
Jak poprawić Core Web Vitals w aplikacji Next.js
The Software House
 
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwAsynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Luke Adamczewski
 
Service workers - bądź online, nawet kiedy jesteś offline!
Service workers - bądź online, nawet kiedy jesteś offline!Service workers - bądź online, nawet kiedy jesteś offline!
Service workers - bądź online, nawet kiedy jesteś offline!
The Software House
 
Rundeck & Ansible
Rundeck & AnsibleRundeck & Ansible
Rundeck & Ansible
Maciej Lasyk
 
Wprowadzenie do testów wydajnościowych w k6
Wprowadzenie do testów wydajnościowych w k6Wprowadzenie do testów wydajnościowych w k6
Wprowadzenie do testów wydajnościowych w k6
The Software House
 
Szybkie stawianie aplikacji z Elastic Beanstalk
Szybkie stawianie aplikacji z Elastic BeanstalkSzybkie stawianie aplikacji z Elastic Beanstalk
Szybkie stawianie aplikacji z Elastic Beanstalk
The Software House
 
Monitoring sieci
Monitoring sieciMonitoring sieci
Monitoring sieci
Kamil Grabowski
 
Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...
Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...
Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...
HighSolutions Sp. z o.o.
 
Uruchomienie i praca z laravel w wirtualnym kontenerze docker'a
Uruchomienie i praca z laravel w wirtualnym kontenerze docker'aUruchomienie i praca z laravel w wirtualnym kontenerze docker'a
Uruchomienie i praca z laravel w wirtualnym kontenerze docker'a
Laravel Poland MeetUp
 
Obalamy mity o wydajności frameworka Laravel cz. II
Obalamy mity o wydajności frameworka Laravel cz. IIObalamy mity o wydajności frameworka Laravel cz. II
Obalamy mity o wydajności frameworka Laravel cz. II
Laravel Poland MeetUp
 
Itad 2016 aspnet core.pptx
Itad 2016   aspnet core.pptxItad 2016   aspnet core.pptx
Itad 2016 aspnet core.pptx
Michał Michalczuk
 
Hugo - make webdev fun again
Hugo - make webdev fun againHugo - make webdev fun again
Hugo - make webdev fun again
Marcin Gajda
 
Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)
Laravel Poland MeetUp
 

What's hot (20)

Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
 
Ansible w praktyce
Ansible w praktyceAnsible w praktyce
Ansible w praktyce
 
Websockety w PHP
Websockety w PHPWebsockety w PHP
Websockety w PHP
 
Ansible - Automatyzacja zadań IT
Ansible - Automatyzacja zadań ITAnsible - Automatyzacja zadań IT
Ansible - Automatyzacja zadań IT
 
Testowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStackTestowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStack
 
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
 
Infrastructure As Code
Infrastructure As CodeInfrastructure As Code
Infrastructure As Code
 
Jak poprawić Core Web Vitals w aplikacji Next.js
Jak poprawić Core Web Vitals w aplikacji Next.jsJak poprawić Core Web Vitals w aplikacji Next.js
Jak poprawić Core Web Vitals w aplikacji Next.js
 
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwAsynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
 
Service workers - bądź online, nawet kiedy jesteś offline!
Service workers - bądź online, nawet kiedy jesteś offline!Service workers - bądź online, nawet kiedy jesteś offline!
Service workers - bądź online, nawet kiedy jesteś offline!
 
Rundeck & Ansible
Rundeck & AnsibleRundeck & Ansible
Rundeck & Ansible
 
Wprowadzenie do testów wydajnościowych w k6
Wprowadzenie do testów wydajnościowych w k6Wprowadzenie do testów wydajnościowych w k6
Wprowadzenie do testów wydajnościowych w k6
 
Szybkie stawianie aplikacji z Elastic Beanstalk
Szybkie stawianie aplikacji z Elastic BeanstalkSzybkie stawianie aplikacji z Elastic Beanstalk
Szybkie stawianie aplikacji z Elastic Beanstalk
 
Monitoring sieci
Monitoring sieciMonitoring sieci
Monitoring sieci
 
Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...
Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...
Laravel Poznań Meetup #3 - Uruchomienie i praca z Laravel w wirtualnym konten...
 
Uruchomienie i praca z laravel w wirtualnym kontenerze docker'a
Uruchomienie i praca z laravel w wirtualnym kontenerze docker'aUruchomienie i praca z laravel w wirtualnym kontenerze docker'a
Uruchomienie i praca z laravel w wirtualnym kontenerze docker'a
 
Obalamy mity o wydajności frameworka Laravel cz. II
Obalamy mity o wydajności frameworka Laravel cz. IIObalamy mity o wydajności frameworka Laravel cz. II
Obalamy mity o wydajności frameworka Laravel cz. II
 
Itad 2016 aspnet core.pptx
Itad 2016   aspnet core.pptxItad 2016   aspnet core.pptx
Itad 2016 aspnet core.pptx
 
Hugo - make webdev fun again
Hugo - make webdev fun againHugo - make webdev fun again
Hugo - make webdev fun again
 
Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)
 

Similar to Deployment kodu z Capistrano

WordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceWordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyce
Dawid Urbański
 
Mongodb with Rails
Mongodb with RailsMongodb with Rails
Mongodb with Rails
Sebastian Nowak
 
Vagrant - RuPy Tuesday
Vagrant - RuPy TuesdayVagrant - RuPy Tuesday
Vagrant - RuPy TuesdayGaldoMedia
 
Maciej Rudnicki: Zautomatyzowane środowisko deweloperskie.
Maciej Rudnicki: Zautomatyzowane środowisko deweloperskie.Maciej Rudnicki: Zautomatyzowane środowisko deweloperskie.
Maciej Rudnicki: Zautomatyzowane środowisko deweloperskie.Meet Magento Poland
 
Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014
Tomasz Dziuda
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
Mariusz Nowak
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
kraqa
 
Przenieś się do kontenera, czyli korzyści z Docker i Docker Compose
Przenieś się do kontenera, czyli korzyści z Docker i Docker ComposePrzenieś się do kontenera, czyli korzyści z Docker i Docker Compose
Przenieś się do kontenera, czyli korzyści z Docker i Docker Compose
Mariusz Bąk
 
Zastosowanie buildout przy wdrażaniu projektów opartych o framework Django
Zastosowanie buildout przy wdrażaniu projektów opartych o framework DjangoZastosowanie buildout przy wdrażaniu projektów opartych o framework Django
Zastosowanie buildout przy wdrażaniu projektów opartych o framework DjangoDominik Szopa
 
Devbox - wirtualne środowisko pracy
Devbox - wirtualne środowisko pracyDevbox - wirtualne środowisko pracy
Devbox - wirtualne środowisko pracy
Marek Bleschke
 
Using Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationUsing Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentation
Mariusz Koprowski
 
ITAD PolSl 2014 - Nowości w .NET 2015
ITAD PolSl 2014 - Nowości w .NET 2015ITAD PolSl 2014 - Nowości w .NET 2015
ITAD PolSl 2014 - Nowości w .NET 2015
Michał Dudak
 
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScript
Jacek Okrojek
 
ansible kmonticolo bezlogo
ansible kmonticolo bezlogoansible kmonticolo bezlogo
ansible kmonticolo bezlogoKamil Monticolo
 
Automatyzacja tworzenia maszyn wirtualnych Magdalena Wojnarowska
Automatyzacja tworzenia maszyn wirtualnych Magdalena WojnarowskaAutomatyzacja tworzenia maszyn wirtualnych Magdalena Wojnarowska
Automatyzacja tworzenia maszyn wirtualnych Magdalena Wojnarowska
Women in Technology Poland
 
Xdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHPXdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHP
3camp
 
Full Stack JavaScript case study na podstawie Maracuya Jukebox audio player
Full Stack JavaScript case study na podstawie Maracuya Jukebox audio playerFull Stack JavaScript case study na podstawie Maracuya Jukebox audio player
Full Stack JavaScript case study na podstawie Maracuya Jukebox audio playerMarek Będkowski
 
Continuous Integration w konfiguracji urządzeń sieciowych
Continuous Integration w konfiguracji urządzeń sieciowychContinuous Integration w konfiguracji urządzeń sieciowych
Continuous Integration w konfiguracji urządzeń sieciowych
DreamLab
 
Od Zera do Farmera
Od Zera do FarmeraOd Zera do Farmera
Od Zera do Farmera
Filip Dębowski
 

Similar to Deployment kodu z Capistrano (20)

WordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceWordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyce
 
Mongodb with Rails
Mongodb with RailsMongodb with Rails
Mongodb with Rails
 
Vagrant - RuPy Tuesday
Vagrant - RuPy TuesdayVagrant - RuPy Tuesday
Vagrant - RuPy Tuesday
 
Maciej Rudnicki: Zautomatyzowane środowisko deweloperskie.
Maciej Rudnicki: Zautomatyzowane środowisko deweloperskie.Maciej Rudnicki: Zautomatyzowane środowisko deweloperskie.
Maciej Rudnicki: Zautomatyzowane środowisko deweloperskie.
 
Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Przenieś się do kontenera, czyli korzyści z Docker i Docker Compose
Przenieś się do kontenera, czyli korzyści z Docker i Docker ComposePrzenieś się do kontenera, czyli korzyści z Docker i Docker Compose
Przenieś się do kontenera, czyli korzyści z Docker i Docker Compose
 
Zastosowanie buildout przy wdrażaniu projektów opartych o framework Django
Zastosowanie buildout przy wdrażaniu projektów opartych o framework DjangoZastosowanie buildout przy wdrażaniu projektów opartych o framework Django
Zastosowanie buildout przy wdrażaniu projektów opartych o framework Django
 
Devbox - wirtualne środowisko pracy
Devbox - wirtualne środowisko pracyDevbox - wirtualne środowisko pracy
Devbox - wirtualne środowisko pracy
 
Using Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationUsing Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentation
 
Iron Python I Dlr
Iron Python I DlrIron Python I Dlr
Iron Python I Dlr
 
ITAD PolSl 2014 - Nowości w .NET 2015
ITAD PolSl 2014 - Nowości w .NET 2015ITAD PolSl 2014 - Nowości w .NET 2015
ITAD PolSl 2014 - Nowości w .NET 2015
 
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScript
 
ansible kmonticolo bezlogo
ansible kmonticolo bezlogoansible kmonticolo bezlogo
ansible kmonticolo bezlogo
 
Automatyzacja tworzenia maszyn wirtualnych Magdalena Wojnarowska
Automatyzacja tworzenia maszyn wirtualnych Magdalena WojnarowskaAutomatyzacja tworzenia maszyn wirtualnych Magdalena Wojnarowska
Automatyzacja tworzenia maszyn wirtualnych Magdalena Wojnarowska
 
Xdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHPXdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHP
 
Full Stack JavaScript case study na podstawie Maracuya Jukebox audio player
Full Stack JavaScript case study na podstawie Maracuya Jukebox audio playerFull Stack JavaScript case study na podstawie Maracuya Jukebox audio player
Full Stack JavaScript case study na podstawie Maracuya Jukebox audio player
 
Continuous Integration w konfiguracji urządzeń sieciowych
Continuous Integration w konfiguracji urządzeń sieciowychContinuous Integration w konfiguracji urządzeń sieciowych
Continuous Integration w konfiguracji urządzeń sieciowych
 
Od Zera do Farmera
Od Zera do FarmeraOd Zera do Farmera
Od Zera do Farmera
 

Deployment kodu z Capistrano