Rails3をCapistranoでdeployする上でのbundlerの注意点 on Windows
はじめに
rails3でもcapistrano使いたいですよね。
でもそのままだとbundlerが動かないので、わざわざ本番環境でbundle installとかやらなきゃいけない。
しかもwindows環境で作られたGemfile.lockが邪魔で、削除してから、本番環境用のGemfile.lockを作らないといけない。
なんとかならないかなぁと、思って四苦八苦したメモ。
失敗すると、こうなります。
結論
- Windows開発環境で作られたGemfile.lockはあくまでWindows環境のもの。
- Ubuntu(その他の)環境では使えませんよね(だからbundle_flags --deploymentはダメですよ)
- その環境用にGemfile.lockつくるようなcapistranoのdeploy.rbを書きましょう
deploy.rb
# デフォルトで設定されている --deployment を消す set :bundle_flags, "--quiet"
前提条件
- Windowsの開発環境
- Ubuntuに本番環境
- Rails3 (もちろんBundler使う)
- capistrano使ってデプロイしたい
環境は以下のとおり
$ ruby -v ruby 1.8.7 (2010-06-23 patchlevel 299) [i386-mswin32] $ rails -v Rails 3.0.3 $ gem list capistrano *** LOCAL GEMS *** capistrano (2.5.19) capistrano-ext (1.2.1) capistrano_colors (0.5.3) $ gem list bundler *** LOCAL GEMS *** bundler (1.0.7, 1.0.0)
Rails3でもcapistrano使いたいよね
ということで、rails3 capistranoでググるとすぐ見つかる。
capistranoでbundle installする - 床のトルストイ、ゲイとするとのこと
Bundler: The best way to manage Ruby applications
つまるところ、config/deploy.rbに一行追加するだけでよいとのこと。
これだけで、capistrano実行時にbundle installが実行されますって。
require "bundler/capistrano"
capistranoのタスク一覧にbundle:installが追加される
$ cap -T cap bundle:install # Install the current Bundler environment. cap deploy # Deploys your project. cap deploy:check # Test deployment dependencies. cap deploy:cleanup # Clean up old releases. cap deploy:cold # Deploys and starts a `cold' application. cap deploy:migrate # Run the migrate rake task. cap deploy:migrations # Deploy and run pending migrations. cap deploy:pending # Displays the commits since your last deploy. cap deploy:pending:diff # Displays the `diff' since your last deploy. cap deploy:rollback # Rolls back to a previous version and restarts. cap deploy:rollback:code # Rolls back to the previously deployed version. cap deploy:setup # Prepares one or more servers for deployment. cap deploy:symlink # Updates the symlink to the most recently deployed ... cap deploy:update # Copies your project and updates the symlink. cap deploy:update_code # Copies your project to the remote servers. cap deploy:upload # Copy files to the currently deployed version. cap deploy:web:disable # Present a maintenance page to visitors. cap deploy:web:enable # Makes the application web-accessible again. cap invoke # Invoke a single command on the remote servers. cap multistage:prepare # Stub out the staging config files. cap production # Set the target stage to `production'. cap shell # Begin an interactive Capistrano session. cap staging # Set the target stage to `staging'.
ここで説明したいのは、最初の一行だけ。
そのほかはまた今度。
つぎに、そのレシピの使い方
$ cap -e bundle:install ------------------------------------------------------------ cap bundle:install ------------------------------------------------------------ Install the current Bundler environment. By default, gems will be installed to the shared/bundle path. Gems in the development and test group will not be installed. The install command is executed with the --deployment and --quiet flags. If the bundle cmd cannot be found then you can override the bundle_cmd variable to specifiy which one it should use. You can override any of these defaults by setting the variables shown below. N.B. bundle_roles must be defined before you require 'bundler/capistrano' in your deploy.rb file. set :bundle_gemfile, "Gemfile" set :bundle_dir, File.join(fetch(:shared_path), 'bundle') set :bundle_flags, "--deployment --quiet" set :bundle_without, [:development, :test] set :bundle_cmd, "bundle" # e.g. "/opt/ruby/bin/bundle" set :bundle_roles, {:except => {:no_release => true}} # e.g. [:app, :batch]
いろいろ設定できますね。
で、bundle_flagsの値がまずい。--deploymentとするのがまずかった。
おわりに
ということで、それを排除したらうまくいきましたよ、というお話でした。
たったそれだけですねぇ。
それがわかるまでは、いろいろとエラーを出されてました。
Twitter / katton: !!! Missing the mysql2 gem
!!! Missing the mysql2 gem. Add it to your Gemfile: gem 'mysql2'
Twitter / katton: Please install the mysql2
Please install the mysql2 adapter: `gem install activerecord-mysql2-adapter`
まだまだRails3には人柱が必要みたいです。