Capistrano – deploy bez stresa ?!?

Svako ko je bar jednom u životu puštao novu verziju na produkciju zna koliku količinu stresa i angažovanja to nosi. Srećom, postoje alati koji taj posao znatno olakšavaju, jedan od njih je Capistrano.
Kada se u timu koji se bavi razvojem softvera kaže “sutra puštamo novu verziju” – znaš da tog dana sve ostavljaš i da će ceo tim biti posvećen tom zadatku. Po pravilu će se provući bug-ovi koji su već prošli “detaljno” testiranje.
Moraš biti spreman na brzo otklanjanje bug-ova, preskačući sve moguće procedure kako organizacione tako i sigurnosne, i u tome ćeš uvek i samo tada imati podršku nadređenih ;-), samo da produkcija ne bi “kočila”. U najgorem slučaju moraće sve da se vrati u predhodno stanje, što je u velikom inertnom sistemu skoro nemoguća misija.
Capistrano je alat koji količinu stresa, prouzorkovan gore pobrojenim momentima, svodi na podnošljivu meru.
Danas se u krugu web developera smatra prevaziđenim korišćenje FTP servisa za deploy. Kada se pogubim, koje sam fajlove menjao i koje treba preneti na server, često sam puštao cele foldere na upload pa se onda desi da se provuku i neki folderi koji ne bi trebalo da budu na produkciji i eto problema …
Priznajem teško je odreći se starih navika koliko god bio svestan da su one loše, ipak u ovom slučaju vredi uložiti malo truda, sigurno će se isplatiti. Korišćenje GIT-a u deploy je dosta elegantije rešenje ali ni ono nije potpuno. Ima tu još dosta posla oko rada sa bazom, bekap, puštanje novih skripti … u svakom slučaju dosta rada i dosadnog posla u kome nema mesta za grešku.
Automatski deploy će sve ove stvari raditi glatko za vas, uključujući i gore pomenuti backup. Capistano je napisan u Ruby-u ali se može koristiti za deploy bilo kog jezika. Capistrano se startuje na lokalnoj mašini a postavljanje (deploy) aplikacije se vrši na udaljenom serveru. Moguće je i da se postavljanje vrši sa jednog servera na drugi ili više njih, sve kombinacije su moguće. Ovde ću prikazati jednostavan primer deploya Laravel aplikacije, znači PHP, dovoljno kompleksnog da bi ste shvatili suštinu.

Preduslovi

  • Instaliran Ruby ver .1.9.3. ili noviji na vašoj lokalnoj mašini.
  • Server na koji vršite postavljenje (deploy) vaše aplikacije, mora da ima konfigurisan SSH pristup sa javnim ključem (public key)
  • Laravel 5 aplikaciju i server koji podržava njegovo izvršavanje ( ovde možete pročitati kako se instalira)
  • Instaliran Git na vašoj lokalnoj mašini kao i na serveru. Vaša aplikacija mora biti hostovana na GitHub-u ili nekom drugom git hosting repozitoriju.

Instalacija

Instalirati Capistrano na vašu lokalnu mašinu:

gem install capistrano

Iniciranje Capistrana u vašem projektu:

cap install

Gotovo! Ne može biti lakše. Sada je potrebno konfigurisati server napisati neke deploy skripte i to bi bilo sve 🙂
Prvo ćemo da pogledamo šta je komanda cap install uradila na vašem projektu, t.j. folderu.

Struktura projekta

blog
├── Capfile
|── config
│   ├── deploy
│   │   ├── production.rb
│   │   └── staging.rb
│   └── deploy.rb
└── lib
    └─ capistrano
        └── tasks

Kao što se vidi, kreirani su neki fajlovi i folderi u vašem projektu. Ja ću ukratko objasniti šta svaki fajl sadrži.

  • Capfile: Ovo je prvi fajl koji Capistrano čita kada se pokrene komanda za deploy. On se brine o učitavanju paketa koji sadrže već gotove zadatke ili zasebnih zadataka koji se nalaze u lib/capistrano/tasks.
  • deploy.rb: Konfiguracija koja se odnosi na sve faze može da se podesi u ovom fajlu.
  • production.rb / staging.rb: Ovde možete da konfigurišete pojedine faze koje su namenjene odgovarajućim serverima.

Konfigurisanje

Sada ćemo konfigurisati server i napisati neke skripte koje će postaviti demo aplikaciju blog na server.

staging.rb
# server ip address, username with which you ssh to your server and the roles assigned to this server
server '192.168.10.10', user: 'vagrant', roles: %w{app db web}
# path to deploy the project
set :deploy_to, '/home/vagrant/www/app/blog'
# set some variables that is used in deploy tasks written in deploy.rb
# don't keep the sensetive credentials here; like database name, username and password
# you can use overlay for setting sensetive information.
set :app_path, '/home/vagrant/www/app/blog/current'
set :app_debug, false
set :app_key, 'SomeRandomString'

Za primer spremamo konfiguraciju za samo jedan server koji je na virtuelnoj mašini, Vagrant box – Homestead. Potpuno isti princip je i za druge servere.

 deploy.rb
# config valid only for current version of Capistrano
lock '3.4.0'
# application name
set :application, 'blog'
# repo url to the project
set :repo_url, 'https://github.com/vladimirkonrad/blog'
namespace :environment do
    desc "Set environment variables"
    task :set_variables do
        on roles(:app) do
              puts ("--> Create environment configuration file")
              execute "cat /dev/null > #{fetch(:app_path)}/.env"
              execute "echo APP_DEBUG=#{fetch(:app_debug)} >> #{fetch(:app_path)}/.env"
              execute "echo APP_KEY=#{fetch(:app_key)} >> #{fetch(:app_path)}/.env"
        end
    end
end
namespace :composer do
    desc "Running Composer Install"
    task :install do
        on roles(:app) do
            within release_path do
                execute :composer, "install --no-dev"
                execute :composer, "dumpautoload"
            end
        end
    end
end
namespace :deploy do
  after :updated, "composer:install"
  after :finished, "environment:set_variables"
end

Ovde sam napisao dva zadatka (taska) set_variables i install. Jasno je po njihovom imenu šta ovi zadaci rade. Kada je repozitorijum kloniran sa GitHub-a, paketi se instaliraju putem composera i nakon što je postavljanje (depoly) završeno, setuju se promenljive za to okruženje. Ovo su najjednostavini taskovi, za svaki projekat koji ima specifične zahteve moguće je podesiti posebne zadatke. Ovaj obrazac možete koristiti za pisanje svojih zadataka.

Deploy

Kada budemo imali konfigurisan server i definisane zadatke možemo krenuti dalje sa postavljenjem aplikacije.
U folderu gde nam se nalazi Capistano projekt izvršavamo naredbu.

 cap staging deploy

Umesto staging može da stoji production ili bilo šta drugo. Nakon toga, ako ukucate link definisan za ovu aplikaciju, u vašem browseru videćete te startovanu aplikaciju.

Dodatne informacije