web-dev-qa-db-ja.com

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
53
T.J. Schuck

UPDATE:

RVM> = 1.11.3の場合、 rvm-capistrano gem を使用する必要があります。古いRVM> = 1.0.1の場合、以下の回答が引き続き適用されます。


元の回答:

さて、私はstillが完全にcap deploy動作していませんが、thisの問題を修正しました。問題はCapistranoがBundler(および他のgem)にRVMパスとは異なるパスを使用しようとしたことでした。

cap Shellを実行してからecho $PATHを実行して、Capistranoパスを確認します。おそらく標準の/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を見て、gemを適切にロードできるようになりました。

89
T.J. Schuck

.bash_profileがロードされておらず、PATHが間違っているため、Bundlerが見つかりません。これは、おそらく.bash_profileにRVMスクリプトがあるためです。

簡単な答えは、RVMスクリプトを.bash_profileから.bashrcに移動することです。Capistranoはそれを見つけることができるはずです(.bash_profileが.bashrcをソースしていることも確認してください)。

CapistranoはSSHを使用して、サーバー上で 非対話型シェル を介してコマンドを実行します。このシェルセッションは 。bash_profileではなく.bashrcをソース になります。両方にECHOステートメントを追加し、SSH経由でLSを実行しました。以下の結果から、.bashrcのみがソースされていることがわかります。

$ ssh [email protected] ls
.bashrc loaded
git
file1
file2
26
Pete Campbell

私はrbenvを使用して同じ問題がありました。解決策は、.bashrcファイルの下部からrbenv固有の行を取得し、それらを上部に配置することでした。 .bashrcファイルの最初の行は、シェルが対話モードで実行されていなかった場合、中止を返していました。

11
Lelon

その最後の行は実際には

set :rvm_type, :user

つまり、ユーザーは変数ではなくシンボルでなければなりません。そうでなければ、

undefined local variable or method `user'
7
RussK

番号 rvm/capistrano私のために働いた。私が見つけた最良の解決策は、deploy.rb次の行を提出します(非システム全体のRVM用です):

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

7
hipertracker

ユーザーの〜/ .bash_profileで定義されているPATH変数がCapistranoによってロードされていないため、bundleコマンドが見つからないことは私の理解でした。

これを回避するために、タスク: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

ただし、これは非対話型の非ログインシェルであるため、まだロードされません。

1つの提案は、パスを/ etc/bashrcに追加することでした: 「ssh user @ Hostコマンド」が機能するように$ PATHを設定するにはどうすればよいですか?

しかし、これも私にはうまくいきませんでした。 SSHも/ etc/bashrcをロードしないためだと思います。

別の提案は〜/ .ssh/environmentを編集することでした: http://www.Ruby-forum.com/topic/79248 。ただし、これはdeploy.rbでパスを指定するのと同じくらい面倒です。

2
Sai Perchard

これは私のために働いた:

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

1
Nesha Zoric

私はいくつかの提案を試みました。 RVM環境のdeploy.rbファイルのパスの設定に問題がありました。私の最終的な解決策は、以下を含めることでした:

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およびクリーンアップ。

0
Grant Sayer