我使用上面的配置获得了服务器。
这是我的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目录不存在。
具体问题:
谢谢!
答案 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)。
因此,删除不需要的目录或文件,然后尝试再次部署。