Bundler + RVM + Passenger + Capistrano部署&失踪的宝石

时间:2011-09-13 18:35:26

标签: ruby-on-rails passenger rvm capistrano bundler

我使用上面的配置获得了服务器。

这是我的deploy.rb配方的重要部分:

$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require 'rvm/capistrano'
require 'bundler/capistrano'

set :rvm_ruby_string, 'ruby-1.9.2-p290'
set :rvm_type, :system
set :bundle_flags, "--deployment"

set :default_environment, {
  'PATH' => ENV['PATH'],
  'RAILS_ENV' => ENV['RAILS_ENV']
}

set :stages, %w(staging production)
require 'capistrano/ext/multistage'

按原样运行cap staging deploy会导致错误:

* executing "cd /mnt/data-store/project/releases/shared &&
bundle install --gemfile /mnt/data-store/project/releases/shared/Gemfile
--path /mnt/data-store/project/shared/bundle --deployment --without development test"

** [out :: localhost] The --deployment flag requires a Gemfile.lock.
Please make sure you have checked your Gemfile.lock into version control
before deploying.

... rolling back ...

failed: "env PATH=... RAILS_ENV=staging rvm_path=/usr/local/rvm /usr/local/rvm/bin/rvm-shell 'ruby-1.9.2-p290' -c 'cd /mnt/data-store/project/releases/shared && bundle install --gemfile /mnt/data-store/project/releases/shared/Gemfile --path /mnt/data-store/project/shared/bundle --deployment --without development test'" on localhost

Gemfile和Gemfile.lock在源代码管理中。我首先在本地运行bundle install以生成.lock文件。但是bundler / capistrano指向/ mnt / data-store / project / releases / shared / Gemfile,所以我只是手动复制了两个文件。我确定我在这里做错了。我想它应该自动复制。

再次执行部署(1)并且它在捆绑安装上没有失败,甚至还有

输出中

Your bundle is complete! It was installed into /mnt/data-store/project/shared/bundle

但是,我的一个上限任务执行了一个rake。结果是: *无法在任何来源中找到bcrypt-ruby-3.0.1 *尝试运行bundle install

继续我的冒险,我发现一旦你拥有.bundle / config BUNDLE_PATH: /mnt/data-store/project/shared/bundle 有用。 我在/mnt/data-store/releases/shared/下有这个目录,可能是由bundler创建的,所以我手动复制到rails根目录。

现在,rake / rails c可以工作。

bundle show twitter显示.../shared/bundle/ruby/1.9.1/gems/twitter-1.7.1

但是,重新部署让我回到(1),因为.bundle目录不存在。

具体问题:

  1. 我是否需要手动创建/复制.bundle / config?
  2. 我是否需要手动将Gemfile / Gemfile.lock复制到共享目录?如果我添加宝石怎么办?我应该保留两份副本,还是手动/以编程方式同步它们?
  3. 我做错了什么?
  4. 谢谢!

2 个答案:

答案 0 :(得分:5)

在deployment.rb文件(Bundler代码)中查看此部分

args = ["--gemfile #{File.join(context.fetch(:current_release), bundle_gemfile)}"]
args << "--path #{bundle_dir}" unless bundle_dir.to_s.empty?

有一个名为:current_release的密钥,由于某种原因,这个密钥可能没有被Capistrano正确设置。

捆绑包中的:current_release将指向“共享”文件夹而不是最新版本(带有时间戳)

这是在before 'deploy:finalize_update'上执行的。

为了解决这个问题,我要做的就是在这个事件上添加你自己的钩子。

before 'deploy:finalize_update', 'x:set_current_release'

这是实际的方法

task :set_current_release, :roles => :app do
    set :current_release, latest_release
end

答案 1 :(得分:0)

错误

The --deployment flag requires a Gemfile.lock. Please make sure you have checked your Gemfile.lock into version control before deploying.
当服务器上的release目录中存在unwantend时,会发生

。应该只有您的应用程序以前版本的目录(它们的名称以日期开头,看起来像20111025125442)。

因此,删除不需要的目录或文件,然后尝试再次部署。