programing

Rails 3 — Bundler / Capistrano 오류

kingscode 2021. 1. 17. 10:58
반응형

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

반응형