QA@IT
«質問へ戻る

質問を投稿

Capistrano3で、rvmのPATHが通らない。

現在、Capistrano3とRails4.0を使って、RVMでRubyがインストールされたサーバ上に、Railsのデプロイを行いたいと考えています。
しかしながら、Rails等のPATHがうまく通らず、command not foundになってしまいます。

具体的な状況を説明させていただきます。
CapsistranoでPATHが取っている事を確認したいため、以下のようなdeploy.rbを書きました。

namespace :deploy do
  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
        info capture "printenv PATH"
    end
  end
end

実行結果は以下の様になっています。

DEBUG [ffeafec3] Command: printenv PATH
DEBUG [ffeafec3]    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

この通り、PATHにrvmが通っていません。

次に、私がこのPATHのバグを修正するために、やったことを書かせていただきます。

  • capistrano-rvmを使う

GemFileに以下の様に書きます。

group :development do
  gem 'capistrano', '~> 3.0'
  gem 'capistrano-bundler'
  gem 'capistrano-rails'
  gem 'capistrano-rvm'
end

そして、Capfileに

require 'capistrano/rvm'

と書きました。
しかしながら、printenv PATHの内容は変わりませんでした。

  • default_environmentにPATHを書く。

ネット上で下記の様に書くと、PATHを変更できると書いていたので、deploy.rbに書いてみました。

set :default_environment, {
    'PATH' => "/home/username/.rvm/gems/ruby-1.9.3-p194/bin:$PATH:
}

しかしこれも変わりませんでした。

  • bash.rcとbash_loginに書いてある内容を実行する

Capistranoの問題はおそらくこの当たりのシェルを叩いてないため、PATHが通っていないと考えました。
そのため、Cpaistranoに叩かせました。

execute '[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"'
execute "PATH=$PATH:$HOME/.rvm/bin"

しかしこれも変わりませんでした。

execute '[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" && printenv PATH'

とするとPATHが通っていたようなので、どうもCapistranoは一回一回のコマンド毎にPATHが初期化されているようです。

どうすれば、Capistaranoにrvmのパスを通す事が出来るでしょうか?
ご回答いただけると幸いです。

現在、Capistrano3とRails4.0を使って、RVMでRubyがインストールされたサーバ上に、Railsのデプロイを行いたいと考えています。
しかしながら、Rails等のPATHがうまく通らず、```command not found```になってしまいます。

具体的な状況を説明させていただきます。
CapsistranoでPATHが取っている事を確認したいため、以下のようなdeploy.rbを書きました。

```rb
namespace :deploy do
  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
    	info capture "printenv PATH"
    end
  end
end
```

実行結果は以下の様になっています。

```sh
DEBUG [ffeafec3] Command: printenv PATH
DEBUG [ffeafec3] 	/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
```

この通り、PATHにrvmが通っていません。


次に、私がこのPATHのバグを修正するために、やったことを書かせていただきます。

- capistrano-rvmを使う

GemFileに以下の様に書きます。

```rb
group :development do
  gem 'capistrano', '~> 3.0'
  gem 'capistrano-bundler'
  gem 'capistrano-rails'
  gem 'capistrano-rvm'
end
```

そして、Capfileに

```rb
require 'capistrano/rvm'
```

と書きました。
しかしながら、printenv PATHの内容は変わりませんでした。

- default_environmentにPATHを書く。

ネット上で下記の様に書くと、PATHを変更できると書いていたので、deploy.rbに書いてみました。

```rb
set :default_environment, {
	'PATH' => "/home/username/.rvm/gems/ruby-1.9.3-p194/bin:$PATH:
}
```

しかしこれも変わりませんでした。

- bash.rcとbash_loginに書いてある内容を実行する

Capistranoの問題はおそらくこの当たりのシェルを叩いてないため、PATHが通っていないと考えました。
そのため、Cpaistranoに叩かせました。

```rb
execute '[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"'
execute "PATH=$PATH:$HOME/.rvm/bin"
```

しかしこれも変わりませんでした。

```ruby
execute '[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" && printenv PATH'
```
とするとPATHが通っていたようなので、どうもCapistranoは一回一回のコマンド毎にPATHが初期化されているようです。

どうすれば、Capistaranoにrvmのパスを通す事が出来るでしょうか?
ご回答いただけると幸いです。