Receta Capistrano para Ruby on Rails

5 de julio, 2016 @ 09:22 — 0 comentariosDescargar PDF

Ésta es una guía rápida en la que te explicamos como hacer deployment de una aplicación Ruby on Rails usando Capistrano, es decir, se trata de una receta o recipe Capistrano para Rails.

Se presupone que ya tienes un entorno local configurado y que ya tienes un proyecto git remoto, como por ejemplo en la forja o en github. También está pensada para usuarios de guebs.com. Si necesitas instrucciones más concretas existe una guía detallada.

Se presupone que ya tienes acceso ssh autenticado con clave pública a tu plan de alojamiento y has creado la aplicación en el panel de hosting. Usaremos para esta guía el nombre miapp. Ya has accedido y has realizado al menos una vez un bundle install.

Paso Previo

  • Es necesario que crees la aplicación ruby en el panel de hosting. Hecho esto, entonces debes acceder a tu plan de alojamiento y realizar lo siguiente
cd ruby ; rm -fr current ; mv miapp current ; ln -s current miapp

Con esto dejaremos el directorio preparado para el deployment con capistrano.

Instalando y configurando capistrano

En primer lugar se debe instalar capistrano en tu proyecto local . Esto se hace incluyendo la gema en tu Gemfile (rails 2.3 y superiores. Aunque en rails 2.3 no se establece un Gemfile por defecto). Añade al final de dicho Gemfile las siguientes líneas:

group :development do
gem 'capistrano'
gem 'capistrano-rails', '~> 1.1'
gem 'capistrano-bundler', '~> 1.1.2'
end

Con la especificación anterior se instalará capistrano, y las gemas capistrano rails y capistrano bundler que contienen diversas herramientas para los deployments.

Ahora debemos ir a la raíz de nuestra aplicación en el equipo local y ejecutar el siguiente comando que instalará los archivos necesarios para que capistrano maneje la aplicación. Debe ser ejecutado en la raíz de la aplicación

cap install

Hoy en día capistrano pregunta al usuario si quiere usar harrow.io. El objeto de esta guía no es este servicio por lo que decimos que no en este momento.

En el archivo Capfile debemos añadir las siguientes líneas:

require 'capistrano/rails'
require 'capistrano/bundler'

Receta para hacer deployment

Hecho esto en el archivo config/deploy.rb  establecermos los siguientes parámetros

set :application, 'miapp'
set :repo_url, 'git@example.com:me/my_repo.git'
set :deploy_to, '/home/usuario_cpanel/ruby'
  • En repo_url escribimos el  repositorio que usaremos. Si estuviéramos usando un repo en el propio plan de alojamiento haríamos uso de file:// para definir el repositorio
set :repo_url, 'file:///home/usuario_cpanel/repodir'
  • En deploy_to introducimos el directorio en que despositaremos la aplicación y sus releases. Si tu plan de alojamiento va a tener una sola aplicación, elige /home/usuario_cpanel/ruby como destino de tu aplicación. Si, en cambio, tu plan de alojamiento va a tener varias aplicaciones, es necesario que elijas otra carpeta de tu plan de alojamiento. Esta guía está pensada para planes de alojamiento con una sola aplicación.

Ahora debemos configurar el archivo config/deploy/production.rb .

server 'tudominio.com', user: 'usuario_cpanel', roles: %w{app db web}, port: 333
set :tmp_dir, '/home/usuario_cpanel/tmp'
set :application, 'miapp'
set :bundle_flags, '--quiet'
set :bundle_bins, %w(rake rails)
set :bundle_path, nil
after :deploy, "deploy:restart"
append :linked_files, "config/database.yml", "otro_archivo"
Gestión de archivos fuera del deployment

Hay algunos archivos que es necesario mantener sólo en el servidor de producción , es decir, en el plan de alojamiento. Estos archivos serán linkados de tal modo por capistrano que esperará que existan en el directorio shared.

Por ejemplo, típicamente especificaremos que el archivo config/database.yml sea uno de estos archivos, por lo que no deberá existir en el repositorio y deberá existir en shared/config/database.yml.

Receta para reiniciar la aplicación

Para que cada vez que se realice un deployment de la aplicación se reinicie, debemos crear el archivo lib/capistrano/tasks/touch.rake con el siguiente contenido:

namespace :deploy do
desc "Reinicia aplicacion"
task :restart do
on roles(:all) do
execute "touch #{ current_path }/tmp/restart.txt"
end
end
end

Hacer deploy

Gracias a las directivas que hemos ido añadiendo, la aplicación se instalará en el lugar que hemos indicado y como hemos indicado. Además tratará de realizar un "bundle install" para instalar las gemas con cambios que se hayan especificado en el nuevo Gemfile en caso de haber cambios e indicará que la aplicación debe ser reiniciada.

Una vez seguidos los pasos anteriores, cada vez que queramos hacer deployment de nuestra aplicación ejecutaremos el siguiente comando en nuestro ordenador:

cap production deploy

Si, por algún motivo, únicamente queremos reiniciar la aplicación:

cap production deploy:restart

Problemas habituales

Advertencias al hacer deploy

En el entorno de guebs.com, cada vez que ejecutemos cap production deploy puede que nos salgan los siguientes mensajes de error que podemos ignorar, no tienen relevancia:

mkdir: cannot create directory `/home/usuario_cpanel/public_html': File exists
stdin: is not a tty
Error en la instalación de gemas

Algunas gemas necesitan compilación, por tanto, hay que activar el acceso a compiladores.

Could not find a JavaScript runtime

Es típico al realizar un bundle install bien manualmente o bien a través de capistrano encontrarse con el siguiente error

Gem Load Error is: Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes.

Podemos solucionar este problema con las siguientes instrucciones:

Como usar nodejs en tu aplicación Ruby a través de la gema execjs

Notas finales

Si encuentras algún error , quieres sugerir alguna mejora o hay algo que quieras comentar sobre esta guía,  agradeceremos que nos dejes un comentario.

Actualizada a día 29 de junio de 2016 para capistrano > 3.x

Etiquetas: