CapistranoでGitのサブディレクトリ以下をデプロイする

備忘録を兼ねてメモ。 Gitのサブディレクトリ以下とは、例えばこんな構成です。 通常であればRailsアプリがGitリポジトリ直下にありますが、 複数のRailsアプリがあるなどしてデプロイしたいアプリがGitリポジトリのサブディレクトリ以下にある場合です。

repogitory/
      ├── user   # エンドユーザー向けのRailsアプリケーション
      ├── admin  # 管理者向けRailsアプリケーション
      ├── core   # Modelなど各アプリから参照されるRailsエンジン

Gitリポジトリ直下にアプリがある場合は、言わずもがなCapistranoで簡単にデプロイできますよね。 けど、今回のようなケースですと一工夫してやる必要があります。 stackoverflowに解決案がありました。

Strategyの追加

require 'capistrano/recipes/deploy/strategy/remote_cache'

class Capistrano::Deploy::Strategy::RemoteCacheSubdir < Capistrano::Deploy::Strategy::RemoteCache
  private
  def repository_cache_subdir
    if configuration[:deploy_subdir]
      File.join repository_cache, configuration[:deploy_subdir]
    else
      repository_cache
    end
  end

  def copy_repository_cache
    if copy_exclude.empty?
      run "cp -RpL #{repository_cache_subdir} #{configuration[:release_path]} && #{mark}"
    else
      exclusions = copy_exclude.map { |e| "--exclude="#{e}"" }.join(' ')
      run "rsync -lrpt #{exclusions} #{repository_cache_subdir}/* #{configuration[:release_path]} && #{mark}"
    end
  end
end

deploy.rbの設定

require './lib/deploy/strategy/remote_cache_subdir'
set :strategy, Capistrano::Deploy::Strategy::RemoteCacheSubdir.new(self)
set :deploy_subdir, -> 'admin'
Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

芝原悠介

heathrowでは設計、開発、運用なんでもやってます。 好きな言語は、最近もっぱらRuby。 http://heathrow.co.jp/

芝原悠介の書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