Cómo automatizar implementaciones de aplicaciones Ruby On Rails utilizando Capistrano

Introducción


Si aún no estás cansado de repetir las mismas tareas mundanas para actualizar tus servidores de aplicación y llevar tu proyecto en línea, probablemente lo estarás eventualmente. La alegría que sientes al desarrollar tu proyecto tiende a disminuir cuando se trata de las partes aburridas de la administración del sistema (por ejemplo, cargar tu base de código, modificar configuraciones, ejecutar comandos una y otra vez, etc.)

¡Pero no temas! Capistrano, la herramienta de automatización de tareas, está aquí para ayudar.

En este artículo de DigitalOcean, vamos a crear una configuración de servidor sólida como una roca, ejecutando la última versión de CentOS para alojar aplicaciones Ruby-on-Rails utilizando Nginx y Passenger. Continuaremos aprendiendo cómo automatizar el proceso de despliegues – y actualizaciones – utilizando la herramienta de automatización basada en Ruby, Capistrano.

Nota: Este artículo se basa en el conocimiento de nuestro artículo anterior sobre Capistrano: Automatización de implementaciones con Capistrano: Primeros pasos. Para obtener un buen conocimiento de la herramienta, lo cual es muy recomendable si vas a usarla, se te aconseja leerlo antes de continuar con este artículo. Del mismo modo, si deseas aprender más sobre cómo preparar un nuevo droplet para implementaciones de aplicaciones basadas en Rails con Passenger (y Nginx), consulta el artículo Cómo implementar aplicaciones de Rails usando Passenger con Nginx.

Nota: Capistrano depende de Git para las implementaciones. Para obtener más información, considera leer los artículos de la comunidad de DigitalOcean sobre el tema haciendo clic aquí.

Glosario


1. Preparando el servidor de implementación


  1. Actualización y preparación del sistema operativo
  2. Configuración del entorno Ruby y Rails
  3. Descarga e instalación de aplicaciones y servidores HTTP
  4. Creando el Script de Gestión de Nginx
  5. Configurando Nginx Para Implementación de Aplicaciones
  6. Descargando e Instalando Capistrano
  7. Creando un Usuario del Sistema Para Implementación

2. Preparando Aplicaciones de Rails Para Implementación con Capistrano Basado en Git


  1. Creando una Aplicación Básica de Ruby-On-Rails
  2. Creando un Repositorio de Git

3. Trabajando con Capistrano Para Automatizar Implementaciones


  1. Instalando Capistrano Dentro del Directorio del Proyecto
  2. Trabajando con config/deploy.rb Dentro del Directorio del Proyecto
  3. Trabajando con config/deploy/production.rb Dentro del Directorio del Proyecto
  4. Implementando en el Servidor de Producción

Preparando el Servidor de Implementación


Nota: Para tener una mejor comprensión de la siguiente sección, que puede considerarse un resumen extenso, consulte el artículo completo sobre el tema: Cómo implementar aplicaciones Rails usando Passenger con Nginx.

Actualización y preparación del sistema operativo


Ejecute el siguiente comando para actualizar las herramientas predeterminadas de su droplet basado en CentOS:

yum -y update

Instale el paquete que contiene las herramientas de desarrollo ejecutando el siguiente comando:

yum groupinstall -y 'development tools'

Algunos de los paquetes que necesitamos para este tutorial (por ejemplo, libyaml-devel, nginx, etc.) no se encuentran en el repositorio oficial de CentOS.

Ejecute lo siguiente para agregar el repositorio EPEL:

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

yum -y update

Finalmente, para instalar algunas bibliotecas y herramientas adicionales, ejecute el siguiente comando:

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

Configuración del entorno Ruby y Rails


Nota: Esta sección es un resumen de nuestro artículo dedicado Cómo instalar Ruby 2.1.0 en CentOS 6.5.

Ejecute los siguientes dos comandos para instalar RVM y crear un entorno de sistema para Ruby:

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

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

Dado que Rails necesita un intérprete de JavaScript, también necesitaremos configurar Node.js.

Ejecute lo siguiente para descargar e instalar nodejs usando yum:

yum install -y nodejs

Ejecute el siguiente comando utilizando gem de RubyGems para descargar e instalar rails:

gem install bundler rails

Descargando e instalando servidores de aplicaciones y HTTP


Nota: Si su VPS tiene menos de 1 GB de RAM, deberá realizar el siguiente procedimiento sencillo para preparar un espacio de intercambio (SWAP) de disco de 1024 MB para ser utilizado como un soporte de datos temporal (sustituto de RAM). Dado que los servidores de DigitalOcean vienen con discos SSD rápidos, esto realmente no constituye un problema al realizar las tareas de instalación de aplicaciones de servidor.

