Rails 3 - ошибки Bundler / Capistrano - PullRequest
       58

Rails 3 - ошибки Bundler / Capistrano

53 голосов
/ 17 сентября 2010

У меня есть базовое приложение на 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

Ответы [ 8 ]

89 голосов
/ 20 сентября 2010

UPDATE:

Для RVM> = 1.11.3 вы должны просто использовать камень rvm-capistrano . Для более старых RVM> = 1.0.1 ответ ниже по-прежнему применим.


ОРИГИНАЛЬНЫЙ ОТВЕТ:

Хорошо, хотя я все еще не получил полный cap deploy на работу, я исправил эту проблему Проблема заключалась в том, что Capistrano пытался использовать другой путь для Bundler (и других драгоценных камней), чем пути RVM.

Проверьте путь Capistrano, выполнив cap shell, затем echo $PATH. Вы, вероятно, увидите ваши стандартные /usr/local/bin и /usr/bin, но это не то место, где RVM хранит Bundler и др.

Отредактируйте файл Capistrano config/deploy.rb и добавьте следующие строки в этих инструкциях :

# Add RVM's lib directory to the load path.
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))

# Load RVM's capistrano plugin.    
require "rvm/capistrano"

set :rvm_ruby_string, '1.9.2'
set :rvm_type, :user  # Don't use system-wide RVM

Это наконец заставило Capistrano увидеть Bundler и начать загружать драгоценные камни соответствующим образом.

26 голосов
/ 12 августа 2011

Bundler не найден, потому что .bash_profile не загружается и, следовательно, ваш PATH неверен. Вероятно, это связано с тем, что у вас есть скрипт RVM в .bash_profile.

Простой ответ - переместить скрипт RVM из .bash_profile в .bashrc, и Capistrano сможет его найти (также убедитесь, что исходники .bash_profile .bashrc).

Capistrano использует SSH для выполнения команд на сервере через неинтерактивную оболочку . Этот сеанс оболочки будет источником .bashrc, но не .bash_profile . Я добавил оператор ECHO к обоим и запустил LS через SSH. Вы можете видеть в результатах ниже, что только .bashrc поставлен:

$ ssh user@123.amazonaws.com ls
.bashrc loaded
git
file1
file2
11 голосов
/ 16 февраля 2012

У меня была идентичная проблема с использованием rbenv.Решением было взять строки rbenv из нижней части моего файла .bashrc и поместить их сверху.Первая строка моего файла .bashrc возвращала прерывание, если оболочка не работала в интерактивном режиме.

7 голосов
/ 27 ноября 2011

Нет rvm/capistrano работал на меня. Лучшим решением, которое я нашел, было добавление к файлу deploy.rb следующей строки (это не для RVM не для всей системы):

set :bundle_cmd, 'source $HOME/.bash_profile && bundle'

7 голосов
/ 24 ноября 2010

Последняя строка должна быть

set :rvm_type, :user

, то есть пользователь должен быть символом, а не переменной, иначе вы получите

undefined local variable or method `user'
2 голосов
/ 19 декабря 2010

Насколько я понял, команда 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 не удалась, потому что их не удалось найти, даже когда можно было найти пакет.

Это похоже на грязный подход. Предположительно, существует более «глобальное» место для определения путей к двоичным файлам, о которых я не знаю.

Обновление 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.

1 голос
/ 14 февраля 2014

Этот работает для меня:

set: bundle_cmd, 'source $ HOME / .bash_profile && bundle'

0 голосов
/ 21 февраля 2013

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

...