Capistrano «Bundle Not Found» Ошибка во время развертывания - PullRequest
11 голосов
/ 04 апреля 2011

Когда я запускаю 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

Ответы [ 4 ]

29 голосов
/ 16 мая 2012

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

Далее, проверьте, есть ли в вашем deploy.rb

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

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

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

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

12 голосов
/ 21 июля 2011

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

$ cap shell 
  > echo $PATH

Хорошо. Бьюсь об заклад, когда вы входите в систему и выводите туда «echo $ PATH», все получается правильно ... здесь тоже самое.

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

Я выбрал то, что кажется довольно хакерским, и имеет недостаток, заключающийся в том, что он является глобальным для всех хостов, на которых вы развертываете приложение (поэтому, если ваши каталоги ruby ​​/ gems различны на разных хостах, это не сработает) - но : Я добавил настройки default_environment в скрипт config / 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.

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

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

1 голос
/ 08 апреля 2011

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

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

место

require "bundler/capistrano"

в вашем скрипте в качестве упаковщика теперь есть поддержка 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 будет установлена, только если она не найдена.

1 голос
/ 04 апреля 2011

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

...