Receta Capistrano Detallada para realizar deployment de tu aplicación Ruby On Rails

29 de junio, 2016 @ 16:46 — 0 comentariosDescargar PDF

Ésta es una guía extensa en la que te explicamos como hacer deployment de una aplicación Ruby on Rails usando Capistrano. Te explicamos todos los pasos necesarios para preparar el entorno y crearte tu propia receta o recipe Capistrano. Para una versión resumida, lee la guía Receta Capistrano para Ruby on Rails.

La guía tiene como objeto que un usuario pueda realizar deployments sencillos de su aplicación con un desarrollo en su equipo local. Si has llegado aquí a través de una búsqueda simple en google o en otro buscador debes tener en cuenta que esta guía está pensada para trabajar en un plan de alojamiento con Ruby On Rails en guebs.com. Algunos de los recursos presentes en esta guía sirven para cualquier aplicación en cualquier sitio, pero otros están pensados específicamente para el servicio de Ruby On Rails  en guebs.com. Si decides usarlos, asegúrate de  comprender lo que hace cada uno de ellos.

Es fundamental acceder via ssh a tu cuenta de hosting

Como acceder vía SSH a tu cuenta

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; rmdir miapp ; ln -s current miapp

Con esto dejaremos el directorio preparado para el deployment con capistrano

Trabajando con git

En primer lugar debes instalar git en tu equipo de desarrollo para que esté disponible. Dependiendo de tu sistema operativo deberás usar algo "yum install git" o bien "dnf install git" para las versiones actuales de Fedora. En entornos debian "apt-get install git " como super usuario o bien con el gestor de software de tu distribución.

En el equipo  donde estés desarrollando tu proyecto, típicamente en un entorno local, debes instalar capistrano, que es tan sencillo como ejecutar el siguiente comando:

gem install capistrano

Ahora en nuestro equipo local debemos crear el repositorio local. Es importante tener en cuenta que los archivos con datos críticos no deben ser commitados al repositorio local, por lo que haremos uso de las capacidades de git para ignorar algunos archivos.

Para ello en raíz de la aplicación crearemos un archivo llamado .gitignore, que contendrá la ruta relativa al archivo database.yml

echo config/database.yml >> .gitignore

Para inicicializar el repositorio realizamos lo siguiente en la raíz de la aplicación:

git init .

git add *

git config user.name "Tu nombre"

git config user.email "raul@midominio.com"

git commit -m "Commit inicial"

En remoto, en la cuenta de hosting, debes también crear un repositorio que será una réplica del que tienes en local. Cuando termines de trabajar en tu equipo local, realizarás un 'push' al remoto, lo que posibilitará que capistrano haga lo necesario.  Para ello realizamos lo mismo que en local, pero con el añadido de que al crear el repositorio añadimos la opción --bare

 

mkdir nombrerepo

git init  --bare .

git config user.name "Tu nombre"

git config user.email "raul@midominio.com"

Antes de proseguir es necesario que tu usuario local del equipo pueda auntenticarse sin introducir un password contra el servicio ssh del plan de alojamiento aquí en guebs.com. Para ello debes  configurar la autenticación de clave pública.

Como acceder vía SSH mediante llave pública

En este punto debemos establecer una relación entre el repositorio local y el repositorio remoto. El repositorio remoto debe ser añadido en tu equipo local en tu repositorio local para que se pueda hacer un "push" posteriormente. El modo de añadirlo es como repostiorio remoto de tu repositorio local

https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes

Debemos ejecutar el siguiente comando por lo tanto en el equipo de desarrollo:

git remote add  identificador ssh://usuario_cpanel@tu_dominio:333/home/usuario_cpanel/nombrerepo

"Identificador" es un nombre corto que identifica al repositorio internamente. tu_dominio debe resolver correctamente, de lo contrario no funcionará correctamente.

Cuando ejecutes "git remote -v" en tu repositorio local deberías ver este nuevo remote que has añadido. Por ejemplo si hubiéramos añadido como identificador 'produccion' veríamos lo siguiente:

produccion ssh://usuario_cpanel@tudominio:333/nombrerepo (fetch)
produccion ssh://usuario_cpanel@tudominio:333/nombrerepo (push)

Ahora es el momento de realizar un "push" de tu proyecto local al repositorio remoto de tu plan de alojamiento. Si el identificador que has asignado fue "produccion", entonces el comando es como sigue:

git push produccion master

Instalando y configurando capistrano

Una vez  tengas  git  instalado y funcionando, debes 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.

