Capistrano-rsync をつかってみた

デプロイ先から Git サーバにアクセスさせたくないという要求があって、capistrano-rsync を使ってみました。ちょっとハマったのでメモ。

環境

  • ruby 2.1.0
  • capistrano v3.1.0
  • capistrano-rsync v1.0.2

まず

Gemfile に適当に突っ込んでおく。

1
2
3
4
group :development do
  gem 'capistrano'
  gem 'capistrano-rsync'
end

基本的には普通に capistrano v3 の設定をする。

はまったところ

scm を rsync に

capistrano-rsync を使ってデプロイするためにconfig/deploy.rbで scm を rsync にする。

1
set :scm, :rsync

キャッシュ用ディレクトリの作成

このまま実行してみると、デプロイ先にキャッシュ用ディレクトリがなくて落ちるので、deploy:check:directoriesのあとに作成するようにする。

1
2
3
4
5
6
7
8
9
10
11
namespace :deploy do
  namespace :check do
    task :directories_for_rsync do
      on release_roles :all do
        execute :mkdir, '-pv', File.join(fetch(:deploy_to), fetch(:rsync_cache))
      end
    end
  end
end

after 'deploy:check:directories', 'deploy:check:directories_for_rsync'

rsync_options

capistrano-rsync の README には、

Set some rsync_options to your liking: set :rsync_options, %w[--recursive --delete --delete-excluded --exclude .git*]

と書いてあるのですが、rsync_optionsが設定できなくて苦労しました。どうやらデフォルトに上書きされてしまっているっぽい、ということでrsync_optionsを使う直前で設定するようにしました。

(自分が capistrano の理解が甘いだけな気もするわけですが)

1
2
3
4
5
6
7
namespace :rsync do
  task :set_options do
    set :rsync_options, %w[--recursive --delete --delete-excluded --exclude .git*]
  end
end

before 'rsync', 'rsync:set_options'

まとめ

capistrano-rsync 便利!特に大きなプロジェクトをデプロイするときとか重宝しそうですね。