Deploying a Git subdirectory in Capistrano with capistrano_rsync_with_remote_cache

今は一つのサーバーだけだし、今後増えるような気もそんなしないけど、やっぱ自動デプロイのほうがかっこいいじゃんと思い、方法をいろいろ探していて、
結構使われているからというだけ(あとPythonよりRubyの方がまだ理解できる)でCapistranoを選んだものの、
Capistrano ver.3は情報少なくて設定方法すらわからないし、publickeyのパスワード入力が丸見えになったし、デプロイするだけで何回も鍵のパスワード入力したし、こいつは自分の手には負えないと思い古いバージョンを使用。

やりたいこととしては

  • gitから取得したい
  • 一応世代管理しておくか
  • gitの取得は本番にそれぞれ鍵置くのも嫌だしローカルでやりたい
  • rsyncでやりたい
  • リポジトリまるごと送らずサブディレクトリだけ送りたい

という感じ。
これだけっちゃこれだけなのに意外と面倒

git取得とrsync

git取得・世代管理はデフォルトの機能なので何も問題なし
ローカルでgit取得してrsyncで送るのは
capistrano_rsync_with_remote_cacheで一瞬
まさかインストールと一行修正だけとは……。

サブディレクトリだけ送りたい

これは意外と困ったけど先人たちが解決方法を残しておいてくれた

と簡単だなーと思ったら、どう見てもリモートでgit取得してます。本当にありがとうございました。
capistrano_rsync_with_remote_cacheで追加された部分と、サブディレクトリだけ送る部分がかち合って、片方無駄になってるっぽい。

どうしてrsyncじゃなくてサブディレクトリの設定が優先されてるか分かってない初心者だが、なんとかなったし、同じような情報がなかったので残しておく

capistrano_rsync_with_remote_cache を使いつつサブディレクトリだけ送る
  1 require 'capistrano/recipes/deploy/strategy/rsync_with_remote_cache'
  2 class RemoteCacheSubdir < Capistrano::Deploy::Strategy::RsyncWithRemoteCache
  3   def rsync_command_for(server)
  4     if configuration[:deploy_subdir] then
  5       "rsync #{rsync_options} --rsh='ssh -p #{ssh_port(server)}' #{local_cache_path}/#{configuration[:deploy_subdir]}/ #{rsync_host(server)}:#{repository_cache_path}/"
  6     else
  7       "rsync #{rsync_options} --rsh='ssh -p #{ssh_port(server)}' #{local_cache_path}/ #{rsync_host(server)}:#{repository_cache_path}/"
  8     end
  9   end
 10 end
 11 set :strategy, RemoteCacheSubdir.new(self)

rsyncするときにdeploy_subdirがあったらそれを付加する感じにオーバーライド
これをCapfileに追加する

こんな感じでできました。

追記
rsyncのコピー元の最後に * が入っていたためそのディレクトリのファイルが更新されていませんでした。