LoginSignup
10
3

More than 1 year has passed since last update.

Capistrano 入門~タスクの実行順序を理解する~

Posted at

はじめに

デプロイに Capistrano が使用されているWebアプリケーションの開発に参加した際に、Webアプリケーションの CI 上でデプロイが行われており、以下の画像のように様々なタスクが順番に実行されているログはわかったのですが、それがどこに定義されているかわからりませんでした...


※ 画像は Capistrano 公式ドキュメント から引用

それからドキュメントやコードを読んでいくうちに、Capistrano がどのようにタスクの順序を制御しているのか少しづつ理解できるようになったので、本記事にタスクの実行順序についてまとめてみました!

Capistrano の基本

Capistrano は Ruby で書かれたリモートサーバーへのデプロイを自動化するためのツールです。

コマンド cap xxxx deploy (例: cap product deploycap 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 を行いたい場合等で使用します。

Capfilerequire 'capistrano/bundler' を記述することで、デプロイのフローに bundler のタスクが組み込まれます。
具体的には、lib/capistrano/tasks/hooks.cap に以下のように書かれている通り、deploy:updated の前に bundler:install タスクを追加しています。

capistrano/tasks/hooks.cap
before 'deploy:updated', 'bundler:install'
before 'deploy:reverted', 'bundler:install'

このように、ライブラリがどんなタスクを提供しており、どのタスクの前後に実行されるのか理解すれば、そのライブラリを使いこなせるようになると思います!!

自分でタスクを作成して、デプロイのフローをカスタマイズする

ライブラリを Capfile で require する方法以外にも、自分でタスクを作成し、それをデプロイフローに組み込むことも可能です。
自分で作成するタスクは、Rakeタスク形式で記述します。そして、beforeafter で既存のタスクを指定することで、好みのタイミングで自分の作成したタスクを実行することができます。

# 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 初心者なので、足りない点や間違っていることなどもあるかもしれませんが、コメントや編集リクエスト等を送っていただけると助かります!!

参考にしたサイト等

10
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
3