# Crear un espacio SWAP de 1024 MB
sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo mkswap /swap
sudo swapon /swap

Phusion Passenger


El administrador de paquetes predeterminado de Red Hat Linux RPM (RPM Package Manager) proporciona aplicaciones contenidas en archivos .rpm. Desafortunadamente, en el caso de Passenger, están bastante desactualizadas. Por lo tanto, utilizaremos RubyGem, una vez más, para descargar e instalar la última versión disponible de Passenger, versión 4.

Utiliza el siguiente comando para descargar e instalar Passenger:

gem install passenger

Nginx


Nota: Normalmente, para descargar e instalar Nginx, podrías agregar el repositorio EPEL (como ya hemos hecho) y obtener Nginx a través de yum. Sin embargo, para que Nginx funcione con Passenger, su código fuente debe compilarse con los módulos necesarios.

Ejecuta lo siguiente para comenzar a compilar Nginx con el módulo nativo de Passenger:

passenger-install-nginx-module

Una vez que ejecutes el comando, presiona Enter y confirma tu elección de idioma(s) (es decir, Ruby, en nuestro caso). Puedes usar las teclas de flecha y la barra espaciadora para seleccionar solo Ruby, si lo deseas.

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

 ‣ ⬢  Ruby
   ⬢  Python
   ⬢  Node.js
   ⬡  Meteor

En el siguiente paso, elige Item 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.

Y presiona Enter para continuar.

Ahora, se descargará, compilará e instalará el código fuente de Nginx con soporte para Passenger.

Nota: ¡Esta acción puede llevar un tiempo, probablemente más del que uno desearía o esperaría!

Creación del Script de Gestión de Nginx


Después de compilar Nginx, para poder controlarlo fácilmente, necesitamos crear un script de gestión simple.

Ejecuta los siguientes comandos para crear el script:

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

Copia y pega el siguiente contenido:

#!/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

Presiona CTRL+X y confirma con Y para guardar y salir.

Establece el modo de este script de gestión como ejecutable:

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

Configurando Nginx Para el Despliegue de la Aplicación


En este último paso de configurar nuestros servidores, necesitamos crear un bloque de servidor Nginx, que se traduce aproximadamente a los hosts virtuales de Apache.

Como podrás recordar de la instalación de Passenger en Nginx, este procedimiento consiste en agregar un bloque de código al archivo de configuración de Nginx nginx.conf. Por defecto, a menos que se especifique lo contrario, este archivo se puede encontrar en /opt/nginx/conf/nginx.conf.

Escribe el siguiente comando para abrir este archivo de configuración y editarlo con el editor de texto nano:

nano /opt/nginx/conf/nginx.conf

