Capistrano: il deploy in 97 secondi
Posted by Michele Tue, 21 Mar 2006 06:10:00 GMT
In principio fu il file batch; poi mi drogai con linux e benedii la bash… anni più tardi venne Ant e pensai che null’altro avrebbe potuto entusiasmarmi tanto, anche se di Maven mi innamorai quasi subito… ma questo weekend ho usato Capistrano.
E’ amore.
Questo utile giocattolo permette di automatizzare la maggior parte delle azioni di deploy su un server remoto, direttamente dalla nostra console locale; in realtà le funzionalità sono mooolto più potenti di queste e si spingono fino all’esecuzione di task arbitrari su più macchine, ma avremo modo di approfondire in un prossimo post.
Ingredienti
Al pari di altri tool basati su rake, l’esecuzione di Capistrano fa una serie di assunzioni:
- Devo connettermi con almeno un server remoto
- La connessione viene fatta attraverso ssh
- Il server supporta comandi POSIX (shell come csh, tcsh o Windows stesso non rientrano in questa categoria)
- In caso di server multipli la password deve essere la stessa su tutte le macchine
- Posso avere necessità di dover fare azioni diverse su macchine diverse
Anche se nasce pensato a rails, nessuno vieta di utilizzare capistrano per deploy di altri applicativi web oppure per il semplice management.
Preparazione
Una volta installato (si può fare comodamente con
gem install capistrano
avendo l’accortezza di installare anche tutte le dipendenze) il primo passo da compiere è aggiungere il supporto ad un’applicazione rails esistente:
cap—apply-to ‘path’
dove ‘path’ indica il percorso della root directory; a questo punto vi troverete il file script/deploy.rb pronto per essere personalizzato. I parametri essenziali sono
set :application, "My happy Blog!"
set :repository, "http://svn.miosito.eu/happyness/trunk"
role :app, "blog.miosito.eu"
role :web, "blog.miosito.eu"
role :db, "blog.miosito.eu"
set :deploy_to, "/var/www/rails/"dove le prime due righe indicano rispettivamente il nome dell’applicativo (arbitrario) e l’url del repository subversion dal quale verranno prelevati i sorgenti, mentre le tre impostazioni dei ruoli specificano i server da usare.
L’ultimo parametro definisce la directory (remota) dove verrà fatto il deploy.
Prima di cominciare con la ricetta vera e propria è necessario preparare il file system sul server di deploy; come? così:
rake remote:setup
ovviamente all’utente deve essere permesso l’accesso in scrittura alla directory indicata dal parametro :deploy_to.
L’utente della vostra macchina non è quello del server? nessun problema, potete personalizzare anche quello con il parametro
set :user, "attila"La ricetta
Per passare all’azione è sufficiente lanciare
rake deploy
metterà online l’ultima versione dell’applicativo prelevata dal repository. Tutto qui ;-)
Se avete contravvenuto alla regola aurea dell’IT1 smettete di bestemmiare sudare e lanciate
rake rollback
per ripristinerete in un lampo la versione che era precedentemente online.
NB: ricordate che ogni azione di deploy crea sul server una cartella con una copia funzionante del vostro applicativo, quindi dopo alcune release potrebbe essere salutare eliminare le copie più vecchie per risparmiare spazio su disco. Potete farlo dalla vostra poltrona preferita lanciando
rake remote:cleanup
in modo da pulire tutte le versioni tranne le ultime cinque.
Ammetto che non ci ho messo esattamente 97 secondi, ma mi avanzano ancora alcuni dei minuti che Capistrano mi ha fatto risparmiare. Moltiplicato per il numero di deploy settimanali credo di avere a disposizione una mezz’oretta… suggerimenti su come investirla?
1 Se tutto funziona non lo toccare. Se lo hai toccato e funzionava, sei spacciato.




Complimenti per l’ottimo post! Se c’è una qualità che va riconosciuta a chi sviluppa ste cose in Ruby è proprio la pragmaticità. Con Maven ad esempio è possibile fare tutto ciò che hai fatto con Capistrano ma non in modo così, diciamo, naturale.
beh a questo punto io che di maven ne conosco la superficie divento curioso su come si potrebbe impostare la ricetta duale… un automated deployment transazionale mi sembra un obiettivo ideale, ma io ho già sudato camicie per capire come modificare le properties per target environment in maven…
un ottimo punto di partenza potrebbe essere questo ;-) scritto direttamente dagli autori di maven2