capistranoタスクメモ

ようやく自分の家の環境でcapistranoが動くようになった。開発〜配置までがほぼできるようになったのでようやくスタートライン。


以下、自分用のメモだが、capistranoRails用レシピの中から抜粋というか抽出したcapistranoのタスクの呼出関係、呼び出され関係。":"が付いてるものはnamespace。
(/usr/lib/ruby/gems/1.8/gems/capistrano-2.1.0/lib/capistrano/recipes/deploy.rb)

deploy:
  defaul
    update
      update_code
        on_rollback { run "rm -rf #{release_path}; true" }
            #rollback
        strategy.deploy!
               #実際のdeploy
        finalize_update
            #{latest_release}/(log|public/system|tmp/pids)を
            #{shared_path}配下にlnするためのタスク
      symlink
        rm -f #{current_path} && \
               ln -s #{latest_release} #{current_path}
                # ここで最終的にdeployしたコードとcurrentを接続
    restart
  rollback
    rollback_code
    restart
  migrations
      # ここでset :migrate_target, :latest
    update_code
    migrate
    symlink
    restart
  setup
  upload
     #ファイルのアップロードができる便利タスク
  cleanup
     #最近の5リリースを残してサーバから消去
  check
     #必要なものがあるかチェック
  cold
    update
    migrate
    start
  stop
  pending:
    diff
    default
  web:
    disable
    enable

migrationsというタスクが名前に似合わず、update,migrate,symlink,restartまでやっているのはちょっと微妙な...。


で、なんでこんなものをわざわざ作ったかというと、cap -Tとかマニュアルじゃあんまりよくわかんないって言うのが一つ目の理由。あと、capタスクにフックを書きたかった。updateタスクにはbefore_update, after_updateというフックが書けるっぽいので、どこに付けようかなったいうのを検討したかったついでにメモ。


今作っているアプリは、画像ファイルアップロードの際に、

  1. オリジナルのファイルをファイルアップロード用のディレクトリ(非公開ディレクトリ)に保存している。
  2. オリジナルを保存した後、公開ディレクトリにサイズ変更したものを置いている。


そのため、capistranoでアプリのコードをアップデートした場合でも、全releaseファイルで共有したいディレクトリがそれぞれ、公開ディレクトリに1つ、非公開ディレクトリに1つある。この2つのディレクトリをsharedに置いて、currentディレクトリにリンクを張るというのがタスクでやりたい。


上の呼出関係を見ると今回やりたいタスクに関しては、finalize_updateの前後(かつfinalize_updateとほとんど同じ仕組み)がよいみたい。というわけで、config/deploy.rbに下のような感じのタスクを追加すればよい。すごく便利。

set :public_uploaded_dir, "public/uploaded"
set :private_uploaded_dir, "private/uploaded"

task :after_finalize_update, :except => { :no_release => true } do
some path'"
  run <<-CMD
    rm -rf #{latest_release}/#{private_uploaded_dir} &&
    rm -rf #{latest_release}/#{public_uploaded_dir} &&
    ln -s #{shared_path}/#{private_uploaded_dir} \
              #{latest_release}/#{private_uploaded_dir} &&
    ln -s #{shared_path}/#{public_uploaded_dir} \
              #{latest_release}/#{public_uploaded_dir}
  CMD
end


Rails使いはじめて4ヶ月ぐらいはたったかな。たぶん、Rails開発環境の構築〜開発までは順調にきてたし、まあなんとでも作れる。ただ、開発に集中してて、サービス公開に関する部分は完全に抜けていた。本番環境の整備は最近やっと手を付けたところ。


さいわい、家に十分な数の実験用パソコンがあるからレンサバで実験してサーバに負荷かけて怒られるとか心配いらないからよい。自由に使いたいライブラリのインストール実験とかできる。結構これは経験値得るために重要。家に無駄にパソコンがあるとよい。ちなみにうちはサーバ、メインのレッツノート以外に、Thinkpadが6台、使ってないDesktopが2台w