Ошибка Capistrano 'Bundle Not Found' во время развертывания

Когда я запускаю cap deploy:update, я получаю приведенную ниже ошибку, указывая, что bundle не найден. Когда я запускаю echo $PATH из cap shell, путь /var/lib/gems/1.9.1/bin, который содержит пучок, отсутствует, однако этот путь находится как в /etc/profile, так и в ~/.bashrc. Кто-нибудь знает, как решить эту проблему?

    [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

Ответ 1

Чтобы избежать такой проблемы, вы должны иметь самые последние версии RVM (в настоящее время это 1.13.5), установленные в обоих местах: локально и на удаленном сервере.

Затем проверьте, имеет ли ваш файл deploy.rb

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

Эта строка больше не нужна:

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

Надеюсь, это поможет

Ответ 2

Хорошо, у меня недавно был некоторый опыт в этом. Похоже, существует несколько способов решить эту проблему. Во-первых, вы можете определить, действительно ли удаленное выполнение (через Capistrano) перепутано с самим хостом. Похоже, вы сделали это с удаленной оболочкой Capistrano:

$ cap shell 
  > echo $PATH

Хорошо. Я буду держать пари, когда вы входите в машину и "эха $PATH" там, нужный материал выходит... тоже здесь.

Я нашел два способа исправить это: один из них - включить выполнение среды в удаленном узле ssh daemon. Теоретически это сработало бы, но я не хотел спрашивать системного администратора, было ли нормально открывать это. Вы в основном редактируете файлы конфигурации ssh для установки "PermitUserEnvironment" на "да" и добавляете необходимые параметры среды в файл развертывания пользователя ~/.ssh/environment - ваши системные справочные страницы, вероятно, лучше, чем мои попытки обобщить.

Я выбрал то, что кажется довольно хакерским, и имеет тот недостаток, что он является глобальным для всех хостов, на которые вы развертываете приложение (так что если ваши места с ruby ​​/gems отличаются на разных хостах, это не сработает), но: Я добавил параметры default_environment в config/deploy.rb script:

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.

Это также решает проблему неспособности выполнять удаленные задачи рейка и т.д. через Capistrano. Имейте в виду, что драгоценный камень Capistrano, по крайней мере, версия, которую я имею, и с моим развертыванием, установленным стандартным способом, установит драгоценные камни в /shared/bundle каталог, который получает приложение. Метод, который я описал, требует минимального подмножества драгоценных камней в системных каталогах, на которые ссылается среда по умолчанию, так что удаленные команды Capistrano могут выполнять связывание, грабли и т.д.

Вы не сказали, используете ли вы RVM (мое решение не работает); однако это решение очень близко к одному из рекомендованных RVM-решений. В качестве альтернативы вы можете просто использовать решение "rvm/capistrano"; посмотрите интеграцию RVM Capistrano на веб-сайте RVM для более подробной информации.

Ответ 3

Вы вручную установили камень bundler в удаленном окне? Вы не можете использовать команду bundle или установить любые пакеты до тех пор, пока не сделаете это.

Ответ 4

Используете ли вы RVM?

DaneS некоторые возможные решения:

place

require "bundler/capistrano"

в вашем script, поскольку у пакета теперь есть поддержка capistrano https://github.com/carlhuda/bundler/blob/1-0-stable/lib/bundler/capistrano.rb

И, может быть,

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

Задача install_bundler будет установлена, если не будет найдена.