Bundlerを使用するアプリをデプロイする前に、Gemfile
とGemfile.lock
をソース管理に追加してください。ただし、.bundle
フォルダは各マシンに固有なので無視してください。
$ echo ".bundle" >> .gitignore
$ git add Gemfile Gemfile.lock .gitignore
$ git commit -m "Add Bundler support"
それが完了したら、Bundlerを使用してデプロイする方法は手動と自動の2つがあります。
デプロイスクリプトで、最新のコードに更新した後、すべての依存関係が満たされていることを確認して、バンドルをvendor/bundle
ディレクトリにインストールします。
$ bundle install --deployment
通常どおりにアプリケーションサーバーを起動すると、開発で使用するのとまったく同じgemを使用して、アプリケーションはバンドルされた環境を使用します。
bundle package
を実行した場合は、キャッシュされたgemが自動的に使用されます。
Bundler Capタスクを組み込むには、deploy.rb
ファイルにこれを追加するだけです
require 'bundler/capistrano'
以上です! cap deploy
を実行すると、デプロイに適したオプションを使用してリモートサーバーでbundle install
が自動的に実行されるようになります。変更可能なオプションのリストは、capタスクのヘルプにあります。表示するには、cap -e bundle:install
を実行します。
デフォルトのVladタスクが利用可能です。利用できるようにするには、Vladのdeploy.rb
に次の行を追加します。
require 'bundler/vlad'
それが完了すると、vlad:bundle:install
タスクが使用可能になります。デプロイの一部として実行されていることを確認してください。たとえば
task "vlad:deploy" => %w[
vlad:update vlad:bundle:install vlad:start_app vlad:cleanup
]
バンドル内のgemから実行可能ファイルを実行するには、必ずbundle exec
を使用してください
$ bundle exec rake db:setup
または、インストールコマンドで--binstubs
オプションを使用して、bundle exec
の代わりに使用できる実行可能バイナリを生成することもできます。
Herokuにデプロイすると、Gemfileが存在する限り、Bundlerは自動的に実行されます。Gemfile.lockをチェックインすると、Herokuはbundle install --deployment
を実行します。--without
オプションを使用して特定のグループを除外する場合は、heroku config
を使用する必要があります。
$ heroku config:set BUNDLE_WITHOUT="test development" --app app_name
bundle install
を実行すると、bundlerは(デフォルトで)gemをシステムのgemリポジトリにインストールします。つまり、gem list
に表示されます。さらに、多数のアプリケーションを開発している場合は、各アプリケーションに共通のgemをダウンロードしてインストールする必要はありません。これは開発には便利ですが、デプロイにはやや問題があります。
デプロイシナリオでは、デプロイに使用するUnixユーザーは、システムロケーションにgemをインストールするアクセス権を持っていない可能性があります。ユーザーがアクセス権を持っている(またはsudo
を使用している)場合でも、アプリケーションを起動するユーザーはアクセス権を持っていない可能性があります。たとえば、PassengerはRubyサブプロセスをやや制限されたユーザーであるnobody
で実行します。デプロイ環境でのトレードオフは、隔離をより重視する傾向があります(たとえ、一部のサードパーティの依存関係が変更された場合に、デプロイ時のbundle install
がやや遅くなるとしても)。
その結果、bundlerには、デプロイ環境でbundlerを使用するためのベストプラクティスをカプセル化する--deployment
フラグが付属しています。これらのプラクティスは、bundlerの開発中に受け取った重要なフィードバックと、デプロイ用にbundlerを最適に構成する方法の誤解を反映した多数のバグレポートに基づいています。 --deployment
フラグは、次のデフォルトを追加します
vendor/bundle
にgemをインストールします。アプリケーション内で(Bundler.setup
およびBundler.require
で)起動すると、Bundlerはこの場所を透過的に記憶します。bundle pack
を実行し、vendor/cache
ディレクトリをチェックインし、git gemがない場合、Bundlerはバンドルのインストール中にインターネットに接続しません。Gemfile.lock
のスナップショットが必要であり、提供しなかった場合は失敗します。Gemfile.lock
がGemfile
と比べて古い場合、透過的に更新しませんCapistranoを使用している場合は、vendor/bundle
をshared/vendor_bundle
にシンボリックリンクする必要があります。これにより、bundlerはデプロイ間でインストール済みのgemを共有し(変更がなかった場合は、処理を高速化します)、他のアプリケーションからの分離のメリットも得られます。
バンドルディレクトリをデフォルトでvendor/bundle
に設定し、デプロイプロセスの一部としてバンドルをインストールすることで、アプリケーションをチェックアウトした同じUnixユーザーが、アプリケーションに必要なサードパーティコードもインストールしていることを確認できます。つまり、Passenger(またはUnicorn)がアプリケーションを表示できる場合は、その依存関係も表示できます。
--deployment
フラグには、開発環境とステージング環境で行ったテストが、実際に運用環境に投入したコードを反映していることを確認するために、最新のGemfile.lock
が必要です。アプリケーションをデプロイする前にbundle check
を実行して、Gemfile.lock
が最新であることを確認できます。 Gemfile
を最後に変更してからbundle install
を実行し、アプリケーションを正常に起動した場合(またはテストを実行した場合)は、常に最新の状態になることに注意してください。