2011-04-04 18 views
11

Cuando ejecuto cap deploy:update aparece el siguiente error que indica que bundle no se encuentra. Cuando ejecuto echo $PATH desde cap shell, falta la ruta /var/lib/gems/1.9.1/bin que contiene el paquete, sin embargo, esta ruta está en /etc/profile y ~/.bashrc. ¿Alguién sabe como solucionar este problema?Error de 'Paquete no encontrado' de Capistrano durante la implementación

[192.168.10.100] executing command 
*** [err :: 192.168.10.100] sh: 
*** [err :: 192.168.10.100] bundle: not found 
*** [err :: 192.168.10.100] 
    command finished in 25ms 
failed: "sh -c 'bundle install --gemfile /data/www/apps/my_app/releases/201104 
04163717/Gemfile --path /data/www/apps/my_apps/shared/bundle --deployment --qui 
et --without development test'" on 192.168.10.100 

Respuesta

1

¿Has instalado manualmente la gema bundler en la caja remota? No puede usar el comando bundle ni instalar ningún paquete hasta que lo haga.

1

¿Estás utilizando RVM?

daneses algunas soluciones posibles:

lugar

require "bundler/capistrano" 

en su guión como bundler ahora tiene soporte para Capistrano https://github.com/carlhuda/bundler/blob/1-0-stable/lib/bundler/capistrano.rb

Y tal

before "deploy:cold", 
    "deploy:install_bundler" 

task :install_bundler, :roles => :app do 
    run "type -P bundle &>/dev/null || { gem install bundler --no-rdoc --no-ri; }" 
end 

La tarea install_bundler se solo se installe d si no se encuentra.

12

Ok, recientemente he tenido algo de experiencia con esto. Parece que hay un par de formas en que este problema puede ser resuelto. En primer lugar, puede determinar si, de hecho, la ejecución remota (a través de Capistrano) es lo que está mal en comparación con el propio host. Parece que ha hecho esto con el shell remoto de Capistrano:

$ cap shell 
    > echo $PATH 

Bueno. Apuesto a que cuando inicie sesión en la máquina y 'echo $ PATH' allí, saldrá lo correcto ... lo mismo aquí.

He encontrado dos formas de solucionar esto: una es habilitar la ejecución del entorno en el demonio ssh del host remoto. En teoría, esto funcionaría, pero no quería preguntarle al administrador de sistemas si estaba bien abrirlo. Básicamente, edite los archivos de configuración ssh para configurar 'PermitUserEnvironment' en 'yes' y agregue las configuraciones de entorno requeridas para implementar el archivo ~/.ssh/environment del usuario; sus páginas man específicas del sistema son probablemente mejores que las que intento generalizar .

Opté por lo que parece bastante hackish, y tiene el inconveniente de que es global para todos los hosts a los que les aplica la aplicación (por lo que si sus ubicaciones ruby ​​/ gems son diferentes en diferentes hosts, esto no funcionará) - pero: he añadido la configuración default_environment a la secuencia de comandos de configuración/deploy.rb:

set :default_environment, { 
    'PATH' => "/usr/local/bin:/bin:/usr/bin:/bin:/<ruby-dir>/bin", 
    'GEM_HOME' => '<ruby-dir>/lib/ruby/gems/1.8', 
    'GEM_PATH' => '<ruby-dir>lib/ruby/gems/1.8', 
    'BUNDLE_PATH' => '<ruby-dir>/lib/ruby/gems/1.8/gems' 
} 


AMMENDED: It isn't so 'hackish' if you consider the following: 
    - The environment-specific deploy scripts (deploy/foo.rb) can 
    override the default in deploy.rb 
    - PermitUserEnvironment hides the configuration deep in the 
    .ssh directory of the deploy user; :default_environment at 
    least exposes it in the checked-in sources. 

Esto también resuelve el problema de no ser capaz de hacer las tareas del rastrillo remotas, etc., a través de Capistrano. Tenga en cuenta que la joya de Capistrano, al menos la versión que tengo y con mi implementación configurada de la manera "estándar", instalará las gemas en el directorio/shared/bundle , que la aplicación recogerá. El método que describí requiere un subconjunto mínimo de gemas en los directorios del sistema al que hace referencia el entorno predeterminado para que los comandos de Capistrano remotos puedan ejecutar paquetes, rastrillos, etc.

No dijo si estaba usando RVM (mi solución no lo hace); sin embargo, esta solución está muy cerca de una de las soluciones RVM recomendadas. Alternativamente, puede usar la solución 'rvm/capistrano'; busca RVM Capistrano integration en el sitio web de RVM para más detalles.

+0

Esto era muy útil. En mi caso, estaba teniendo un problema similar donde se encontró el paquete, pero Rake no lo estaba, incluso cuando ejecutaba 'bundle exec rake '. Hice una breve modificación en el entorno que se veía así: conjunto: default_environment, { 'PATH' => "/ opt/ruby-ee/bin: $ PATH" } –

+0

Probé estas técnicas y obtuve los mismos errores todavía. otras opciones? – Paul

+0

Vale la pena señalar que ubuntu ahora incluye una salida anticipada en el script .bashrc, por lo que puede no estar cargando su entorno si está agregando variables de ruta hasta el final. Es posible que desee intentar agregar variables de entorno al principio del archivo – Macdiesel

29

Para evitar este problema, debe tener instaladas las versiones más recientes de RVM (actualmente es 1.13.5) en ambos lugares: localmente y en el servidor remoto.

A continuación, compruebe si su deploy.rb tiene

require "rvm/capistrano" 
require "bundler/capistrano" 

Esta línea no se necesita más:

$:.unshift(File.expand_path('./lib', ENV['rvm_path'])) 

la esperanza que esto ayudará

+8

No olvide agregar 'gema' rvm-capistrano '' a su Gemfile –

+0

Acabo de recibir "la tarea' implementar: frío 'no existe' cuando use 'require 'rvm/capistrano" '. Sin embargo, 'require 'capistrano' 'parece funcionar para mí. – Snowcrash

Cuestiones relacionadas