Ошибка 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 будет установлена, если не будет найдена.