Я использую общесистемную установку Ruby на своем сервере и пытаюсь выполнить развертывание на наборе RVM (например, rvm использует 1.9.2@gemset_name)
Когда я запускаю свой файл Cap, Cap рвет и говорит, что Ruby не установлен.
Однако на самом деле Ruby установлен. (Пользователь, выполняющий развертывание, является частью группы rvm и может rvm use
в командной строке вручную.)
Что я могу делать неправильно?
Соответствующие части 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
Выход крышки
* 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 ]
*
Ок, круто: 1.9.2 установлена. (Этого и следовало ожидать - 1.8.7, REE и 1.9.2 устанавливал вручную!)
Но это еще не все, что говорит Капистрано...
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.
Последняя строка утверждает, что 1.9.2 не установлена?!!
** [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 '1.9.2@MY_APP'
command finished
failed: "rvm_path=/usr/local/rvm /usr/local/rvm/bin/rvm-shell '1.9.2@MY_APP' -c 'gem install bundler'" on XX.XXX.XXX.XXX
Отладка с помощью cap shell
Джим Гей спрашивает: «А как насчет отладки с помощью cap shell?»
rvm/capinstrano
запускает команды через rvm-shell
, который немедленно ищет версию и набор драгоценных камней, прежде чем команду можно будет выполнить. (Таким образом, disable_rvm_shell
, определенный ранее, который мы использовали для выполнения начального rvm list rubies
.
Например:
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 '1.9.2@MY_APP'
error: failed: "rvm_path=/usr/local/rvm /usr/local/rvm/bin/rvm-shell '1.9.2@MY_APP' -c 'which rvm'" on XX.XXX.XXX.XX
Вывод
Я явно что-то делаю не так, но что?
Установка 1.9.2 в качестве Ruby по умолчанию не вариант, так как я также собираюсь разместить приложение 1.8.7 на этом поле (в идеале). Вот почему я для начала использую RVM на системном уровне).
Я также убедился, что пользователь развертывания находится в группе RVM в соответствии с документацией RVM.