blog.takuyan.com

Ruby & Javascript & Hack

Rails3をCapistranoでdeployする上でのbundlerの注意点 on Windows

はじめに


rails3でもcapistrano使いたいですよね。
でもそのままだとbundlerが動かないので、わざわざ本番環境でbundle installとかやらなきゃいけない。
しかもwindows環境で作られたGemfile.lockが邪魔で、削除してから、本番環境用のGemfile.lockを作らないといけない。
なんとかならないかなぁと、思って四苦八苦したメモ。


失敗すると、こうなります

結論

  1. Windows開発環境で作られたGemfile.lockはあくまでWindows環境のもの。
  2. Ubuntu(その他の)環境では使えませんよね(だからbundle_flags --deploymentはダメですよ)
  3. その環境用に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には人柱が必要みたいです。