Rails 3 - Ошибки Bundler/Capistrano
У меня есть основное приложение Rails 3, работающее локально в моей коробке разработки, но вы хотите проверить развертывание на раннем этапе, чтобы убедиться, что все работает. Я использую Capistrano для развертывания.
Когда я запускаю cap deploy
(после всей необходимой настройки), он обрывает эту команду с помощью этой ошибки:
[...]
* executing 'bundle:install'
* executing "bundle install --gemfile /var/www/trex/releases/20100917172521/Gemfile --path /var/www/trex/shared/bundle --deployment --quiet --without development test"
servers: ["www.[my domain].com"]
[www.[my domain].com] executing command
** [out :: www.[my domain].com] sh: bundle: command not found
command finished
[...]
Итак, похоже, что он не может найти команду bundle
на сервере.
Однако, когда я вхожу на сервер...
$ ruby -v
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]
$ rails -v
Rails 3.0.0
$ bundle -v
Bundler version 1.0.0
... команда bundle
работает нормально.
Что может быть не так?
-
(Кроме того, для полноты:)
$ which ruby
~/.rvm/rubies/ruby-1.9.2-p0/bin/ruby
$ which rails
~/.rvm/gems/ruby-1.9.2-p0/bin/rails
$ which bundle
~/.rvm/gems/ruby-1.9.2-p0/bin/bundle
Ответы
Ответ 1
UPDATE:
Для RVM >= 1.11.3 вы должны просто использовать rvm-capistrano gem. Для старшего RVM >= 1.0.1 ответ ниже по-прежнему применяется.
ОРИГИНАЛЬНЫЙ ОТВЕТ:
Хорошо, хотя я все еще не получил полноценный cap deploy
для работы, я исправил эту проблему. Проблема заключалась в том, что Капистрано пытался использовать другой путь для Bundler (и других драгоценных камней), чем пути RVM.
Проверьте свой путь Capistrano, выполнив cap shell
, затем echo $PATH
. Вероятно, вы увидите свои стандартные /usr/local/bin
и /usr/bin
, но не там, где RVM имеет Bundler и т.д., Сохраненные.
Измените файл Capistrano config/deploy.rb
и добавьте следующие строки в следующие инструкции:
# Add RVM lib directory to the load path.
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
# Load RVM capistrano plugin.
require "rvm/capistrano"
set :rvm_ruby_string, '1.9.2'
set :rvm_type, :user # Don't use system-wide RVM
Наконец-то он получил Capistrano, чтобы увидеть Bundler и начать загружать драгоценные камни соответствующим образом.
Ответ 2
Bundler не найден, потому что .bash_profile не загружается и, следовательно, ваш PATH ошибочен. Вероятно, это связано с тем, что у вас есть RVM script в .bash_profile.
Простым ответом является перемещение RVM script из .bash_profile в .bashrc, и Capistrano должен его найти (также проверьте, что .bash_profile source.bashrc).
Capistrano использует SSH для выполнения команд на сервере с помощью неинтерактивной оболочки. Этот сеанс оболочки будет source.bashrc, но не .bash_profile. Я добавил инструкцию ECHO для обоих и запустил LS через SSH. Вы можете увидеть в приведенных ниже результатах, что только .bashrc отправлен:
$ ssh [email protected] ls
.bashrc loaded
git
file1
file2
Ответ 3
У меня была идентичная проблема с использованием rbenv. Решение состояло в том, чтобы взять определенные строки rbenv со дна моего .bashrc файла и поместить их вверху. Первая строка моего .bashrc файла возвращалась прерыванием, если оболочка не работала в интерактивном режиме.
Ответ 4
Последняя строка должна быть
set :rvm_type, :user
то есть пользователь должен быть символом, а не переменной, иначе вы получите
undefined local variable or method `user'
Ответ 5
Нет rvm/capistrano
работал у меня. Лучшее решение, которое я нашел, добавляло к deploy.rb
файлу следующую строку (это для не общесистемного RVM):
set :bundle_cmd, 'source $HOME/.bash_profile && bundle'
Ответ 6
Насколько я понял, команда bundle не найдена, потому что переменная PATH, определенная в файле пользователя ~/.bash_profile, не загружается Capistrano.
Чтобы обойти это, я создал задачу: bundle_gems.
task :bundle_gems do
run "cd #{deploy_to}/current && export PATH=/usr/local/pgsql/bin:/opt/ruby-enterprise-X.X.X/bin:$PATH && bundle install vendor/gems"
end
Обратите внимание, что я также указываю путь к двоичным файлам PostgreSQL - установка pg gem завершилась неудачей, потому что их не удалось найти, даже если пакет был найден.
Это похоже на беспорядочный подход. Предположительно, существует более "глобальное" место для определения путей к двоичным файлам, о которых я не знаю.
Обновление 23/12
Чтобы добавить каталог в $PATH для всех пользователей: https://serverfault.com/questions/102932/adding-a-directory-to-path-in-centos
Однако это еще не будет загружено, потому что это неинтерактивная оболочка без входа.
Было предложено добавить пути к /etc/bashrc: Как установить $PATH таким образом, чтобы` ssh user @host command` работал?
Однако это тоже не сработало для меня. Я верю, потому что SSH не загружает /etc/bashrc.
Другое предложение состояло в том, чтобы редактировать ~/.ssh/environment: http://www.ruby-forum.com/topic/79248. Однако это кажется почти таким же грязным, как указание путей в deploy.rb.
Ответ 7
Это работало для меня:
set: bundle_cmd, 'source $HOME/.bash_profile && & && & && расслоение
Ответ 8
Я попробовал несколько предложений. Были проблемы с настройкой путей в файле deploy.rb для среды RVM. Моим окончательным решением было включить следующее:
В файле config/deploy.rb добавьте:
require "bundler/capistrano"
Также в config/deploy.rb или в моем случае config/production.rb, поскольку я использовал многоступенчатую опцию для Capistrano
after "deploy", "rvm:trust_rvmrc"
Этот шаг просто гарантирует, что мы перестанем получать "вы хотите доверять файлу .rvmrc" и он вызывает задачу в файле deploy.rb, например:
namespace :rvm do
task :trust_rvmrc do
run "rvm rvmrc trust #{release_path}"
end
end
После внесения этих незначительных изменений я смог запустить cap production deploy
, который проверил код; выполнил развертывание конвейера активов, связал папку выпуска с текущим, выполнил bundle install
и очистил.