2011-08-04 12 views
8

estoy usando un sistema de amplia Rubí instalar en mi servidor, y tratando de desplegar en un gemset RVM (como el uso RVM [email protected]_name)Capistrano implementación en todo el sistema rubíes RVM no ver instalados

Cuando Ejecutar mi archivo Cap, Cap pukes y dice que Ruby no está instalado.

Sin embargo,, en realidad, que Ruby está instalado. (El usuario que realiza la implementación es parte del grupo rvm y puede rvm use manualmente en la línea de comandos.)

¿Qué podría estar haciendo mal?

partes pertinentes de Capfile

$:.unshift(File.expand_path('./lib', ENV['rvm_path'])) # Add RVM's lib directory to the load path. 

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

set(:rvm_type)   { :system } 
set(:ruby_version)  { '1.9.2' } 
set(:rvm_ruby_string) { "#{ruby_version}@#{application}" } 
set(:rvm_path)   { "/usr/local/rvm" } 
#set(:rvm_bin_path)  { "#{rvm_path}/bin" } 

before "deploy:setup", "rvm:debug_gemset" 
before "deploy:setup", "bundle:install_gem" 

namespace :rvm do 
    desc "Creates gemset for application" 
    task :debug_gemset do 
    disable_rvm_shell do 
     run "/usr/local/rvm/bin/rvm list rubies" do |ch, stream, data| 
     if stream == :err 
      logger.debug "capured output on STDERR: #{data}" 
     else # stream == :out 
      logger.debug "capured output on STDOUT: #{data}" 
     end 
     end 
    end  
    end 
end 

# We need this so that we can install rvm first! 
def disable_rvm_shell(&block) 
    default_shell = self[:default_shell] 
    self[:default_shell] = nil 
    yield 
    self[:default_shell] = default_shell 
end 

salida Cap

* executing `deploy:setup' 
    triggering before callbacks for `deploy:setup' 
* executing `rvm:debug_gemset' 
* executing "/usr/local/rvm/bin/rvm list rubies" # <----- ran outside of rvm-shell 
    servers: ["XX.XXX.XXX.XXX"] 
Password: 
    [XX.XXX.XXX.XXX] executing command 
* capured output on STDOUT: 
* capured output on STDOUT: rvm rubies 
* capured output on STDOUT: 
* ruby-1.8.7-p352 [ x86_64 ] 
* capured output on STDOUT: 
* ree-1.8.7-2011.03 [ x86_64 ] 
* capured output on STDOUT: 
* ruby-1.9.2-p290 [ x86_64 ] 
* 

Ok, impresionante: 1.9.2 está instalado. (Esto es de esperar - He instalado 1.8.7, 1.9.2 y REE manualmente!)

Pero eso no es todo Capistrano dice ...

command finished 
    * executing `bundle:install_gem' 
    * executing "gem install bundler" 
    servers: ["XX.XXX.XXX.XXX"] 
    [XX.XXX.XXX.XXX] executing command 
** [out ::XX.XXX.XXX.XXX] WARN: ruby ruby-1.9.2-p290 is not installed. 

Esa última línea afirma que no 1.9.2 instalado? !!

** [out ::XX.XXX.XXX.XXX] To install do: 'rvm install ruby-1.9.2-p290' 
*** [err ::XX.XXX.XXX.XXX] ERROR: Gemset 'MY_APP' does not exist, rvm gemset create 'MY_APP' first. 
*** [err ::XX.XXX.XXX.XXX] Error: RVM was unable to use '[email protected]_APP' 
    command finished 
failed: "rvm_path=/usr/local/rvm /usr/local/rvm/bin/rvm-shell '[email protected]_APP' -c 'gem install bundler'" on XX.XXX.XXX.XXX 

Depuración con carcasa de la tapa

Jim Gay pregunta: "¿qué pasa con la depuración con carcasa de la tapa?"

rvm/capinstrano ejecuta comandos a través de rvm-shell, que de inmediato busca la versión y gemset esencialmente antes de que se pueda ejecutar el comando. (Así, el disable_rvm_shell definido anteriormente que se utilizó para hacer el inicial rvm list rubies

Por ejemplo:.?

cap> which rvm 
[establishing connection(s) to XX.XXX.XXX.XX] 
Password: 
** [out :: XX.XXX.XXX.XX] WARN: ruby ruby-1.9.2-p290 is not installed. 
** [out :: XX.XXX.XXX.XX] To install do: 'rvm install ruby-1.9.2-p290' 
*** [err :: XX.XXX.XXX.XX] ERROR: Gemset 'MY_APP' does not exist, rvm gemset create 'MY_APP' first. 
*** [err :: XX.XXX.XXX.XX] Error: RVM was unable to use '[email protected]_APP' 
error: failed: "rvm_path=/usr/local/rvm /usr/local/rvm/bin/rvm-shell '[email protected]_APP' -c 'which rvm'" on XX.XXX.XXX.XX 

Conclusión

obviamente estoy haciendo algo mal, pero lo que

Ajuste 1.9.2 ser el predeterminado Ruby no es una opción, ya que también voy a alojar una aplicación 1.8.7 en este cuadro (idealmente). Es por eso que estoy usando RVM en el nivel del sistema para empezar).

También me aseguré de que el usuario de implementación esté en el grupo RVM, según la documentación de RVM.

+0

Para futuros Googlers: explico exactamente cuál es el problema, y ​​cómo solucionarlo, en una publicación de blog (gracias a la respuesta a continuación): http://blog.wilcoxd.com/blog/2011/08/05/ capistrano-system-wide-rvm-and-creating-gemsets-as-part-of-deploysetup/ – RyanWilcox

Respuesta

7

Este WARN sobre ruby ​​no instalado es un mensaje engañoso, debería decir que no pudo encontrar el par ruby ​​@ gemset. Si desea utilizar este comando en el servidor:

rvm use [email protected]_APP 

se podría ver los mensajes en orden inverso - primer error que la gemset no se puede encontrar, para resolverlo por favor vaya al servidor y ejecutar:

rvm --create use [email protected]_APP 

Lo que creará un gemset para usted, si necesita más ayuda, contáctese con el canal IRC#rvm en los servidores de FreeNode.

+0

Estás en lo correcto. Creé el gemset, o mejor dicho, hice que Capfile creara el gemset, y funcionó. Molesto que el mensaje de error me haya puesto en el camino equivocado, pero gracias por ayudar – RyanWilcox

+0

cómo lo hizo, estoy teniendo el mismo problema, gracias – fenec

+0

eche un vistazo a rvm-capistrano para obtener instrucciones sobre cómo integrar https: // github .com/wayneeseguin/rvm-capistrano/# readme – mpapis

0

bien, así que acabo de tener esta bomba con una versión de parche de ruby ​​diferente. servidor se estaba ejecutando: ruby-1.8.7-p371 y la implementación (cap/rvm-capistrano, no estoy seguro de exactamente) quería rvm install ruby-1.8.7-p374.

Probé la sugerencia gemset en @mpapis, que fue un progreso, pero fue entonces cuando me di cuenta de que me pedía que p374.

por lo que en caso de duda, instale la última versión menor de ruby.

Cuestiones relacionadas