Come automatizzare il rilascio di applicazioni Ruby On Rails usando Capistrano

Introduzione


Se non sei già stanco di ripetere sempre le stesse mansioni banali per aggiornare i server delle tue applicazioni e mettere online il tuo progetto, probabilmente lo diventerai alla fine. La gioia che provi mentre sviluppi il tuo progetto tende a ricevere un colpo abituale quando si tratta delle noiose parti dell’amministrazione di sistema (ad esempio, caricare la tua base di codice, modificare configurazioni, eseguire comandi più e più volte, ecc.)

Ma non temere! Capistrano, lo strumento di automazione delle attività, è qui per aiutarti.

In questo articolo di DigitalOcean, creeremo un setup di server solido come una roccia, eseguendo l’ultima versione di CentOS per ospitare applicazioni Ruby-on-Rails utilizzando Nginx e Passenger. Continueremo imparando come automatizzare il processo di distribuzione – e aggiornamenti – utilizzando lo strumento di automazione basato su Ruby, Capistrano.

Nota: Questo articolo si basa sulla conoscenza del nostro precedente articolo su Capistrano: Automatizzazione delle distribuzioni con Capistrano: Introduzione. Per acquisire una buona conoscenza dello strumento, cosa altamente consigliata se si intende utilizzarlo, si consiglia di leggerlo prima di continuare con questo pezzo. Allo stesso modo, se desideri saperne di più sulla preparazione di un nuovo droplet per le distribuzioni di applicazioni basate su Rails con Passenger (e Nginx), dai un’occhiata all’articolo Come distribuire applicazioni Rails usando Passenger con Nginx.

Nota: Capistrano si basa su Git per le distribuzioni. Per saperne di più, considera la lettura degli articoli della community di DigitalOcean sull’argomento cliccando qui.

Glossario


1. Preparazione del server di distribuzione


  1. Aggiornamento e preparazione del sistema operativo
  2. Configurazione dell’ambiente Ruby e di Rails
  3. Scaricamento e installazione dei server di app e HTTP.
  4. Creazione dello script di gestione di Nginx
  5. Configurazione di Nginx per il deployment dell’applicazione
  6. Scaricamento e installazione di Capistrano
  7. Creazione di un utente di sistema per il deployment

2. Preparazione delle applicazioni Rails per il deployment basato su Git con Capistrano


  1. Creazione di un’applicazione Ruby-On-Rails di base
  2. Creazione di un repository Git

3. Lavorare con Capistrano per automatizzare i deployment


  1. Installazione di Capistrano all’interno della directory del progetto
  2. Lavorare con config/deploy.rb all’interno della directory del progetto
  3. Lavorare con config/deploy/production.rb all’interno della directory del progetto
  4. Deployment sul server di produzione

Preparazione del server di deployment


Nota: Per avere una migliore comprensione della sezione seguente, che può essere considerata un riassunto dettagliato, consulta l’articolo completo sull’argomento: Come Deployare App Rails Utilizzando Passenger Con Nginx.

Aggiornamento E Preparazione Del Sistema Operativo


Esegui il seguente comando per aggiornare gli strumenti predefiniti del tuo droplet basato su CentOS:

yum -y update

Installa il bundle contenente gli strumenti di sviluppo eseguendo il seguente comando:

yum groupinstall -y 'development tools'

Alcuni dei pacchetti di cui abbiamo bisogno per questo tutorial (ad es. libyaml-devel, nginx ecc.) non sono presenti nel repository ufficiale di CentOS.

Esegui quanto segue per aggiungere il repository EPEL:

sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'

yum -y update

Infine, per installare alcune librerie e strumenti aggiuntivi, esegui il seguente comando:

yum install -y curl-devel nano sqlite-devel libyaml-devel

Configurazione Dell’Ambiente Ruby e Rails


Nota: Questa sezione è un riassunto del nostro articolo dedicato Come Installare Ruby 2.1.0 Su CentOS 6.5.

Esegui i seguenti due comandi per installare RVM e creare un ambiente di sistema per Ruby:

