require 'fontana_client_support' include Fontana::ServerRake
include Fontana::RakeUtils
require 'fileutils'
namespace :vendor do
namespace :fontana do fileutils = FileUtils::Verbose def vendor_fontana_version d = FontanaClientSupport.vendor_fontana if Dir.exist?(d) Dir.chdir(d) do # http://qiita.com/sugyan/items/83e060e895fa8ef2038c s = `git describe --tags` s.scan(/\A(v\d+\.\d+\.\d+)/).flatten.first end end end def vendor_fontana_branch return nil unless Dir.exist?(FontanaClientSupport.vendor_fontana) Dir.chdir(FontanaClientSupport.vendor_fontana) do return FontanaClientSupport.git_current_branch_name end end def raise_if_fontana_branch_empty if Fontana.branch.nil? || Fontana.branch.empty? # FONTANA_BRANCHがnilならmasterが設定されているはずです raise "\e[31mInvalid FONTANA_BRANCH: #{ENV['FONTANA_BRANCH'].inspect}. Please set valid value or unset FONTANA_BRANCH.\e[0m" end end task :version do puts vendor_fontana_version end task :clear => :"servers:stop:all" do d = FontanaClientSupport.vendor_fontana fileutils.rm_rf(d) if Dir.exist?(d) end case FontanaClientSupport.deploy_strategy when :scm then task :deploy_reset => :"deploy:scm:reset" task :deploy_update => :"deploy:scm:update" when :sync then task :deploy_reset => :"deploy:sync:reset" task :deploy_update => :"deploy:sync:update" end task_sequential :setup, [ :"vendor:fontana:clone", :"vendor:fontana:configs", :"vendor:fontana:bundle_install", :"vendor:fontana:deploy_reset", ] task :clone do raise_if_fontana_branch_empty raise "$FONTANA_REPO_URL is required" unless Fontana.repo_url fileutils.mkdir_p(FontanaClientSupport.vendor_dir) fileutils.chdir(FontanaClientSupport.root_dir) do system!("git clone #{Fontana.repo_url} vendor/fontana -b #{Fontana.branch}") end fileutils.chdir(FontanaClientSupport.vendor_fontana) do unless Fontana.version.nil? || Fontana.version.empty? system!("git checkout master && git reset --hard #{Fontana.version}") end end end task :configs do fileutils.chdir(FontanaClientSupport.vendor_fontana) do [ File.join(FontanaClientSupport.root_dir, "config/fontana_mongoid.yml"), "config/mongoid.yml.example" ].each do |path| if File.readable?(path) fileutils.cp(path, "config/mongoid.yml") break end end fileutils.cp("config/project.yml.erb.example", "config/project.yml.erb") end end task :bundle_install do fileutils.chdir(FontanaClientSupport.vendor_fontana) do # 開発環境での使用を想定しているので(ステージング、本番ではfontanaをデプロイするので) # ここでは --path=vendor/bundle を指定しない system!("BUNDLE_GEMFILE=#{Fontana.gemfile} bundle install") end end task_sequential :update, [ :"vendor:fontana:fetch_and_checkout", :"vendor:fontana:configs", :"vendor:fontana:bundle_install", :"vendor:fontana:db_drop", :"vendor:fontana:deploy_update", ] task :fetch_and_checkout do fileutils.chdir(FontanaClientSupport.vendor_fontana) do system!("git fetch origin") system!("git checkout origin/#{Fontana.branch}") end end task :db_drop => :"bundle:unset_env" do fileutils.chdir(FontanaClientSupport.vendor_fontana) do system!("BUNDLE_GEMFILE=#{Fontana.gemfile} bundle exec rake db:drop") end end desc "reset vendor/fontana" task_sequential :reset, [:"vendor:fontana:clear", :"vendor:fontana:setup"] task :prepare do raise_if_fontana_branch_empty vfb = vendor_fontana_branch vfv = vendor_fontana_version puts "vendor/fontana branch: #{vfb.inspect} version: #{vfv.inspect}" puts " required branch: #{Fontana.branch.inspect} version: #{Fontana.version.inspect}" if !Dir.exist?(FontanaClientSupport.vendor_fontana) # vendor/fontana が存在しない場合 puts "\e[34mvendor/fontana does not exist.\e[0m" Rake::Task["vendor:fontana:reset"].delegate elsif vfb != Fontana.branch # vendor/fontanaのブランチが FONTANA_BRANCH と異なる場合 # puts "\e[33m but FONTANA_BRANCH is #{Fontana.branch}\e[0m" Rake::Task["vendor:fontana:reset"].delegate elsif Fontana.version.nil? || Fontana.version.empty? # FONTANA_BRANCHとvendor/fontanaのブランチが同じで、FONTANA_VERSIONが指定されていない場合 puts "\e[34mvendor/fontana's branch is #{vfb} as same as FONTANA_BRANCH. Now pulling origin #{vfb.inspect} \e[0m" fileutils.chdir(FontanaClientSupport.vendor_fontana) do system!("git pull origin #{Fontana.branch}; git status") end elsif vfv.nil? # FONTANA_BRANCHとvendor/fontanaのブランチが同じで、vendor/fontanaのバージョンが取得できない場合 puts "\e[33mversion not found in vendor/fontana\e[0m" Rake::Task["vendor:fontana:reset"].delegate elsif vfv == Fontana.version # FONTANA_BRANCHとvendor/fontanaのブランチが同じで、FONTANA_VERSIONが指定されていて、vendor/fontanaのバージョンと同じものの場合 puts "\e[32m#{Fontana.version} is already used.\e[0m" else # FONTANA_BRANCHとvendor/fontanaのブランチが同じで、FONTANA_VERSIONが指定されていて、vendor/fontanaのバージョンと異なる場合 puts "\e[33m#{vfv} is used but FONTANA_VERSION is #{Fontana.version}\e[0m" # name = Dir.exist?(FontanaClientSupport.vendor_fontana) ? "update" : "reset" # Rake::Task["vendor:fontana:#{name}"].delegate Rake::Task["vendor:fontana:reset"].delegate end end end
end