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
최신 정보:
RVM> = 1.11.3의 경우 이제 rvm-capistrano gem을 사용해야합니다 . 이전 RVM> = 1.0.1의 경우 아래 답변이 계속 적용됩니다.
원래 답변 :
그래도 아직cap deploy
작업 이 충분하지는 않지만 이 문제를 해결했습니다. 문제는 Capistrano가 Bundler (및 기타 gem)에 RVM 경로와 다른 경로를 사용하려한다는 것입니다.
cap shell
다음 을 수행하여 Capistrano 경로를 확인하십시오 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를보고 적절하게 보석을로드하기 시작했습니다.
.bash_profile이로드되지 않아 PATH가 잘못되어 번 들러를 찾을 수 없습니다. .bash_profile에 RVM 스크립트가 있기 때문일 수 있습니다.
간단한 대답은 RVM 스크립트를 .bash_profile에서 .bashrc로 옮기는 것입니다. 그러면 Capistrano가이를 찾을 수 있어야합니다 (또한 .bash_profile 소스가 .bashrc인지 확인).
Capistrano는 SSH를 사용하여 비대화 형 셸을 통해 서버에서 명령을 실행합니다 . 이 쉘 세션은 .bashrc 를 소스하지만 .bash_profile은 아닙니다 . 두 가지 모두에 ECHO 문을 추가하고 SSH를 통해 LS를 실행했습니다. 아래 결과에서 .bashrc 만 소스임을 알 수 있습니다.
$ ssh user@123.amazonaws.com ls
.bashrc loaded
git
file1
file2
rbenv를 사용하여 동일한 문제가 발생했습니다. 해결책은 .bashrc 파일의 맨 아래에서 rbenv 특정 행을 가져와 맨 위에 놓는 것입니다. .bashrc 파일의 첫 번째 줄은 셸이 대화 형 모드에서 실행되지 않는 경우 중단을 반환했습니다.
마지막 줄은 실제로
set :rvm_type, :user
즉, 사용자는 변수가 아니라 기호 여야합니다. 그렇지 않으면
undefined local variable or method `user'
No rvm/capistrano
worked for me. The best solution I found was adding to deploy.rb
file the following line (it's for non system-wide RVM):
set :bundle_cmd, 'source $HOME/.bash_profile && bundle'
It was my understanding that the bundle command is not found because the PATH variable, defined in the user's ~/.bash_profile, isn't loaded by Capistrano.
To get around this I have created a task :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
Note that I also include the path to PostgreSQL binaries - installation of the pg gem was failing because they could not be found, even when bundle could be found.
This seems like a messy approach, though. Presumably there is a more 'global' place to define paths to binaries that I don't know about.
Update 23/12
To add a directory to $PATH for all users: https://serverfault.com/questions/102932/adding-a-directory-to-path-in-centos
However this still won't be loaded because it is a non-interactive non-login shell.
One suggestion was to add the paths to /etc/bashrc: How do I set $PATH such that `ssh user@host command` works?
However this also didn't work for me. I believe its because SSH doesn't load /etc/bashrc either.
Another suggestion was to edit ~/.ssh/environment: http://www.ruby-forum.com/topic/79248. However this seems almost as messy as specifying the paths in deploy.rb.
This one worked for me:
set :bundle_cmd, 'source $HOME/.bash_profile && bundle'
I tried a number of the suggestions. Had problems with setting the paths in the deploy.rb file for the RVM environment. My final solution was to include the following:
In the config/deploy.rb file add:
require "bundler/capistrano"
Also in config/deploy.rb, or in my case config/production.rb as I was using the multistage option for Capistrano
after "deploy", "rvm:trust_rvmrc"
This step simply ensures that we stop getting the 'do you want to trust the .rvmrc file' and it calls a task in the deploy.rb file such as:
namespace :rvm do
task :trust_rvmrc do
run "rvm rvmrc trust #{release_path}"
end
end
After putting in these slight changes I was able to run cap production deploy
which checked out the code; executed the asset pipeline deployment, linked up the release folder to current, executed bundle install
and cleaned up.
ReferenceURL : https://stackoverflow.com/questions/3737678/rails-3-bundler-capistrano-errors
'programing' 카테고리의 다른 글
2D에서 다른 점으로 점 회전 (0) | 2021.01.17 |
---|---|
Grails 컨트롤러에서 404 / 50x 상태 코드를 반환하려면 어떻게해야합니까? (0) | 2021.01.17 |
여러 인수가있는 xargs (0) | 2021.01.17 |
Chrome이 빈 필드에 "Please Fill Out this Field"툴팁을 표시하는 이유는 무엇입니까? (0) | 2021.01.17 |
'onclick'이벤트를 트리거하는 요소의 ID를 이벤트 처리 함수에 전달하는 방법 (0) | 2021.01.17 |