Tech Racho エンジニアの「?」を「!」に。
  • 開発

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'

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。