Como primer paso, encuentra el nodo http { y añade lo siguiente justo después de las directivas passenger_root y passenger_ruby:

# Solo para propósitos de desarrollo.
# Elimina esta línea cuando subas una aplicación real.
# Solo para * PRUEBAS *.
passenger_app_env development;    

Desplázate hacia abajo en el archivo y encuentra server { ... Comenta la ubicación por defecto, es decir:

..

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

..

Y define la raíz de tu aplicación por defecto:

# Establezca la carpeta donde desplegará su aplicación.
# Estamos usando: /home/deployer/apps/my_app
root              /home/deployer/apps/my_app/public;
passenger_enabled on;

Presione CTRL+X y confirme con Y para guardar y salir.

Ejecute lo siguiente para recargar Nginx con la nueva configuración de la aplicación:

# !! Recuerde crear un script de gestión de Nginx
#    siguiendo el artículo principal de implementación de Rails para CentOS
#    vinculado al principio de esta sección.

/etc/init.d/nginx restart

Para verificar el estado de Nginx, puede usar:

/etc/init.d/nginx status

Nota: Para obtener más información sobre Nginx, consulte Cómo Configurar el Servidor Web Nginx en un VPS.

Descarga e Instalación de Capistrano


Una vez que tengamos nuestro sistema listo, obtener la última versión de Capistrano, gracias a RubyGems, es muy fácil.

Simplemente puede usar lo siguiente para obtener la versión 3 de Capistrano:

gem install capistrano

Creación de un Usuario del Sistema para Despliegue


En este paso, vamos a crear un usuario del sistema CentOS para realizar las acciones de implementación. Este será el usuario que utilizará Capistrano.

Nota: Para mantener las cosas básicas, vamos a crear un usuario deployer con los privilegios necesarios. Para una configuración más completa, considera usar el ejemplo de grupos del tutorial de introducción de Capistrano.

Crea un nuevo usuario del sistema deployer:

adduser deployer

Configura la contraseña de deployer:

passwd deployer

# Ingresa una contraseña
# Confirma la contraseña

Edita /etc/sudoers usando el editor de texto nano:

nano /etc/sudoers

Desplázate hacia abajo en el archivo y encuentra donde se define root:

..

## La sección COMMANDS puede tener otras opciones agregadas.
##
## Permite a root ejecutar cualquier comando en cualquier lugar
root    ALL=(ALL)	ALL

..

Agrega lo siguiente justo después de root ALL=(ALL) ALL:

deployer ALL=(ALL) ALL

Esta sección del archivo /etc/sudoers debería verse así ahora:

..

## La sección COMMANDS puede tener otras opciones agregadas.
##
## Permite a root ejecutar cualquier comando en cualquier lugar
root     ALL=(ALL)	ALL
deployer ALL=(ALL) ALL

..

Pulsa CTRL+X y confirma con Y para guardar y salir.

Preparando Aplicaciones Rails Para Implementación de Capistrano Basada en Git


Una vez que tengamos nuestro sistema listo, con todas las aplicaciones necesarias configuradas y funcionando correctamente, podemos pasar a crear una aplicación de Rails ejemplar para usar como muestra.

En la segunda etapa, vamos a crear un repositorio de Git y enviar la base de código a un lugar central y accesible en GitHub para que Capistrano la utilice para implementaciones.

Nota: Aquí, estamos creando una aplicación de muestra. Para las implementaciones reales, debes realizar estas acciones por tu cuenta, después de asegurarte de que todo esté respaldado, ¡por si acaso! Además, ten en cuenta que deberás ejecutar Capistrano desde una ubicación diferente al servidor donde se debe implementar la aplicación.

Creación de una aplicación básica de Ruby-On-Rails


Nota: El siguiente paso es para crear una aplicación de Rails de sustitución para probar Capistrano.

Con Ruby y Rails ya instalados, nos queda solo un comando para comenzar.

Ejecuta el siguiente comando para que Rails cree una nueva aplicación llamada my_app:

# Crear una aplicación de muestra de Rails
rails new my_app

# Ingresar al directorio de la aplicación
cd my_app

# Crear un recurso de muestra
rails generate scaffold Task title:string note:text

# Crear una base de datos de muestra
RAILS_ENV=development rake db:migrate

Para comprobar que su aplicación está configurada correctamente y todo funciona bien, ingrese al directorio de la aplicación y ejecute un servidor simple a través de rails s:

# Ingrese al directorio de la aplicación
cd my_app

# Ejecute un servidor simple
rails s

# Ahora debería poder acceder a él mediante
# visitando: http://[la IP de su droplet]:3000

# Para terminar el proceso del servidor,
# Presione CTRL+C

Creando Un Repositorio Git


Nota: Para aprender más sobre cómo trabajar con Git, consulte el tutorial Cómo Usar Git Eficazmente en las páginas de la comunidad de DigitalOcean.

Nota: Para seguir esta sección, necesitará una cuenta de Github. Alternativamente, puede configurar un droplet para alojar su propio repositorio Git siguiendo este artículo de DigitalOcean sobre el tema. Si decide hacerlo, asegúrese de usar la URL relevante en los archivos de despliegue.

Vamos a utilizar las instrucciones de muestra proporcionadas por Github para crear un repositorio fuente.

Ejecute los siguientes comandos autoexplicativos dentro del directorio my_app para iniciar un repositorio:

# !! Estos comandos deben ejecutarse en
#    tu máquina de desarrollo, desde donde
#    implementarás en tu servidor.
#    Las instrucciones pueden variar ligeramente según
#    tu elección de sistema operativo.
#
#    Asegúrate de establecer las rutas correctas para la aplicación
#    De lo contrario, Nginx podría no poder localizarla.

# Iniciar el repositorio
git init

# Agregar todos los archivos al repositorio
git add .

# Confirmar los cambios
git commit -m "first commit"

# Agregar el enlace de tu repositorio de Github 
# Ejemplo: git remote add origin [email protected]:[nombre de usuario]/[nombre del proyecto].git
git remote add origin [email protected]:user123/my_app.git

# Crear una clave RSA/SSH
# Seguir las instrucciones en pantalla
ssh-keygen -t rsa

# Ver el contenido de la clave y agregarlo a tu Github
# copiando y pegando desde la sesión remota actual
# visitando: https://github.com/settings/ssh
# Para obtener más información sobre el proceso,
# visita: https://help.github.com/articles/generating-ssh-keys
cat /root/.ssh/id_rsa.pub

# Configurar tu información de Github
# Username:
# Uso: git config --global user.name "[tu nombre de usuario]"
git config --global user.name "user123"

# Email:
# Uso: git config --global user.email "[tu correo electrónico]"
git config --global user.email "[email protected]"

# Empujar el código fuente del proyecto a tu cuenta de Github
git push -u origin master

Trabajando con Capistrano para automatizar despliegues


Como recordarás de nuestro primer artículo sobre Capistrano, la forma de comenzar a usar la biblioteca es instalándola dentro del directorio del proyecto. En esta sección, veremos cómo hacer eso, seguido de la creación de archivos necesarios para configurar los servidores.

Instalando Capistrano dentro del directorio del proyecto


Otro paso simple en nuestro artículo es instalar los archivos de Capistrano. El siguiente comando creará algunos directorios y archivos para ser utilizados por la herramienta para el despliegue.

Ejecuta lo siguiente para iniciar (es decir, instalar) los archivos de Capistrano:

cap install

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

Trabajando con config/deploy.rb dentro del directorio del proyecto


El archivo deploy.rb contiene argumentos y configuraciones relevantes para el servidor(es) de implementación. Aquí, le diremos a Capistrano a qué servidor(es) nos gustaría conectarnos e implementar y cómo hacerlo.

Nota: Al editar el archivo (o definir las configuraciones), puedes comentarlas o agregar nuevas líneas. Asegúrate de no tener algunas configuraciones de ejemplo que anulen las que estás agregando.

Ejecuta lo siguiente para editar el archivo usando el editor de texto nano:

nano config/deploy.rb

Agrega el siguiente bloque de código, modificándolo para que se adapte a tus propias configuraciones:

# Define el nombre de la aplicación
set :application, 'my_app'

# Define dónde puede acceder Capistrano al repositorio fuente
# set :repo_url, 'https://github.com/[nombre de usuario]/[nombre de la aplicación].git'
set :scm, :git
set :repo_url, 'https://github.com/user123/my_app.git'

# Define dónde colocar el código de tu aplicación
set :deploy_to, "/home/deployer/apps/my_app"

set :pty, true

set :format, :pretty

# Establece las instrucciones posteriores al despliegue aquí.
# Una vez que se complete el despliegue, Capistrano
# comenzará a realizarlas según se describa.
# Para obtener más información sobre la creación de tareas,
# consulta:
# http://capistranorb.com/

# namespace: deploy do

#   desc 'Reiniciar la aplicación'
#   task :restart do
#     en roles(:app), in: :sequence, wait: 5 do
#       # Tu mecanismo de reinicio aquí, por ejemplo:
#       execute :touch, release_path.join('tmp/restart.txt')
#     end
#   end

#   después de :publishing, :restart

#   después de :restart, :clear_cache do
#     en roles(:web), in: :groups, limit: 3, wait: 10 do
#       # Aquí podemos hacer cualquier cosa como:
#       # dentro de release_path do
#       #   execute :rake, 'cache:clear'
#       # end
#     end
#   end

# end

Pulsa CTRL+X y confirma con Y para guardar y salir.

Trabajando con config/deploy/production.rb dentro del directorio del proyecto


Nota: Similar a deploy.rb, necesitarás hacer algunas modificaciones al archivo production.rb. Es mejor modificar el código en lugar de agregar el bloque a continuación.

Ejecuta lo siguiente para editar el archivo usando el editor de texto nano:

nano config/deploy/production.rb

Ingresa la configuración de tu servidor, similar a la siguiente:

# Definir roles, usuario y dirección IP del servidor de implementación
# role :nombre, %{[usuario]@[dirección IP]}
role :app, %w{[email protected]}
role :web, %w{[email protected]}
role :db,  %w{[email protected]}

# Definir servidor(es)
server '162.243.74.190', user: 'deployer', roles: %w{web}

# Opciones SSH
# Ver la sección de ejemplo comentada en el archivo
# para más opciones.
set :ssh_options, {
    forward_agent: false,
    auth_methods: %w(password),
    password: 'user_deployers_password',
    user: 'deployer',
}

Pulsa CTRL+X y confirma con Y para guardar y salir.

Implementación en el servidor de producción


Una vez que hayamos terminado con la configuración, es hora de implementar.

Ejecuta el siguiente código en tu máquina de desarrollo para implementar en el servidor de producción. Como se define en los archivos anteriores, Capistrano:

  • Se conectará al servidor de implementación

  • Descarga la fuente de la aplicación

  • Realiza las acciones de implementación (por ejemplo, reiniciar la aplicación con Passenger)

cap production deploy

Para obtener más información sobre Capistrano y lo que puede hacer, considera leer la documentación de Capistrano.

<div class=“author”>Enviado por: <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