Подтвердить что ты не робот

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
4b9b3361

Ответ 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 и очистил.