デプロイ周りは苦手なので備忘録として残しておきます。Capistranoを用いたRailsアプリケーションのデプロイ方法のメモです。
詳しくは以下のページに細かく載っているので、それがちゃんと理解できれば問題ないと思います。
入門 Capistrano 3 ~ 全ての手作業を生まれる前に消し去りたい
Capistrano3におけるRailsのデプロイタスクの内部実装
此処から先は上のリンクを踏まえた上での自分なりの理解です。
初期化
capistranoを使うときにはじめにやるコマンドは以下です。
$ bundle exec cap install
作られるファイルは以下です。
Capfile
config/deploy.rb
config/deploy/production.rb
config/deploy/staging.rb
Capfileにcapistranoのplugin等をrequireしていきます。deploy.rbには共通の設定を書き、production.rbやstaging.rbには各環境に特化した設定を書きます。
デフォルトのタスク
Capfile
で、
require 'capistrano/deploy'
で読み込みを行っていれば、デフォルトでnamespaceがdeployのタスクが読み込まれます。
capistrano/deploy
では capistrano/framework
が読み込まれています。
capistrano/framework
の実装を見ると細かいタスクの実装は定義されておらず、deployタスクで実行する順番が定義されているようです。
空のタスクを上書きすることにより、デプロイの設定の詳細を記述しています。
順番としては
- deploy:starting
- deploy:print_config_variables
- deploy:check
- deploy:check:directories
- deploy:check:linked_dirs
- deploy:check:make_linked_dirs
- deploy:check:linked_files
- deploy:set_previous_revision
- deploy:started
- deploy:updating
- deploy:set_current_revision
- deploy:symlink:shared
- deploy:symlink:linked_files
- deploy:symlink:linked_dirs
- deploy:updated
- deploy:publishing
- deploy:symlink:release
- deploy:published
- deploy:finishing
- deploy:cleanup_rollback
- deploy:finished
- deploy:log_revision
のような感じです。
デフォルトではRailsに関するタスクはないので、
require 'capistrano/rails'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
で読み込むことでmigrationやassetsに関するタスクが追加されます。
設定を書く・タスクを書く
共通の設定を deploy.rb
に書いていきます。
set
を使用して固有の設定を書きます。
設定については公式のドキュメントを読むのが一番良いです。
デフォルトのタスク意外にタスクを追加する際は、以下のように書いていきます。
namespace :hoge do
task :fuga do
# ...
end
end
before 'deploy:starting', 'hoge:fuga'
上記のタスクは deploy:starting
タスクの前に hoge:fuga
タスクを実行するように書いています。 before
はcapistranoのDSLで、第一引数で指定したタスクの前に第二引数のタスクを実行するというように使います。 before
の他にも after
があり、capistrano/deploy
で読み込んだデフォルトのタスクにいろいろ追加していくことでデプロイのタスクを作り込んでいきます。
before
やafter
を多用するとタスクの実行順序がわかりにくくなるため、タスクの上書きが行えるのであれば上書きで対応するのが良さそうです。
タスクの上書きは
Rake::Task["deploy:migrate"].clear_actions
のようにタスクをクリアします。Capistranoの2系列では同名のタスクは上書きできたようですが、3系列で仕様が変わったようです。
実行する
設定やタスクが書き終えたら実行できるか dry-run
で試します。
bundle exec cap デプロイする環境 実行するタスク オプション
$ bundle exec cap production deploy --trace --dry-run
--trace
はタスクが出力されるオプションです。 --dry-run
は実際に動かすかテストできるオプションです。
これでうまくタスクの実行を確認できれば一旦ステージングで試した後、プロダクションでも実行することが可能になると言えると思います。