curl -L get.rvm.io | bash -s stable

source /etc/profile.d/rvm.sh
rvm reload
rvm install 2.1.0

Poiché Rails ha bisogno di un interprete JavaScript, sarà anche necessario configurare Node.js.

Esegui quanto segue per scaricare e installare nodejs utilizzando yum:

yum install -y nodejs

Esegui il seguente comando utilizzando gem di RubyGems per scaricare e installare rails:

gem install bundler rails

Scaricando e Installando Applicazioni & Server HTTP


Nota: Se il tuo VPS ha meno di 1 GB di RAM, sarà necessario eseguire la seguente procedura semplice per preparare uno spazio disco SWAP di 1024 MB da utilizzare come supporto dati temporaneo (sostituto della RAM). Poiché i server DigitalOcean dispongono di dischi SSD veloci, ciò non costituisce davvero un problema durante l’esecuzione delle attività di installazione dell’applicazione server.

# Crea uno spazio SWAP da 1024 MB
sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo mkswap /swap
sudo swapon /swap

Phusion Passenger


Il gestore dei pacchetti predefinito di Red Hat Linux RPM (RPM Package Manager) include applicazioni contenute in file .rpm. Purtroppo, nel caso di Passenger, sono abbastanza datate. Pertanto, utilizzeremo ancora una volta RubyGem per scaricare e installare l’ultima versione disponibile di Passenger – versione 4.

Usa il seguente comando per semplicemente scaricare e installare Passenger:

gem install passenger

Nginx


Nota: Normalmente, per scaricare e installare Nginx, potresti aggiungere il repository EPEL (come abbiamo già fatto) e ottenere Nginx tramite yum. Tuttavia, per far funzionare Nginx con Passenger, il suo sorgente deve essere compilato con i moduli necessari.

Esegui quanto segue per avviare la compilazione di Nginx con il modulo Passenger nativo:

passenger-install-nginx-module

Dopo aver eseguito il comando, premi Invio e conferma la tua scelta di lingua (cioè Ruby, nel nostro caso). Puoi utilizzare i tasti freccia e la barra spaziatrice per selezionare solo Ruby, se lo desideri.

Use <space> to select.
If the menu doesn't display correctly, ensure that your terminal supports UTF-8.

 ‣ ⬢  Ruby
   ⬢  Python
   ⬢  Node.js
   ⬡  Meteor

Nel passaggio successivo, scegli Elemento 1:

1. Yes: download, compile and install Nginx for me. (recommended)
    The easiest way to get started. A stock Nginx 1.4.4 with Passenger
    support, but with no other additional third party modules, will be
    installed for you to a directory of your choice.

E premi Invio per continuare.

Ora, il sorgente di Nginx verrà scaricato, compilato e installato con il supporto di Passenger.

Nota: Questa azione potrebbe richiedere un po’ di tempo, probabilmente più del previsto!

Creazione dello Script di Gestione di Nginx


Dopo aver compilato Nginx, per controllarlo con facilità, è necessario creare uno script di gestione semplice.

Esegui i seguenti comandi per creare lo script:

nano /etc/rc.d/init.d/nginx

Copia e incolla i seguenti contenuti:

#!/bin/sh
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
[ "$NETWORKING" = "no" ] && exit 0

nginx="/opt/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"

lockfile=/var/lock/subsys/nginx

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    start
}

