2010-09-17 13 views
52

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

Cuando corro cap deploy (después de todo, la otra configuración es necesario), se rompe en 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 
[...] 

Así que parece que no puede encontrar el comando bundle en el servidor.

Sin embargo, al iniciar 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 

... los bundle comando funciona muy bien.

¿Qué podría estar yendo mal?

-

(Por otra parte, para la integridad :)

$ 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 

Respuesta

89

ACTUALIZACIÓN:

Para RVM> = 1.11.3, debe ahora sólo tiene que utilizar el rvm-capistrano gem. Para RVM antiguo> = 1.0.1, la respuesta siguiente sigue siendo válida.


respuesta original:

bien, aunque todavía no he conseguido una completa cap deploy a trabajar, lo hice arreglar este problema . El problema fue Capistrano tratando de usar una ruta diferente para Bundler (y otras gemas) que las rutas RVM.

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

Editar el archivo de Capistrano config/deploy.rb, y añadir las siguientes líneas, por these instructions:

# 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 

que finalmente consiguió Capistrano para ver Bündler y empezar gemas de carga apropiada.

+1

tengo sistema instalado RVM amplia y desplegar con el usuario local. Para que funcione, tengo que asegurarme de que el usuario desde el que estoy implementando haya configurado el rvm correctamente. La solución de problemas de .bashr descrita aquí http://rvm.beginrescueend.com/rvm/install/ ayudó aquí –

+1

Quizás se encuentre aquí si intentó actualizar la integración rvm capistrano de lo que se detalla aquí: http: // ariejan. net/2011/09/14/lighting-fast-zero-downtime-deployments-with-git-capistrano-nginx-and-unicorn? utm_source = rubyweekly & utm_medium = envíe un correo electrónico al nuevo enfoque mencionado en esta respuesta. Si elimina las líneas 'default_environment', asegúrese de eliminar también' default_run_options [: shell] = 'bash'', de lo contrario, no tendrá rvm en el shell capistrano. –

+0

Eso no funciona para mí. Solo eso funciona: set: bundle_cmd, 'source $ HOME/.bash_profile && bundle' – hipertracker

7

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

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' 
+1

Tienes toda la razón. La respuesta esta actualizada. –

2

Yo tenía entendido que el comando bundle no se encuentra porque Capistrano no carga la variable PATH, definida en ~/.bash_profile del usuario.

Para solucionar 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 el camino a los binarios de PostgreSQL - instalación de la gema pg estaba fallando porque no podían encontrar, incluso cuando se pudo encontrar paquete.

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

actualización 23/12

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

Sin embargo, esto todavía no se cargarán porque es un intérprete de no ingreso no interactivo.

Una sugerencia fue agregar las rutas a/etc/bashrc: How do I set $PATH such that `ssh [email protected] command` works?

Sin embargo, esto también no funcionaba 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.

26

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 non-interactive shell. Esta sesión de shell será source .bashrc but not .bash_profile. Agregué una declaración ECHO a ambos y ejecuté un LS a través de SSH. Se puede ver en los resultados siguientes que sólo se Bashrc origen:

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

¿Es una buena práctica siempre obtener su '.bash_profile' de su' .bashrc'? De esta forma, tu '.bash_profile' siempre se obtiene sin importar si se trata de un shell interactivo o no interactivo – user2490003

7

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

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

+4

Hm ... obteniendo un error 'sh: source: not found' ahora. – Vivek

11

tuve un problema idéntico utilizando 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.

0

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 de incluir lo siguiente:

En el archivo de configuración/deploy.rb complemento:

require "bundler/capistrano" 

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

after "deploy", "rvm:trust_rvmrc" 

Este paso asegura que simplemente dejar de recibir la 'qué quiere confiar en el archivo .rvmrc' y llama a una tarea en el despliegue.rb archivo, tales como:

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

Después de poner en estos ligeros cambios que fue capaz de ejecutar cap production deploy cuales desprotegido el código; ejecutó el despliegue de canalización de activos, enlazó la carpeta de lanzamiento con la actual, ejecutó bundle install y lo limpió.

1

Esto se trabajó para mí:

conjunto: bundle_cmd, 'fuente $ HOME/.bash_profile & & paquete'