検証したい事
複数 server
に db
ロールが設定されている場合、db:migrate
が複数回実行されるのでは??
気になり調査、検証してみました。
結果
db:migrate
は1回だけ実行されるように配慮された実装になっていました。
capistrano/tasks/migrations.rake#L38
また、定義順序を変更して検証をしてみると、最初に定義されている server
で実行されました。
server定義順序を変更した検証
パターン1
capistrano
# app01.com、app02.comの順に記述
server 'app01.com', user: 'ssh-user', roles: %w{app db}
server 'app02.com', user: 'ssh-user', roles: %w{app db}
deploy実行ログ
app01.comでdb:migrateが実行された
** Invoke deploy:migrating (first_time)
** Invoke deploy:set_rails_env
** Execute deploy:migrating
INFO [79c7f9ef] Running /usr/local/rbenv/bin/rbenv exec bundle exec rake db:migrate as ssh-user@app01.com
INFO [1661fd3f] Finished in 3.259 seconds with exit status 0 (successful).
パターン2
capistrano
# app02.com、app01.comの順に記述
server 'app02.com', user: 'ssh-user', roles: %w{app db}
server 'app01.com', user: 'ssh-user', roles: %w{app db}
deploy実行ログ
app02.comでdb:migrateが実行された
** Invoke deploy:migrating (first_time)
** Invoke deploy:set_rails_env
** Execute deploy:migrating
INFO [79c7f9ef] Running /usr/local/rbenv/bin/rbenv exec bundle exec rake db:migrate as ssh-user@app02.com
INFO [1661fd3f] Finished in 3.259 seconds with exit status 0 (successful).
まとめ
dbロールが複数定義されていても、db:migrate
は1回しか実行されません。
とはいえ、誤解が生じないよう特定の server
1つだけにdbロールは定義したほうが良いですね。
server 'app01.com', user: 'ssh-user', roles: %w{app db}
server 'app02.com', user: 'ssh-user', roles: %w{app}