Capistrano necesita que el usuario de la máquina local pueda conectar remotamente via ssh usando autenticación de clave ssh, que debería estar ya funcionando si has seguido las instrucciones anteriores.

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'

Hecho esto en el archivo config/deploy.rb debemos configurar una serie de parámetros

set :application, 'myapp'

set :repo_url, 'git@example.com:me/my_repo.git'

set :deploy_to, '/home/usuario_cpanel/ruby'
  • En application establecemos el nombre de la aplicación. Debe ser el nombre que hemos establecido al crear la aplicación en el panel de hosting.
  • En repo_url el repositorio que usaremos. Usaremos el repositorio que hemos creado previamente y que está en la raíz de nuestro plan de alojamiento. Si estuviéramos usando un repo remoto, entonces deberíamos rellenarlo como la directiva ejemplo anterior. Pero esta guía está pensada para tener un repositorio en el propio plan de alojamiento así que hacemos 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, entonces puedes elegir ruby/ como destino de tu aplicación. Todos los archivos residirán entonces dentro de la carpeta ruby y al final del proceso ruby/myapp apuntará  a ruby/current.  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 . En este archivo introduciremos las credenciales y direcciones con las que queremos que capistrano publique. En este caso que estamos describiendo, necesitamos el usuario principal del plan de alojamiento y el nombre de dominio. Además introduciremos la opción adicional "port", que nos servirá para decirle a capistrano que queremos usar el puerto 333 en lugar del estándar 22.

Cómo obtener las credenciales para CPanel desde el panel de hosting

Hemos de crear la siguiente línea sustituyendo donde corresponda

server 'tudominio.com', user: 'usuario_cpanel', roles: %w{app db web}, port: 333

En este archivo también necesitamos configurar el directorio temporal en que se trabajará en remoto. Para ello introducimos la siguiente directiva

set :tmp_dir, '/home/usuario_cpanel/tmp'

Y el nombre de la aplicación que hemos dado al declararla en el panel de hosting. (Sí, también hemos de añadirla en este archivo)

set :application, 'newone'

Tal y como funciona capistrano/bundler, se consume mucho espacio en disco si se usa tal cual sin configurar adicionalmente. Cada release contendra las gemas, por lo que el uso de espacio en disco aumenta bastante. Si establecemos las siguientes directivas, sólo tendremos un set de gemas en el path por defecto del plan, sin que la aplicación las empaquete en cada release

set :bundle_flags, '--quiet' 
set :bundle_bins, %w(rake rails)
set :bundle_path, nil

En el entorno de guebs.com, sin embargo este error seguirá apareciendo: "mkdir: cannot create directory `/home/usuario_cpanel/public_html': File exists"  Es un error que se puede ignorar. También el que indica " stdin: is not a tty"

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.

También podemos hacerlo con aquellos directorios que estén en la misma situación. Para ello disponemos de las opciones linked_dirs y linked_files.  Por ejemplo para añadir el archivo database.yml, en el archivo deploy/production.rb debemos escribir lo siguiente:

append :linked_files, "config/database.yml", "otro_archivo"
Reiniciar la aplicación

Para que cada vez que se realice un deployment de la aplicación ésta 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

Esta tarea puede ser llamada individualmente en cualquier momento con este comando, además de que se ejecutará automáticamente en cada deploy.

cap production deploy:restart

Deploy final

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 en el plan de alojamiento. Pero para que la ejecución sea correcta es necesario que se activen los compiladores :

Activar el acceso a compiladores

 

  • En primer  lugar debemos instalar bundle en el plan de alojamiento, crearemos una tarea para ello.

Crearemos un archivo con el nombre instala_bundle.rake en el directorio de nuestra aplicación lib/capistrano/tasks con el nombre instala_bundle.rake. Lo rellenamos con el siguiente contenido:

 

namespace :setup do

desc "Instala bundle en remoto"
 task :instala_bundle do
 on roles(:all) do
 execute "gem install bundler"
 end
 end
end

 

Una vez lo hemos creado veremos la tarea ejecutando cap production --tasks y podemos ejecutarlo antes de realizar un cap production deploy de la siguiente manera:

cap production setup:instala_bundle

Finalmente haremos deployment de la aplicación . Deberemos ejecutar una sola vez la instalación de bundle

  • La primera vez, en la cual es normal que tarde mucho tiempo.
cap production setup:instala_bundle

cap production deploy

Posteriormente sólo necesitamos hacer deployments normales.

cap production deploy


Problemas comunes

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

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 21 de junio de 2016 para capistrano > 3.x

 

Etiquetas: