- 更新日: 2014年8月10日
- Rails
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# ... namespace :deploy do # ... desc 'db_seed must be run only one time right after the first deploy' task :db_seed do on roles(:db) do |host| within current_path do execute 'bundle exec rake', 'db:seed' end end end # ... end |
bundle コマンドが見つかりません、とエラーになる。RAILS_ENV の値が空になって適切な環境のDBに対してデプロイされない、等の問題も発生。
Capistrano3 で bundle exec rake db:seed が動作するコード
調べつつ改良したのが以下のコードです。
config/deploy.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# ... # SSHKit.conifg SSHKit.config.command_map[:rake] = 'bundle exec rake' namespace :deploy do # ... desc 'db_seed must be run only one time right after the first deploy' task :db_seed do on roles(:db) do |host| within current_path do with rails_env: fetch(:rails_env) do execute :rake, 'db:seed' end end end end # ... end |
以下の点を修正しました。
1 |
SSHKit.config.command_map[:rake] = 'bundle exec rake' |
SSHKit.config の設定により、rake コマンドを ‘bundle exec rake’ コマンドとして実行できるようになります。
1 |
with rails_env: fetch(:rails_env) do |
with rails_env の行の追加により、適切な環境(rails_env)を渡してコマンドを実行できます。
以上の修正により、正常に db_seed タスクを Capistrano のタスクとして実行できるようになりました。
なお、作成した db_seed タスクは Capistrano での before, after などのフックでは実行せずに、通常のデプロイ処理には含めません。db_seed タスクは、単発で初回のデプロイ直後に1回のみ実行させるようにしました。
初回のデプロイ直後に1回だけ実行。
1 2 3 4 |
$ bundle exec cap staging deploy $ bundle exec cap staging deploy:db_seed |
2回目以降のデプロイ後は db_seed を実行しない。
1 2 3 |
$ bundle exec cap staging deploy |
本文のテーマとは異なりますけど、Capistrano により Rails アプリケーションをデプロイする場合、rake db:create, rake db:seed の処理はどこで行うのがベストなのでしょうかね?一応私の場合、以下のような方針を考えました。
rake db:create
→ 相当する Rails アプリケーション DB 作成の処理を、MySQL 用の Chef Recipe で作成し事前にプロビジョニング。
rake db:seed
→ 今回のエントリーの通り、Capistrano での初回デプロイ直後に、Capistrano のタスクとして1回のみ実行。
Chef(プロビジョニングツール)や Capistrano(デプロイツール)を使うので、サーバーの構成管理については、サーバーに直接入って手動で何かしら変更する作業…というのは、最近はできるだけ行わないように心掛けています。
- – 参考リンク –
- Capistrano version 3.0 で rake を bundle exec rake にする方法 | heathrow.lab
- Rails 4, Capistrano 3 fail during bundle exec rake assets:precompile and returns rake stdout: Nothing – Stack Overflow
- Richard Huang – Upgrade to capistrano3
- capistrano3でrails_envを指定してコマンドを実行する – Qiita
- Capistrano3でRails4.1アプリケーションをデプロイ | EasyRamble
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
Leave Your Message!