reload() {
    configtest || return $?
    echo -n $”Reloading $prog: ”
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
    $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

Premi CTRL+X e conferma con Y per salvare ed uscire.

Imposta la modalità di questo script di gestione come eseguibile:

chmod +x /etc/rc.d/init.d/nginx

Configurazione di Nginx per il Deployment dell’Applicazione


In questo ultimo passaggio della configurazione dei nostri server, dobbiamo creare un blocco server di Nginx, che approssimativamente si traduce negli host virtuali di Apache.

Come potresti ricordare di aver visto durante l’installazione di Passenger per Nginx, questa procedura consiste nell’aggiungere un blocco di codice al file di configurazione di Nginx nginx.conf. Per impostazione predefinita, a meno che tu non indichi diversamente, questo file si trova sotto /opt/nginx/conf/nginx.conf.

Digita il seguente comando per aprire questo file di configurazione per modificarlo con l’editor di testo nano:

nano /opt/nginx/conf/nginx.conf

Come primo passaggio, trova il nodo http { e aggiungi quanto segue subito dopo le direttive passenger_root e passenger_ruby:

# Solo per scopi di sviluppo.
# Rimuovi questa linea quando carichi un'applicazione effettiva.
# Solo per scopi di * TESTING *.
passenger_app_env development;    

Scorri verso il basso nel file e trova server { ... Commenta la posizione predefinita, cioè:

..

#    location / {
#            root   html;
#            index  index.html index.htm;
#        }

..

E definisci la tua radice applicativa predefinita:

# Imposta la cartella in cui verrà distribuita la tua applicazione.
# Stiamo utilizzando: /home/deployer/apps/my_app
root              /home/deployer/apps/my_app/public;
passenger_enabled on;

Premi CTRL+X e conferma con Y per salvare ed uscire.

Esegui quanto segue per ricaricare Nginx con la nuova configurazione dell’applicazione:

# !! Ricorda di creare uno script di gestione Nginx
# seguendo l'articolo principale sul deployment di Rails per CentOS
# linkato all'inizio di questa sezione.

/etc/init.d/nginx restart

Per controllare lo stato di Nginx, puoi utilizzare:

/etc/init.d/nginx status

Nota: Per saperne di più su Nginx, consulta Come Configurare il Server Web Nginx su un VPS.

Scaricare ed Installare Capistrano


Una volta che il nostro sistema è pronto, ottenere l’ultima versione di Capistrano, grazie a RubyGems, è un gioco da ragazzi.

Puoi semplicemente utilizzare quanto segue per ottenere Capistrano versione 3:

gem install capistrano

Creazione di un Utente di Sistema per il Deployment


In questo passaggio, creeremo un utente di sistema CentOS per eseguire le azioni di distribuzione. Questo sarà l’utente che Capistrano utilizzerà.

Nota: Per mantenere le cose semplici, creeremo un utente deployer con i privilegi necessari. Per una configurazione più completa, considera di utilizzare l’esempio dei gruppi dalla guida introduttiva di Capistrano.

Crea un nuovo utente di sistema deployer:

adduser deployer

Imposta la password per deployer:

passwd deployer

# Inserisci una password
# Conferma la password

Modifica /etc/sudoers utilizzando l’editor di testo nano:

nano /etc/sudoers

Scorri il file e trova dove è definito root:

..

## La sezione COMANDI potrebbe avere altre opzioni aggiunte.
##
## Consenti a root di eseguire qualsiasi comando ovunque
root    ALL=(ALL)	ALL

..

Aggiungi quanto segue subito dopo root ALL=(ALL) ALL:

deployer ALL=(ALL) ALL

Questa sezione del file /etc/sudoers dovrebbe ora apparire così:

..

## La sezione COMANDI potrebbe avere altre opzioni aggiunte.
##
## Consenti a root di eseguire qualsiasi comando ovunque
root     ALL=(ALL)	ALL
deployer ALL=(ALL) ALL

..

Premi CTRL+X e conferma con Y per salvare ed uscire.

Preparazione delle Applicazioni Rails per la Distribuzione Capistrano Basata su Git


Una volta che abbiamo il nostro sistema pronto, con tutte le applicazioni necessarie configurate e funzionanti correttamente, possiamo passare alla creazione di un’applicazione Rails esemplare da utilizzare come esempio.

Nella seconda fase, creeremo un repository Git e faremo push della base di codice in una posizione centrale e accessibile su Github per permettere a Capistrano di utilizzarla per i rilasci.

Nota: Qui stiamo creando un’applicazione di esempio. Per i rilasci effettivi, dovresti eseguire queste azioni da solo, dopo esserti assicurato che tutto sia stato salvato – giusto per sicurezza! Inoltre, nota che dovrai eseguire Capistrano da una posizione diversa rispetto al server dove l’applicazione deve essere distribuita.

Creazione di una Applicazione Base Ruby-On-Rails


Nota: Il passaggio seguente serve a creare un’applicazione Rails sostitutiva per provare Capistrano.

Avere già installati Ruby e Rails ci permette di avviare con un solo comando.

Esegui il seguente comando per far creare a Rails una nuova applicazione chiamata my_app:

# Crea un'applicazione Rails di esempio
rails new my_app

# Entra nella directory dell'applicazione
cd my_app

# Crea una risorsa di esempio
rails generate scaffold Task title:string note:text

# Crea un database di esempio
RAILS_ENV=development rake db:migrate

Per testare che l’applicazione sia configurata correttamente e che tutto funzioni correttamente, entra nella directory dell’applicazione e avvia un server semplice tramite rails s:

# Entra nella directory dell'applicazione
cd my_app

# Avvia un server semplice
rails s

# Ora dovresti poterlo accedere visitando:
# http://[IP del tuo droplet]:3000

# Per terminare il processo del server,
# premi CTRL+C

Creazione di un repository Git


Nota: Per saperne di più su come lavorare con Git, consulta il tutorial Come utilizzare Git efficacemente sulle pagine della community di DigitalOcean.

Nota: Per seguire questa sezione, avrai bisogno di un account Github. In alternativa, puoi configurare un droplet per ospitare il tuo repository Git seguendo questo articolo di DigitalOcean sull’argomento. Se scegli di farlo, assicurati di utilizzare l’URL pertinente nei file di distribuzione.

Utilizzeremo le istruzioni di esempio fornite da Github per creare un repository di origine.

Esegui i seguenti comandi autoesplicativi all’interno della directory my_app per inizializzare un repository:

# !! Questi comandi devono essere eseguiti sul tuo
#    computer di sviluppo, da dove andrai a
#    effettuare il deploy sul tuo server.
#    Le istruzioni potrebbero variare leggermente a seconda del
#    tuo sistema operativo scelto.
#
#    Assicurati di impostare i percorsi corretti per l'applicazione
#    Altrimenti Nginx potrebbe non riuscire a trovarla.

# Inizializza il repository
git init

# Aggiungi tutti i file al repository
git add .

# Esegui il commit delle modifiche
git commit -m "first commit"

# Aggiungi il link al tuo repository Github 
# Esempio: git remote add origin [email protected]:[nome utente]/[nome progetto].git
git remote add origin [email protected]:user123/my_app.git

# Crea una chiave RSA/SSH
# Segui le istruzioni visualizzate sullo schermo
ssh-keygen -t rsa

# Visualizza il contenuto della chiave e aggiungila al tuo Github
# copiando e incollando dalla sessione remota corrente
# visitando: https://github.com/settings/ssh
# Per saperne di più sul processo,
# visita: https://help.github.com/articles/generating-ssh-keys
cat /root/.ssh/id_rsa.pub

# Imposta le tue informazioni Github
# Username:
# Utilizzo: git config --global user.name "[il tuo nome utente]"
git config --global user.name "user123"

# Email:
# Utilizzo: git config --global user.email "[la tua email]"
git config --global user.email "[email protected]"

# Esegui il push del codice sorgente del progetto sul tuo account Github
git push -u origin master

Lavorare con Capistrano per automatizzare i rilasci


Come ricorderai dal nostro primo articolo su Capistrano, il modo per iniziare a utilizzare la libreria è installarla all’interno della directory del progetto. In questa sezione, vedremo come fare ciò, seguito dalla creazione dei file necessari per configurare i server.

Installazione di Capistrano all’interno della directory del progetto


Un altro passaggio semplice nel nostro articolo è l’installazione dei file di Capistrano. Il comando seguente scaffolderà alcune directory e file da utilizzare dallo strumento per il rilascio.

Esegui il seguente per inizializzare (cioè installare) i file di Capistrano:

cap install

# mkdir -p config/deploy
# creare config/deploy.rb
# creare config/deploy/staging.rb
# creare config/deploy/production.rb
# mkdir -p lib/capistrano/tasks
# Capified

Lavorare con config/deploy.rb All’interno della Directory del Progetto


Il file deploy.rb contiene argomenti e impostazioni pertinenti ai server di distribuzione. Qui, diremo a Capistrano a quale/i server vorremmo connetterci e distribuire e come.

Nota: Quando si modifica il file (o si definiscono le configurazioni), è possibile commentarle o aggiungere nuove righe. Assicurati di non avere alcune impostazioni di esempio che sovrascrivono quelle che stai aggiungendo.

Esegui quanto segue per modificare il file usando l’editor di testo nano:

nano config/deploy.rb

Aggiungi il blocco di codice sottostante, modificandolo per adattarlo alle tue impostazioni personali:

# Definire il nome dell'applicazione
set :application, 'my_app'

# Definire dove Capistrano può accedere al repository di origine
# set :repo_url, 'https://github.com/[nome utente]/[nome applicazione].git'
set :scm, :git
set :repo_url, 'https://github.com/user123/my_app.git'

# Definire dove mettere il codice dell'applicazione
set :deploy_to, "/home/deployer/apps/my_app"

set :pty, true

set :format, :pretty

# Impostare le istruzioni post-deploy qui.
# Una volta completato il deployment, Capistrano
# inizierà a eseguirle come descritto.
# Per saperne di più sulla creazione di attività,
# controlla:
# http://capistranorb.com/

# namespace: deploy do

#   desc 'Riavvia l'applicazione'
#   task :restart do
#     on roles(:app), in: :sequence, wait: 5 do
#       # Il meccanismo di riavvio qui, ad esempio:
#       execute :touch, release_path.join('tmp/restart.txt')
#     end
#   end

#   after :publishing, :restart

#   after :restart, :clear_cache do
#     on roles(:web), in: :groups, limit: 3, wait: 10 do
#       # Qui possiamo fare qualsiasi cosa come:
#       # all'interno di release_path fare
#       #   execute :rake, 'cache:clear'
#       # end
#     end
#   end

# end

Premere CTRL+X e confermare con Y per salvare ed uscire.

Lavorare con config/deploy/production.rb All’interno della directory del progetto


Nota: Similmente a deploy.rb, sarà necessario apportare alcune modifiche al file production.rb. È meglio modificare il codice anziché aggiungere il blocco sottostante.

Esegui il seguente comando per modificare il file utilizzando l’editor di testo nano:

nano config/deploy/production.rb

Inserisci le impostazioni del tuo server, simili a quanto segue:

# Definisci ruoli, utente e indirizzo IP del server di distribuzione
# role :nome, %{[utente]@[indirizzo IP]}
role :app, %w{[email protected]}
role :web, %w{[email protected]}
role :db,  %w{[email protected]}

# Definisci server(i)
server '162.243.74.190', user: 'deployer', roles: %w{web}

# Opzioni SSH
# Vedi la sezione di esempio commentata nel file
# per ulteriori opzioni.
set :ssh_options, {
    forward_agent: false,
    auth_methods: %w(password),
    password: 'user_deployers_password',
    user: 'deployer',
}

Premi CTRL+X e conferma con Y per salvare ed uscire.

Deployment Sul Server di Produzione


Una volta completate le impostazioni, è tempo di distribuire.

Esegui il seguente codice sulla tua macchina di sviluppo per distribuire sul server di produzione. Come definito nei file sopra, Capistrano:

  • Connettersi al server di distribuzione

  • Scarica la sorgente dell’applicazione

  • Esegui le azioni di distribuzione (ad esempio, fai riavviare l’applicazione a Passenger)

cap production deploy

Per saperne di più su Capistrano e su cosa può fare, considera la lettura della documentazione di Capistrano.

<div class=“author”>Inviato da: <a
href=“https://twitter.com/ostezer”>O.S. Tezer</a></div>

Source:
https://www.digitalocean.com/community/tutorials/how-to-automate-ruby-on-rails-application-deployments-using-capistrano