はじめに
デプロイに Capistrano が使用されているWebアプリケーションの開発に参加した際に、Webアプリケーションの CI 上でデプロイが行われており、以下の画像のように様々なタスクが順番に実行されているログはわかったのですが、それがどこに定義されているかわからりませんでした...
※ 画像は Capistrano 公式ドキュメント から引用
それからドキュメントやコードを読んでいくうちに、Capistrano がどのようにタスクの順序を制御しているのか少しづつ理解できるようになったので、本記事にタスクの実行順序についてまとめてみました!
Capistrano の基本
Capistrano は Ruby で書かれたリモートサーバーへのデプロイを自動化するためのツールです。
コマンド cap xxxx deploy
(例: cap product deploy
や cap staging deploy
など環境に応じて変える) を実行することでデプロイが行われます。具体的には、以下の deploy:xxxx
という名前のタスクが以下の順番に実行されていきます。
deploy:starting - start a deployment, make sure everything is ready
deploy:started - started hook (for custom tasks)
deploy:updating - update server(s) with a new release
deploy:updated - updated hook
deploy:publishing - publish the new release
deploy:published - published hook
deploy:finishing - finish the deployment, clean up everything
deploy:finished - finished hook
上記のフローを基準として、実行したい内容に応じてデプロイのフローをカスタマイズしていきます。
既存のライブラリを使用して、デプロイのフローをカスタマイズする
デプロイフローのカスタマイズ方法の一つは、既存のライブラリを使った方法です。
インストールしたライブラリを Capfile
という名前のファイルに以下のように require
することで、ライブラリに応じたタスクがデプロイのフローに追加されます。
require 'capistrano/xxxxxxx'
例として、デプロイのフローに bundler のタスクの追加する capistrano/bundler
を紹介します。
このライブラリは bundler
関連のタスクが用意されており、デプロイ時に bundle install
を行いたい場合等で使用します。
Capfile
に require 'capistrano/bundler'
を記述することで、デプロイのフローに bundler
のタスクが組み込まれます。
具体的には、lib/capistrano/tasks/hooks.cap
に以下のように書かれている通り、deploy:updated
の前に bundler:install
タスクを追加しています。
before 'deploy:updated', 'bundler:install'
before 'deploy:reverted', 'bundler:install'
このように、ライブラリがどんなタスクを提供しており、どのタスクの前後に実行されるのか理解すれば、そのライブラリを使いこなせるようになると思います!!
自分でタスクを作成して、デプロイのフローをカスタマイズする
ライブラリを Capfile で require する方法以外にも、自分でタスクを作成し、それをデプロイフローに組み込むことも可能です。
自分で作成するタスクは、Rakeタスク形式で記述します。そして、before
や after
で既存のタスクを指定することで、好みのタイミングで自分の作成したタスクを実行することができます。
# call an existing task
before :starting, :ensure_user
after :finishing, :notify
# or define in block
namespace :deploy do
before :starting, :ensure_user do
#
end
after :finishing, :notify do
#
end
end
詳しくは以下のドキュメントに記載されています。
おわりに
本記事で紹介した2つの方法を元に、Capistrano のタスクを読み解いていくことでデプロイのフローを理解することができるようになると思います!
僕はまだまだ Capistrano 初心者なので、足りない点や間違っていることなどもあるかもしれませんが、コメントや編集リクエスト等を送っていただけると助かります!!
参考にしたサイト等
- Capistrano 公式ドキュメント
- Capistrano GitHub
- Qiitaの記事