第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