2011-09-13 68 views
9

我得到了上述配置的服務器。Bundler + RVM + Passenger + Capistrano部署和缺失的寶石

這是我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

但是,我的一個帽子任務執行一次耙子。其結果是: *在任何源中找不到bcrypt-ruby-3.0.1 *嘗試運行bundle install

與我的冒險出發,我發現,一旦你有.bundle/config中 BUNDLE_PATH: /mnt/data-store/project/shared/bundle 它的工作原理。 我有這個目錄,可能由bundler創建,在/mnt/data-store/releases/shared/下,所以我手動複製到rails根目錄。

現在,rake/rails c工作。

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

但是,重新部署使我回到(1),因爲.bundle目錄不在那裏。

具體問題:

  1. 我是否需要創建/手動複製.bundle /配置?
  2. 我需要將Gemfile/Gemfile.lock手動複製到共享目錄嗎?如果我添加寶石會發生什麼?我應該持有兩份,還是手動/編程同步它們?
  3. 我做錯了什麼?

謝謝!

回答

5

看這部分在deployment.rb文件(捆紮機代碼)

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

謝謝!我仍然不明白爲什麼'current_release'指向共享路徑而不是實際版本。 – elado

0

錯誤時,也有一些是unwantend服務器上發佈的目錄中出現

The --deployment flag requires a Gemfile.lock. Please make sure you have checked your Gemfile.lock into version control before deploying. 

。應該只有以前版本的應用程序目錄(它們的名稱以日期開頭,看起來像20111025125442)。

因此,刪除不需要的目錄或文件,然後嘗試再次部署。

+0

這就是我的。謝謝! –

+0

我得到這個錯誤,沒有其他目錄裏面的發行文件夾... – aardvarkk

相關問題