Capistrano3 で bundle exec rake db:seed のタスクを実行

Rails アプリケーションで初期DBデータを投入するために、bundle exec rake db:seed コマンドの処理を Capistrano のタスクとして作成しました。最初に書いたコードが動かなくて、はまった箇所が2つ。

1. ‘bundle exec rake’ コマンドが bundle コマンドが見つからない、となってエラー。
2. RAILS_ENV 環境変数がセットされず、適切な環境のDBに対して rake db:seed が行われない。

— 環境 —
rails (4.1.1)
capistrano (3.2.1)

スポンサーリンク

最初の動かない deploy.rb コード

最初、以下のように書いていたらエラー。

config/deploy.rb

bundle コマンドが見つかりません、とエラーになる。RAILS_ENV の値が空になって適切な環境のDBに対してデプロイされない、等の問題も発生。

Capistrano3 で bundle exec rake db:seed が動作するコード

調べつつ改良したのが以下のコードです。

config/deploy.rb

以下の点を修正しました。

SSHKit.config の設定により、rake コマンドを ‘bundle exec rake’ コマンドとして実行できるようになります。

with rails_env の行の追加により、適切な環境(rails_env)を渡してコマンドを実行できます。

以上の修正により、正常に db_seed タスクを Capistrano のタスクとして実行できるようになりました。

なお、作成した db_seed タスクは Capistrano での before, after などのフックでは実行せずに、通常のデプロイ処理には含めません。db_seed タスクは、単発で初回のデプロイ直後に1回のみ実行させるようにしました。

初回のデプロイ直後に1回だけ実行。

2回目以降のデプロイ後は db_seed を実行しない。

本文のテーマとは異なりますけど、Capistrano により Rails アプリケーションをデプロイする場合、rake db:create, rake db:seed の処理はどこで行うのがベストなのでしょうかね?一応私の場合、以下のような方針を考えました。

rake db:create
→ 相当する Rails アプリケーション DB 作成の処理を、MySQL 用の Chef Recipe で作成し事前にプロビジョニング。

rake db:seed
→ 今回のエントリーの通り、Capistrano での初回デプロイ直後に、Capistrano のタスクとして1回のみ実行。

Chef(プロビジョニングツール)や Capistrano(デプロイツール)を使うので、サーバーの構成管理については、サーバーに直接入って手動で何かしら変更する作業…というのは、最近はできるだけ行わないように心掛けています。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!