開発ボックスでローカルで動作する基本的な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
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を適切にロードできるようになりました。
.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
私はrbenvを使用して同じ問題がありました。解決策は、.bashrcファイルの下部からrbenv固有の行を取得し、それらを上部に配置することでした。 .bashrcファイルの最初の行は、シェルが対話モードで実行されていなかった場合、中止を返していました。
その最後の行は実際には
set :rvm_type, :user
つまり、ユーザーは変数ではなくシンボルでなければなりません。そうでなければ、
undefined local variable or method `user'
番号 rvm/capistrano
私のために働いた。私が見つけた最良の解決策は、deploy.rb
次の行を提出します(非システム全体のRVM用です):
set :bundle_cmd, 'source $HOME/.bash_profile && bundle'
ユーザーの〜/ .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でパスを指定するのと同じくらい面倒です。
これは私のために働いた:
set:bundle_cmd、 'source $ HOME/.bash_profile && bundle'
私はいくつかの提案を試みました。 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
およびクリーンアップ。