Capistrano развертывается на общесистемной RVM, не видя установленных Rubies

Я использую общесистемную установку 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.


person RyanWilcox    schedule 04.08.2011    source источник
comment
Для будущих сотрудников Google: я подробно объясняю, в чем дело и как это исправить, в сообщении в блоге (благодаря ответу ниже): blog.wilcoxd.com/blog/2011/08/05/   -  person RyanWilcox    schedule 05.08.2011


Ответы (2)


Это ПРЕДУПРЕЖДЕНИЕ о неустановленном ruby ​​является вводящим в заблуждение сообщением, в нем должно быть сказано, что не удалось найти пару ruby@gemset. Если бы вы использовали эту команду на сервере:

rvm use 1.9.2@MY_APP

Вы увидите сообщения в обратном порядке — первая ошибка о том, что набор драгоценных камней не найден, для ее решения перейдите на сервер и запустите:

rvm --create use 1.9.2@MY_APP

Это создаст набор драгоценных камней для вас, если вам нужна дополнительная помощь, пожалуйста, свяжитесь с IRC-каналом #rvm на серверах FreeNode.

person mpapis    schedule 05.08.2011
comment
Ты прав. Я создал набор драгоценных камней — точнее, Capfile создал набор драгоценных камней — и это сработало. Раздражает, что сообщение об ошибке указало мне неправильный путь, но спасибо за помощь - person RyanWilcox; 05.08.2011
comment
посмотрите на rvm-capistrano инструкции по интеграции github.com/wayneeseguin/rvm-capistrano /#readme - person mpapis; 12.02.2013
comment
Я пробую это, и это не работает. У меня все еще есть проблемы. Я изложил подробности на вашей странице github @mpapis - person JohnMerlino; 25.06.2013
comment
какие проблемы? открыть новый вопрос, описывающий вашу ситуацию. - person mpapis; 26.06.2013

Хорошо, у меня только что была эта бомба с исправлением версии ruby. сервер работал: ruby-1.8.7-p371 и деплой (cap/rvm-capistrano, не знаю какой именно) хотел rvm install ruby-1.8.7-p374.

Я попробовал предложение драгоценных камней в @mpapis, которое было прогрессом, но именно тогда я заметил, что оно попросило меня указать p374.

поэтому, если вы сомневаетесь, установите последнюю минорную версию ruby.

person TomDunning    schedule 19.09.2013