rbenv:生产服务器上找不到bundle命令

8

我正在尝试部署Rails应用程序,但遇到了错误。

DEBUG[1a70ba92] Command: cd /home/deploy/myapp/releases/20140615090226 && ( PATH=$HOME/.rbenv   /shims:$HOME/.rbenv/bin:$PATH RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.2 ~/.rbenv/bin/rbenv exec bundle install --binstubs /home/deploy/myapp/shared/bin --path /home/deploy/myapp/shared/bundle --without development test --deployment --quiet )
DEBUG[1a70ba92]     rbenv: bundle: command not found
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing on host xxx.xxx.xxx.xx: bundle exit status: 127
bundle stdout: Nothing written
bundle stderr: rbenv: bundle: command not found

deploy.rb

# config valid only for Capistrano 3.1
lock '3.1.0'

set :application, 'myapp'
set :repo_url, 'git@bitbucket.org:username/myapp.git'

# Default branch is :master
# ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }

# Default deploy_to directory is /var/www/my_app
 set :deploy_to, '/home/deploy/myapp'

# Default value for :scm is :git
# set :scm, :git
set :branch, "master"

# Default value for :format is :pretty
# set :format, :pretty

# Default value for :log_level is :debug
# set :log_level, :debug

# Default value for :pty is false
# set :pty, true

# Default value for :linked_files is []
 set :linked_files, %w{config/database.yml}

# Default value for linked_dirs is []
 set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}

# Default value for default_env is {}
# set :default_env, { path: "/opt/ruby/bin:$PATH" }
set :default_env, { path: "$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH" }
# Default value for keep_releases is 5
# set :keep_releases, 5

namespace :deploy do

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      # Your restart mechanism here, for example:
       execute :touch, release_path.join('tmp/restart.txt')
    end
  end

  after :publishing, :restart

  end

    desc "Symlink shared config files"
    task :symlink_config_files do
        run "#{ try_sudo } ln -s #{ deploy_to }/shared/config/database.yml #{ current_path }/config/database.yml"
    end

end

capfile

# Load DSL and Setup Up Stages
require 'capistrano/setup'

# Includes default deployment tasks
require 'capistrano/deploy'
require 'capistrano/bundler'
require 'capistrano/rails'
require 'capistrano/rbenv'
set :rbenv_ruby, "2.1.2"

Production.rb

set :stage, :production
role :app, %w{deploy@xxx.xxx.xxx.xx}
role :web, %w{deploy@xxx.xxx.xxx.xx}
role :db,  %w{deploy@xxx.xxx.xxx.xx}
set :password, ask('Server password', nil)
server 'xxx.xxx.xxx.xx', user: 'deploy', password: fetch(:password), roles: %w{web app}

/etc/nginx/nginx.conf

passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
passenger_ruby /home/deploy/.rbenv/shims/ruby;

/etc/nginx/sites-enabled/default

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        server_name mydomain.com;
        passenger_enabled on;
        rails_env    production;
        root         /home/deploy/myapp/current/public;

        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}


which ruby
/home/deploy/.rbenv/shims/ruby

ruby -v
ruby 2.1.2p95

它正在使用正确的Ruby版本。但我猜想尝试在另一个文件夹中安装gem。我该怎么解决?

5个回答

12

你尝试先在服务器上安装 "bundler" gem 吗?这个 gem 是运行 bundle 命令所必需的。通过 SSH 连接到你的服务器并运行以下命令:

gem install bundler

希望这有所帮助。


deploy@movieseat:/$ sudo gem install bundler [sudo] deploy 的密码: 成功安装 bundler-1.7.4 已安装 1 个宝石但我仍然收到错误信息。有什么建议吗? - Peter Boomsma
你是使用 RVM 还是 rbenv? - The Lazy Log
我正在使用rbenv。也许你可以在这里看一下我的问题> http://stackoverflow.com/questions/26689521/error-deploying-rails-app - Peter Boomsma
首先,您需要确保在运行“gem install bunder”时使用了正确的Ruby版本。我不知道为什么您要使用“sudo”? - The Lazy Log
我的设置有些问题。删除 droplet 并重新按照指南操作后,问题得到了解决。似乎与“gem install bundler”有关,我想是我顺序弄错了。 - Peter Boomsma

3
如果您已经安装了bundler(bundler -v),可以尝试以下操作(在Ubuntu 12.04 LTS上对我有效):
1. gem uninstall bundler
2. gem update
3. gem install bundler
4. redeploy

1
这对我很有效。我不想从头开始:)。 - Abdullah Aden

3

这对我很有帮助。我正在使用Ubuntu 16.04。请将下面的用户更改为您的用户名。

sudo pico /etc/profile.d/rbenv.sh

#File
export RBENV_ROOT=/home/user/.rbenv
export PATH=$RBENV_ROOT/shims:$RBENV_ROOT/bin:$PATH
#End File

2

更新:
我找到了原因:我的 .gemrc 文件中包含了 "gem: --user-install",所以 bundle 没有安装在 rbenv 中,然后 rbenv 在 2.1.2 路径中找不到 bundle 二进制文件。 删除 --user-install 配置,并重新安装 bundle 可以解决问题。

===================================
我发现 RBENV_VERSION 环境变量导致 bundle 失败,但不知道为什么。 我移除了 RBENV_VERSION 并在服务器上执行命令,成功了。


2
如果你查看你的 .bashrc 或者 .bash_profile 文件,你会看到类似这样的内容:

Original Answer

翻译成 "最初的回答"
case $- in
    *i*) ;;
      *) return;;
esac

或者:

[ -z "$PS1" ] && return

如果shell不是交互式的,则此行后面的所有内容都不会被执行。

Capistrano不会打开交互式shell。

例如,如果您正在使用rbenv,则会在.bashrc文件末尾添加几行代码。但这些代码不会被执行,因此您的ruby环境也不会被加载。

原始答案: "最初的回答"

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"

只需将rbenv行移动到您的.bashrc开头,即在上面解释的return之前。翻译后:

在你的.bashrc文件中,把rbenv相关的配置放在最前面,放在上面提到的return语句之前。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接