capistrano-withrsyncを使ってVagrantで構築したVMにデプロイする

#capistrano

Capistranoを使ったシーンで、デプロイ先にgit cloneさせるのを避けるために、rsyncを使ってローカルマシンから本番サーバへのデプロイを試みたい。 ペパボ福岡支社のlinyowsさんがcapistrano-withrsyncというGemを作っていたので、それを使ってみた。

ちなみにmoll/capistrano-rsyncというGemもあるが、どうも更新されている気配が無いので今回は見送り。

なお、Capistranoのバージョンは3系とする。

Capistranoの準備

Gemfileに以下の2つのgemを用意する。

group :development do
  gem "capistrano"
  gem "capistrano-withrsync"
end

一式の導入が完了したら、cap installで初期ファイルを生成する。

$ bundle exec cap install
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
Capified

この状態からカスタマイズに入っていく。

Capfileの編集

必要そうなタスクと、capistrano/withrsyncを追加しておく。

# Load DSL and Setup Up Stages
require 'capistrano/setup'

# Includes default deployment tasks
require 'capistrano/deploy'

# Includes tasks from other gems included in your Gemfile
require 'capistrano/withrsync'

Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }

config/deploy.rbの編集

少なくとも:repo_urlさえ設定すれば良いと思う。

ただし、:deploy_toで指定するデプロイ先のディレクトリ権限だけ気をつける。 capistrano-withrsyncに限った話ではないが、デプロイ先のディレクトリとそのパーミッションは先に設定しておかないとvagrantユーザの権限不足でデプロイに失敗する(調査不足なだけで、他に良い方法があるような気がする)。

set :application, 'my_application'
set :repo_url, 'git@github.com:<GITHUB USERNAME>/<YOUR REPOSITORY>.git'
set :deploy_to, '/var/capistrano'

config/deploy/vagrant.rbの用意

staging.rbproduction.rbは無視して、新たにvagrant.rbを作る。中身を以下のように設定する。

set :ssh_options, {
  keys:         %w(~/.vagrant.d/insecure_private_key),
  auth_methods: %w(publickey)
}

# overwrite :rsync_options
set :rsync_options, fetch(:rsync_options).push('-e "ssh -i $HOME/.vagrant.d/insecure_private_key"')

server '10.0.0.4', roles: [:vagrant], user: 'vagrant'

capistrano-withrsyncを使ってVagrant VMにデプロイしようとすると、rsync転送時にvagrantユーザのパスワードを求められる。 vagrant ssh-config <VM-DEFINE> | tee -a ~/.ssh/configしてもいいが、出来ればcapistranoの設定だけで簡潔させたい。 そこで、:rsync_optionsを使う。

:rsync_optionswithrsync.rake#L5-L11で定義されるrsyncの転送オプションである。 ここに、-e "ssh -i $HOME/.vagrant.d/insecure_private_key"を追加して公開鍵認証を有効にしている。

ここまでの設定が完了したら、cap vagrant deployでデプロイが可能になっている。

終わりに

Capistranoとcapistrano-withrsyncによる、rsyncを用いたデプロイ方法を紹介した。 ローカルマシンに降ろしてきたリポジトリをrsyncで転送するので、デプロイ先からgit cloneしにくい状況でも問題なくデプロイが可能になる。

VagrantにはSynced Foldersがあるから、意義はやや薄いが、プロダクション環境と同じ方法でデプロイ出来ると開発方法が統一されて良いと思う。

まだまだCapistranoに明るくないので、より良い方法があれば教えていただければ幸いです。

参考