第8回 deploy:rollback と deploy:cleanup

2008/05/18

今回は、deploy:rollback タスクと deploy:cleanup タスクについて。


deploy:update タスクを実行すると、Capistrano は Subversion などのリポジトリからソースコードをチェックアウトしてくるのだが、もう少し詳細に見ると、いろんなことをしている。

  • releases ディレクトリの下に現在時刻に基づく YYmmddHHMMSS 形式のサブディレクトリを作り、そこに最新のソースコードをチェックアウトする。
  • そのサブディレクトリに shared/log ディレクトリへのシンボリックリンクを作る。
  • current ディレクトリからそのサブディレクトリへのシンボリックリンクを作る。

つまり、Capistrano は以前にチェックアウトしたソースコードも取っておいて、シンボリックの作り替えによって最新版が動くようにしているわけだ。


deploy:rollback は、一つ前のソースコードに戻してアプリケーションを再起動するタスクである。具体的には、current ディレクトリのリンク先を一つ前のソースコードをチェックアウトしたディレクトリに替えて、最新のソースコードを削除し、deploy:restart タスクを実行する。

デプロイしたばかりのアプリケーションに重大なバグが発見されて、急いで元に戻したい場合に用いるタスクである。

  * executing `deploy:rollback'
  * executing `deploy:rollback_code'
  * executing "ls -x /var/rails/ballad/releases"
    servers: ["alpha.oiax.jp"]
    [alpha.oiax.jp] executing command
    command finished
  * executing "rm /var/rails/ballad/current; ln -s /var/rails/ballad/releases/20080517010640
/var/rails/ballad/current && rm -rf /var/rails/ballad/releases/20080518014637"
    servers: ["alpha.oiax.jp"]
    [alpha.oiax.jp] executing command
    command finished
  * executing `deploy:restart'
  * executing "/var/rails/ballad/current/script/process/reaper"
    servers: ["alpha.oiax.jp"]
    [alpha.oiax.jp] executing command
 ** [out :: alpha.oiax.jp] Restarting 17952
 ** [out :: alpha.oiax.jp] Restarting 17962
 ** [out :: alpha.oiax.jp] Restarting 17964
 ** [out :: alpha.oiax.jp] Restarting 17960
    command finished

さて、deploy:update タスクを繰り返し実行すると、古いソースコードがターゲットホストに貯まっていくことになる。ディスクスペースの無駄なので、最新版から何世代かを残して消去しておきたい。

そのような時に、deploy:cleanup タスクを使用する。

デフォルトでは5世代分のソースコードを残してすべて消去する。残すべき世代数は keep_releases 変数で制御できるので、config/deploy.rb に次のように書けば、3世代分を残すようになる。

set :keep_releases, 3

実行例:

  * executing `deploy:cleanup'
  * executing "ls -x /var/rails/ballad/releases"
    servers: ["alpha.oiax.jp"]
    [alpha.oiax.jp] executing command
    command finished
 ** keeping 3 of 5 deployed releases
  * executing "rm -rf /var/rails/ballad/releases/20080512155340
/var/rails/ballad/releases/20080513092114"
    servers: ["alpha.oiax.jp"]
    [alpha.oiax.jp] executing command
    command finished