rails deploy ruby-on-rails ruby-on-rails-3 capistrano bundler

ruby-on-rails - deploy capistrano rails



Rails 3-Errores de Bundler/Capistrano (8)

Bundler no se encuentra porque .bash_profile no se está cargando y, por lo tanto, su RUTA es incorrecta. Esto es probablemente porque tiene el script RVM en .bash_profile.

La respuesta simple es mover el script RVM de .bash_profile a .bashrc y Capistrano debería ser capaz de encontrarlo (también verificar que .bash_profile sources .bashrc).

Capistrano usa SSH para ejecutar comandos en el servidor a través de un shell no interactivo . Esta sesión de shell generará .bashrc pero no .bash_profile . Agregué una declaración ECHO a ambos y ejecuté un LS a través de SSH. Puede ver en los resultados a continuación que solo se obtiene .bashrc:

$ ssh [email protected] ls .bashrc loaded git file1 file2

Tengo una aplicación básica de Rails 3 que funciona localmente en mi cuadro de desarrollo, pero quiero probar la implementación desde el principio para asegurarme de que todo funciona. Estoy usando Capistrano para implementar.

Cuando ejecuto la cap deploy (después de toda la otra configuración necesaria), rompe este comando con este error:

[...] * executing ''bundle:install'' * executing "bundle install --gemfile /var/www/trex/releases/20100917172521/Gemfile --path /var/www/trex/shared/bundle --deployment --quiet --without development test" servers: ["www.[my domain].com"] [www.[my domain].com] executing command ** [out :: www.[my domain].com] sh: bundle: command not found command finished [...]

Parece que no puede encontrar el comando de bundle en el servidor.

Sin embargo, cuando inicio sesión en el servidor ...

$ ruby -v ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux] $ rails -v Rails 3.0.0 $ bundle -v Bundler version 1.0.0

... el comando bundle funciona bien.

¿Qué podría estar yendo mal?

-

(Además, para completar :)

$ which ruby ~/.rvm/rubies/ruby-1.9.2-p0/bin/ruby $ which rails ~/.rvm/gems/ruby-1.9.2-p0/bin/rails $ which bundle ~/.rvm/gems/ruby-1.9.2-p0/bin/bundle


Esa última línea en realidad debería ser

set :rvm_type, :user

es decir, el usuario debe ser un símbolo y no una variable; de ​​lo contrario, obtendrá

undefined local variable or method `user''


Este trabajó para mí:

set: bundle_cmd, ''source $ HOME / .bash_profile && bundle''


No rvm/capistrano funcionó para mí. La mejor solución que encontré fue agregar al archivo deploy.rb la siguiente línea (es para RVM que no es para todo el sistema):

set :bundle_cmd, ''source $HOME/.bash_profile && bundle''


Probé algunas de las sugerencias. Tuve problemas para establecer las rutas en el archivo deploy.rb para el entorno RVM. Mi solución final fue incluir lo siguiente:

En el archivo config / deploy.rb, agregue:

require "bundler/capistrano"

También en config / deploy.rb, o en mi caso config / production.rb ya que estaba usando la opción de múltiples etapas para Capistrano

after "deploy", "rvm:trust_rvmrc"

Este paso simplemente garantiza que dejemos de obtener el ''¿desea confiar en el archivo .rvmrc?'' Y llama a una tarea en el archivo deploy.rb, como por ejemplo:

namespace :rvm do task :trust_rvmrc do run "rvm rvmrc trust #{release_path}" end end

Después de realizar estos pequeños cambios, pude ejecutar el cap production deploy que comprobó el código; ejecutó la implementación de la tubería de activos, enlazó la carpeta de lanzamiento con la bundle install ejecutada actual y la limpió.


Según tengo entendido, el comando del paquete no se encuentra porque Capistrano no carga la variable PATH, definida en ~ / .bash_profile del usuario.

Para evitar esto, he creado una tarea: bundle_gems.

task :bundle_gems do run "cd #{deploy_to}/current && export PATH=/usr/local/pgsql/bin:/opt/ruby-enterprise-X.X.X/bin:$PATH && bundle install vendor/gems" end

Tenga en cuenta que también incluyo la ruta a los binarios de PostgreSQL: la instalación de la joya de pg estaba fallando porque no se podían encontrar, incluso cuando se podía encontrar el paquete.

Sin embargo, esto parece un enfoque desordenado. Es de suponer que hay un lugar más "global" para definir rutas a los binarios que no conozco.

Actualización 23/12

Para agregar un directorio a $ PATH para todos los usuarios: https://serverfault.com/questions/102932/adding-a-directory-to-path-in-centos

Sin embargo, esto aún no se cargará porque es un shell no interactivo que no inicia sesión.

Una sugerencia fue agregar las rutas a / etc / bashrc: ¿Cómo configuro $ PATH de modo que funcione `ssh user @ host command`?

Sin embargo, esto tampoco funcionó para mí. Creo que es porque SSH tampoco carga / etc / bashrc.

Otra sugerencia fue editar ~ / .ssh / environment: http://www.ruby-forum.com/topic/79248 . Sin embargo, esto parece casi tan complicado como especificar las rutas en deploy.rb.


Tuve un problema idéntico al usar rbenv. La solución fue tomar las líneas específicas de rbenv de la parte inferior de mi archivo .bashrc y colocarlas en la parte superior. La primera línea de mi archivo .bashrc volvía a abortar si el shell no se estaba ejecutando en modo interactivo.


ACTUALIZAR:

Para RVM> = 1.11.3, ahora debería usar simplemente la gema rvm-capistrano . Para RVM antiguo> = 1.0.1, la respuesta siguiente sigue siendo válida.

RESPUESTA ORIGINAL:

De acuerdo, aunque todavía no he conseguido una cap deploy total para trabajar, solucioné este problema. El problema fue Capistrano tratando de usar una ruta diferente para Bundler (y otras gemas) que las rutas RVM.

Compruebe su camino de Capistrano haciendo cap shell , luego echo $PATH . Probablemente verá su estándar /usr/local/bin y /usr/bin , pero eso no es donde RVM tiene Bundler, et al., Almacenados.

Edite su archivo Capistrano config/deploy.rb y agregue las siguientes líneas, según estas instrucciones :

# Add RVM''s lib directory to the load path. $:.unshift(File.expand_path(''./lib'', ENV[''rvm_path''])) # Load RVM''s capistrano plugin. require "rvm/capistrano" set :rvm_ruby_string, ''1.9.2'' set :rvm_type, :user # Don''t use system-wide RVM

Eso finalmente hizo que Capistrano viera a Bundler y comenzara a cargar gemas apropiadamente.