blavosync 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Blavosync.gemspec +20 -5
- data/History.txt +2 -0
- data/Manifest.txt +15 -0
- data/README.markdown +91 -0
- data/VERSION +1 -1
- data/lib/blavosync/lib/ey_logger.rb +125 -0
- data/lib/blavosync/lib/ey_logger_hooks.rb +14 -0
- data/lib/blavosync/recipes/content_rsync.rb +39 -0
- data/lib/blavosync/recipes/content_tar.rb +64 -0
- data/lib/blavosync/recipes/database.rb +79 -0
- data/lib/blavosync/recipes/local.rb +167 -0
- data/lib/blavosync/recipes/util.rb +21 -0
- data/lib/blavosync/recipes.rb +15 -0
- data/lib/blavosync.rb +2 -294
- data/test/test_blavosync.rb +11 -0
- data/test/test_helper.rb +2 -0
- metadata +18 -6
- data/README.rdoc +0 -118
- data/init.rb +0 -3
data/Blavosync.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{blavosync}
|
8
|
-
s.version = "0.1
|
8
|
+
s.version = "0.2.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["jayronc"]
|
@@ -14,22 +14,37 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.email = %q{jerrodblavos@mac.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
|
-
"README.
|
17
|
+
"README.markdown"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
"Blavosync.gemspec",
|
21
|
+
"History.txt",
|
21
22
|
"LICENSE",
|
22
|
-
"
|
23
|
+
"Manifest.txt",
|
24
|
+
"README.markdown",
|
23
25
|
"Rakefile",
|
24
26
|
"VERSION",
|
25
|
-
"
|
26
|
-
"lib/blavosync.rb"
|
27
|
+
"lib/blavosync.rb",
|
28
|
+
"lib/blavosync/lib/ey_logger.rb",
|
29
|
+
"lib/blavosync/lib/ey_logger_hooks.rb",
|
30
|
+
"lib/blavosync/recipes.rb",
|
31
|
+
"lib/blavosync/recipes/content_rsync.rb",
|
32
|
+
"lib/blavosync/recipes/content_tar.rb",
|
33
|
+
"lib/blavosync/recipes/database.rb",
|
34
|
+
"lib/blavosync/recipes/local.rb",
|
35
|
+
"lib/blavosync/recipes/util.rb",
|
36
|
+
"test/test_blavosync.rb",
|
37
|
+
"test/test_helper.rb"
|
27
38
|
]
|
28
39
|
s.homepage = %q{http://github.com/indierockmedia/Blavosync}
|
29
40
|
s.rdoc_options = ["--charset=UTF-8"]
|
30
41
|
s.require_paths = ["lib"]
|
31
42
|
s.rubygems_version = %q{1.3.5}
|
32
43
|
s.summary = %q{Sync a remote db and rsync content to your development environment.}
|
44
|
+
s.test_files = [
|
45
|
+
"test/test_blavosync.rb",
|
46
|
+
"test/test_helper.rb"
|
47
|
+
]
|
33
48
|
|
34
49
|
if s.respond_to? :specification_version then
|
35
50
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
data/History.txt
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
History.txt
|
2
|
+
Manifest.txt
|
3
|
+
README.txt
|
4
|
+
Rakefile
|
5
|
+
lib/blavosync.rb
|
6
|
+
lib/blavosync/lib/ey_logger.rb
|
7
|
+
lib/blavosync/lib/ey_logger_hooks.rb
|
8
|
+
lib/blavosync/recipes.rb
|
9
|
+
lib/blavosync/recipes/local.rb
|
10
|
+
lib/blavosync/recipes/util.rb
|
11
|
+
lib/blavosync/recipes/database.rb
|
12
|
+
lib/blavosync/recipes/content_rsync.rb
|
13
|
+
lib/blavosync/recipes/content_tar.rb
|
14
|
+
test/test_blavosync.rb
|
15
|
+
test/test_helper.rb
|
data/README.markdown
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
== blavosync
|
2
|
+
|
3
|
+
INSTALLATION:
|
4
|
+
Add this line to your config/deploy.rb file
|
5
|
+
|
6
|
+
require 'blavosync/recipes'
|
7
|
+
|
8
|
+
USAGE:
|
9
|
+
adds the following tasks to projects using capistrano
|
10
|
+
|
11
|
+
------------------------------------------------------------
|
12
|
+
cap local:backup_content
|
13
|
+
------------------------------------------------------------
|
14
|
+
Downloads a tarball of shared content (identified by the :shared_content and
|
15
|
+
:content _ directories properties) from a deployable environment (RAILS_ENV) to
|
16
|
+
the local filesystem.
|
17
|
+
|
18
|
+
------------------------------------------------------------
|
19
|
+
cap local:backup _ db
|
20
|
+
------------------------------------------------------------
|
21
|
+
Backs up deployable environment's database and copies it to
|
22
|
+
the local machine.
|
23
|
+
|
24
|
+
------------------------------------------------------------
|
25
|
+
cap local:force _ backup _ content
|
26
|
+
------------------------------------------------------------
|
27
|
+
Regenerate files.
|
28
|
+
|
29
|
+
------------------------------------------------------------
|
30
|
+
cap local:force _ backup _ db
|
31
|
+
------------------------------------------------------------
|
32
|
+
Regenerate files.
|
33
|
+
|
34
|
+
------------------------------------------------------------
|
35
|
+
cap local:restore _ content
|
36
|
+
------------------------------------------------------------
|
37
|
+
Restores the backed up content (env var FROM specifies which environment
|
38
|
+
was backed up, defaults to RAILS_ENV) to the local development environment app
|
39
|
+
|
40
|
+
------------------------------------------------------------
|
41
|
+
cap local:restore _ db
|
42
|
+
------------------------------------------------------------
|
43
|
+
Untars the backup file downloaded from local:backup_db and imports
|
44
|
+
(via mysql command line tool) it back into the development database.
|
45
|
+
|
46
|
+
------------------------------------------------------------
|
47
|
+
cap local:resync _ db
|
48
|
+
------------------------------------------------------------
|
49
|
+
Ensure that a fresh remote data dump is retrieved before syncing to the local
|
50
|
+
environment
|
51
|
+
|
52
|
+
------------------------------------------------------------
|
53
|
+
cap local:sync
|
54
|
+
------------------------------------------------------------
|
55
|
+
Wrapper for local:sync _ db and local:sync _ content
|
56
|
+
$> cap local:sync
|
57
|
+
|
58
|
+
------------------------------------------------------------
|
59
|
+
cap local:sync_content
|
60
|
+
------------------------------------------------------------
|
61
|
+
Wrapper for local:backup _ content and local:restore _ content
|
62
|
+
$> cap local:sync_content
|
63
|
+
|
64
|
+
------------------------------------------------------------
|
65
|
+
cap local:sync_db
|
66
|
+
------------------------------------------------------------
|
67
|
+
Wrapper for local:backup _ db and local:restore _ db.
|
68
|
+
$> cap local:sync _ db
|
69
|
+
|
70
|
+
------------------------------------------------------------
|
71
|
+
cap local:sync_init
|
72
|
+
------------------------------------------------------------
|
73
|
+
Wrapper for local:force _ backup _ db, local:force _ backup _ content, and the
|
74
|
+
local:sync to get
|
75
|
+
a completely fresh set of data from the server
|
76
|
+
$> cap local:sync
|
77
|
+
|
78
|
+
|
79
|
+
== Note on Patches/Pull Requests
|
80
|
+
|
81
|
+
* Fork the project.
|
82
|
+
* Make your feature addition or bug fix.
|
83
|
+
* Add tests for it. This is important so I don't break it in a
|
84
|
+
future version unintentionally.
|
85
|
+
* Commit, do not mess with rakefile, version, or history.
|
86
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
87
|
+
* Send me a pull request. Bonus points for topic branches.
|
88
|
+
|
89
|
+
== Copyright
|
90
|
+
|
91
|
+
Copyright (c) 2009 jayronc. See LICENSE for details.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1
|
1
|
+
0.2.1
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
require 'fileutils'
|
3
|
+
module Capistrano
|
4
|
+
|
5
|
+
class Logger
|
6
|
+
|
7
|
+
def ey_log(level, message, line_prefix = nil)
|
8
|
+
EYLogger.log(level, message, line_prefix) if EYLogger.setup?
|
9
|
+
log_without_ey_logging(level, message, line_prefix)
|
10
|
+
end
|
11
|
+
|
12
|
+
unless method_defined?(:log_without_ey_logging)
|
13
|
+
alias_method :log_without_ey_logging, :log
|
14
|
+
alias_method :log, :ey_log
|
15
|
+
end
|
16
|
+
|
17
|
+
def close
|
18
|
+
device.close if @needs_close
|
19
|
+
EYLogger.close if EYLogger.setup?
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class EYLogger
|
24
|
+
|
25
|
+
# Sets up the EYLogger to beging capturing capistrano's logging. You should pass the capistrno configuration
|
26
|
+
# and the deploy type as a string. The deploy type is for reporting purposes only but must be included.
|
27
|
+
def self.setup(configuration, deploy_type, options = {})
|
28
|
+
@_configuration = configuration
|
29
|
+
@_deploy_type = deploy_type.gsub(/:/, "_")
|
30
|
+
@_log_path = options[:deploy_log_path] || Dir.tmpdir
|
31
|
+
@_log_path << "/" unless @_log_path =~ /\/$/
|
32
|
+
FileUtils.mkdir_p(@_log_path)
|
33
|
+
@_setup = true
|
34
|
+
@_success = true
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.log(level, message, line_prefix=nil)
|
38
|
+
return nil unless setup?
|
39
|
+
@release_name = @_configuration[:release_name] if @release_name.nil?
|
40
|
+
@_log_file_path = @_log_path + @release_name + ".log" unless @_log_file_path
|
41
|
+
@_deploy_log_file = File.open(@_log_file_path, "w") if @_deploy_log_file.nil?
|
42
|
+
|
43
|
+
indent = "%*s" % [Logger::MAX_LEVEL, "*" * (Logger::MAX_LEVEL - level)]
|
44
|
+
message.each do |line|
|
45
|
+
if line_prefix
|
46
|
+
@_deploy_log_file << "#{indent} [#{line_prefix}] #{line.strip}\n"
|
47
|
+
else
|
48
|
+
@_deploy_log_file << "#{indent} #{line.strip}\n"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.post_process
|
54
|
+
unless ::Interrupt === $!
|
55
|
+
puts "\n\nPlease wait while the log file is processed\n"
|
56
|
+
# Should dump the stack trace of an exception if there is one
|
57
|
+
error = $!
|
58
|
+
unless error.nil?
|
59
|
+
@_deploy_log_file << error.message << "\n"
|
60
|
+
@_deploy_log_file << error.backtrace.join("\n")
|
61
|
+
@_success = false
|
62
|
+
end
|
63
|
+
self.close
|
64
|
+
|
65
|
+
hooks = [:any]
|
66
|
+
hooks << self.successful? ? :success : :failure
|
67
|
+
puts "Executing Post Processing Hooks"
|
68
|
+
hooks.each do |h|
|
69
|
+
@_post_process_hooks[h].each do |key|
|
70
|
+
@_configuration.parent.find_and_execute_task(key)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
puts "Finished Post Processing Hooks"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# Adds a post processing hook.
|
78
|
+
#
|
79
|
+
# Provide a task name to execute. These tasks are executed after capistrano has actually run its course.
|
80
|
+
#
|
81
|
+
# Takes a key to control when the hook is executed.'
|
82
|
+
# :any - always executed
|
83
|
+
# :success - only execute on success
|
84
|
+
# :failure - only execute on failure
|
85
|
+
#
|
86
|
+
# ==== Example
|
87
|
+
# Capistrano::EYLogger.post_process_hook( "ey_logger:upload_log_to_slice", :any)
|
88
|
+
#
|
89
|
+
def self.post_process_hook(task, key = :any)
|
90
|
+
@_post_process_hooks ||= Hash.new{|h,k| h[k] = []}
|
91
|
+
@_post_process_hooks[key] << task
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.setup?
|
95
|
+
!!@_setup
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.deploy_type
|
99
|
+
@_deploy_type
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.successful?
|
103
|
+
!!@_success
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.failure?
|
107
|
+
!@_success
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.log_file_path
|
111
|
+
@_log_file_path
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.remote_log_file_name
|
115
|
+
@_log_file_name ||= "#{@_configuration[:release_name]}-#{@_deploy_type}-#{self.successful? ? "SUCCESS" : "FAILURE"}.log"
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.close
|
119
|
+
@_deploy_log_file.flush unless @_deploy_log_file.nil?
|
120
|
+
@_deploy_log_file.close unless @_deploy_log_file.nil?
|
121
|
+
@_setup = false
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "ey_logger")
|
2
|
+
|
3
|
+
# These tasks are setup to use with the logger as post commit hooks.
|
4
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
5
|
+
namespace :ey_logger do
|
6
|
+
task :upload_log_to_slice, :except => { :no_release => true} do
|
7
|
+
logger = Capistrano::EYLogger
|
8
|
+
run "mkdir -p #{shared_path}/deploy_logs"
|
9
|
+
put File.open(logger.log_file_path).read, "#{shared_path}/deploy_logs/#{logger.remote_log_file_name}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
Capistrano::EYLogger.post_process_hook("ey_logger:upload_log_to_slice")
|
@@ -0,0 +1,39 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
namespace :local do
|
3
|
+
desc <<-DESC
|
4
|
+
Rsyncs the your production content (identified by the :shared_content and
|
5
|
+
:content_directories properties) from a deployable environment (RAILS_ENV) to the local filesystem.
|
6
|
+
DESC
|
7
|
+
task :rsync_content do
|
8
|
+
from = ENV['FROM'] || 'production'
|
9
|
+
if exists?(:domain)
|
10
|
+
remote_domain = fetch(:domain)
|
11
|
+
end
|
12
|
+
if exists?(:rsync_domain)
|
13
|
+
remote_domain = fetch(:rsync_domain)
|
14
|
+
end
|
15
|
+
system("rsync -avz -e ssh '#{user}@#{remote_domain}:#{content_path}' '#{rails_root}/tmp/'")
|
16
|
+
end
|
17
|
+
|
18
|
+
desc <<-DESC
|
19
|
+
Creates a symlink to public/system from tmp/system
|
20
|
+
DESC
|
21
|
+
task :rsync_restore_content do
|
22
|
+
# from = ENV['FROM'] || 'production'
|
23
|
+
print "\033[1;45m Linking Assets to public directory \033[0m\n"
|
24
|
+
system "ln -nfs #{rails_root}/tmp/system #{rails_root}/public/system"
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
desc <<-DESC
|
29
|
+
Wrapper for local:rsync_content and local:rsync_restore_content
|
30
|
+
$> cap local:rsync RAILS_ENV=production
|
31
|
+
DESC
|
32
|
+
task :rsync do
|
33
|
+
transaction do
|
34
|
+
rsync_content
|
35
|
+
rsync_restore_content
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
namespace :local do
|
4
|
+
desc <<-DESC
|
5
|
+
Downloads a tarball of shared content (identified by the :shared_content and
|
6
|
+
:content_directories properties) from a deployable environment (RAILS_ENV) to the local filesystem.
|
7
|
+
DESC
|
8
|
+
task :backup_content do
|
9
|
+
files = retrieve_local_files('production', 'content')
|
10
|
+
timestamp = most_recent_local_backup(from_env, 'content').to_i
|
11
|
+
last_modified = last_mod_time(content_backup_file).to_i
|
12
|
+
should_redownload = !(timestamp == last_modified)
|
13
|
+
if should_redownload
|
14
|
+
generate_remote_content_backup if last_modified < (Time.now.to_i - (remote_backup_expires))
|
15
|
+
system("mkdir -p #{tmp_dir}")
|
16
|
+
download(content_backup_file, "#{local_content_backup_dir(:env => from_env, :timestamp=>last_modified)}.tar.#{zip_ext}", :via=> :scp) do|ch, name, sent, total|
|
17
|
+
print "\r\033[1;42m #{File.basename(name)}: #{sent}/#{total} -- #{(sent.to_f * 100 / total.to_f).to_i}% \033[0m"
|
18
|
+
end
|
19
|
+
else
|
20
|
+
print "\r\033[1;42m Your Files are already up-to-date \033[0m\n"
|
21
|
+
@current_timestamp = files.first.to_i
|
22
|
+
end
|
23
|
+
util::tmp::check
|
24
|
+
end
|
25
|
+
|
26
|
+
desc <<-DESC
|
27
|
+
Regenerate files.
|
28
|
+
DESC
|
29
|
+
task :force_backup_content do
|
30
|
+
generate_remote_content_backup
|
31
|
+
end
|
32
|
+
|
33
|
+
desc <<-DESC
|
34
|
+
Restores the backed up content (env var FROM specifies which environment
|
35
|
+
was backed up, defaults to RAILS_ENV) to the local development environment app
|
36
|
+
DESC
|
37
|
+
task :restore_content do
|
38
|
+
timestamp = most_recent_local_backup(from_env, 'content')
|
39
|
+
local_dir = local_content_backup_dir(:env => from_env, :timestamp=>timestamp)
|
40
|
+
print "\033[1;45m Local Dir: #{local_dir} \033[0m\n"
|
41
|
+
system "mkdir -p #{local_dir}"
|
42
|
+
system "tar xzf #{local_dir}.tar.#{zip_ext} -C #{local_dir}"
|
43
|
+
print "\033[1;45m Removing old public/system directory \033[0m\n"
|
44
|
+
system "rm -rf public/system"
|
45
|
+
print "\033[1;45m Moving Assets to public directory \033[0m\n"
|
46
|
+
system "mv #{local_dir}/system public/system"
|
47
|
+
print "\033[1;41m Cleaning up \033[0m\n"
|
48
|
+
system "rm -rf #{local_dir}"
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
desc <<-DESC
|
53
|
+
Wrapper for local:backup_content and local:restore_content
|
54
|
+
$> cap local:sync_content RAILS_ENV=production RESTORE_ENV=development
|
55
|
+
DESC
|
56
|
+
task :sync_content do
|
57
|
+
transaction do
|
58
|
+
backup_content
|
59
|
+
restore_content
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
namespace :local do
|
4
|
+
desc <<-DESC
|
5
|
+
Backs up deployable environment's database (identified by the
|
6
|
+
RAILS_ENV environment variable, which defaults to 'production') and copies it to the local machine
|
7
|
+
DESC
|
8
|
+
task :backup_db, :roles => :db do
|
9
|
+
files = retrieve_local_files(from_env, 'db')
|
10
|
+
timestamp = most_recent_local_backup(from_env, 'db').to_i
|
11
|
+
last_modified = last_mod_time(db_backup_zip_file).to_i
|
12
|
+
|
13
|
+
if last_modified < (Time.now.to_i - (remote_backup_expires))
|
14
|
+
generate_remote_db_backup
|
15
|
+
should_redownload = true
|
16
|
+
end
|
17
|
+
should_redownload = !(timestamp == last_modified)
|
18
|
+
if should_redownload
|
19
|
+
system "mkdir -p #{tmp_dir}"
|
20
|
+
download(db_backup_zip_file, "#{local_db_backup_file(:env=>from_env, :timestamp=>last_modified)}.#{zip_ext}", :via=> :scp) do|ch, name, sent, total|
|
21
|
+
print "\r\033[1;42m #{File.basename(name)}: #{sent}/#{total} -- #{(sent.to_f * 100 / total.to_f).to_i}% \033[0m"
|
22
|
+
end
|
23
|
+
else
|
24
|
+
print "\r\033[1;42m Your Files are already up-to-date \033[0m\n"
|
25
|
+
@current_timestamp = files.first.to_i
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
desc <<-DESC
|
30
|
+
Regenerate files.
|
31
|
+
DESC
|
32
|
+
task :force_backup_db do
|
33
|
+
generate_remote_db_backup
|
34
|
+
end
|
35
|
+
|
36
|
+
desc <<-DESC
|
37
|
+
Untars the backup file downloaded from local:backup_db (specified via the FROM env
|
38
|
+
variable, which defalts to RAILS_ENV), and imports (via mysql command line tool) it back into the database
|
39
|
+
defined in the RESTORE_ENV env variable (defaults to development).
|
40
|
+
DESC
|
41
|
+
task :restore_db, :roles => :db do
|
42
|
+
mysql_str = "mysql #{mysql_connection_for(to_env)}"
|
43
|
+
mysql_dump = "mysqldump #{mysql_connection_for(from_env)}"
|
44
|
+
local_db_create = "mysql #{mysql_connection_for(to_env)} -e \"create database if not exists #{mysql_db_for(to_env)}\""
|
45
|
+
remote_backup_file = local_db_backup_file(:env => from_env, :timestamp=>most_recent_local_backup(from_env, 'db')).strip
|
46
|
+
|
47
|
+
puts "\n\033[1;42m Restoring database backup to #{to_env} environment FROM #{remote_backup_file}--#{from_env} using #{mysql_str}\033[0m"
|
48
|
+
system(local_db_create.strip)
|
49
|
+
cmd = ""
|
50
|
+
cmd << <<-CMD
|
51
|
+
#{unzip} -c #{remote_backup_file}.#{zip_ext} > #{remote_backup_file} &&
|
52
|
+
#{mysql_str} < #{remote_backup_file} &&
|
53
|
+
rm -f #{remote_backup_file}
|
54
|
+
CMD
|
55
|
+
system(cmd.strip)
|
56
|
+
util::tmp::check
|
57
|
+
end
|
58
|
+
|
59
|
+
desc <<-DESC
|
60
|
+
Wrapper for local:backup_db and local:restore_db.
|
61
|
+
$> cap local:sync_db RAILS_ENV=production RESTORE_ENV=development
|
62
|
+
DESC
|
63
|
+
task :sync_db do
|
64
|
+
transaction do
|
65
|
+
backup_db
|
66
|
+
restore_db
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
desc <<-DESC
|
71
|
+
Ensure that a fresh remote data dump is retrieved before syncing to the local environment.
|
72
|
+
DESC
|
73
|
+
task :resync_db do
|
74
|
+
util::tmp::clean_remote
|
75
|
+
sync_db
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
# set :rails_root, fetch(:blavosync_local_root, Pathname.new('.').realpath )
|
2
|
+
# set :content_dir, fetch(:blavosync_content_directories, "system" )
|
3
|
+
# set :content_path, fetch(:blavosync_content_path, File.join(fetch(:shared_path), content_dir) )
|
4
|
+
# set :public_path, fetch(:blavosync_public_path, File.join(fetch(:latest_release), 'public') )
|
5
|
+
# set :remote_backup_expires, fetch(:blavosync_remote_backup_expires, 100000 )
|
6
|
+
# set :zip, fetch(:blavosync_zip_command, "gzip" )
|
7
|
+
# set :unzip, fetch(:blavosync_unzip_command, "gunzip" )
|
8
|
+
# set :zip_ext, fetch(:blavosync_compressed_extension, "gz" )
|
9
|
+
# set :tmp_dir, fetch(:blavosync_tmp_dir, "tmp" )
|
10
|
+
# set :content_sync_method, fetch(:blavosync_content_sync_method, 'rsync' )
|
11
|
+
# set :from_env, fetch(:blavosync_from_env, (ENV['FROM_ENV'].nil? ? 'production' : ENV['RAILS_ENV']) )
|
12
|
+
# set :to_env, fetch(:blavosync_to_env, (ENV['TO_ENV'].nil? ? 'development' : ENV['TO_ENV']) )
|
13
|
+
# set :rsync_content_backup_file, fetch(:blavosync_rsync_content_backup_file, "#{shared_path}/system" )
|
14
|
+
# set :tar_content_backup_file, fetch(:blavosync_tar_content_backup_file, "#{shared_path}/backup_#{from_env}_content.tar.#{zip_ext}" )
|
15
|
+
# set :db_backup_file, fetch(:blavosync_db_backup_file, "#{shared_path}/backup_#{from_env}_db.sql" )
|
16
|
+
# set :db_backup_zip_file, fetch(:blavosync_db_backup_zip_file, "#{db_backup_file}.#{zip_ext}" )
|
17
|
+
#
|
18
|
+
Capistrano::Configuration.instance(:must_exist).load do |configuration|
|
19
|
+
|
20
|
+
def rails_root
|
21
|
+
Pathname.new('.').realpath
|
22
|
+
end
|
23
|
+
def content_dir
|
24
|
+
"system"
|
25
|
+
end
|
26
|
+
def content_path
|
27
|
+
File.join(fetch(:shared_path), content_dir)
|
28
|
+
end
|
29
|
+
def public_path
|
30
|
+
File.join(fetch(:latest_release), 'public')
|
31
|
+
end
|
32
|
+
def remote_backup_expires
|
33
|
+
100000
|
34
|
+
end
|
35
|
+
def zip
|
36
|
+
"gzip"
|
37
|
+
end
|
38
|
+
def unzip
|
39
|
+
"gunzip"
|
40
|
+
end
|
41
|
+
def zip_ext
|
42
|
+
"gz"
|
43
|
+
end
|
44
|
+
def tmp_dir
|
45
|
+
"tmp"
|
46
|
+
end
|
47
|
+
def content_sync_method
|
48
|
+
'rsync'
|
49
|
+
end
|
50
|
+
def from_env
|
51
|
+
(ENV['FROM_ENV'].nil? ? 'production' : ENV['RAILS_ENV'])
|
52
|
+
end
|
53
|
+
def to_env
|
54
|
+
(ENV['TO_ENV'].nil? ? 'development' : ENV['TO_ENV'])
|
55
|
+
end
|
56
|
+
def rsync_content_backup_file
|
57
|
+
"#{shared_path}/system"
|
58
|
+
end
|
59
|
+
def tar_content_backup_file
|
60
|
+
"#{shared_path}/backup_#{from_env}_content.tar.#{zip_ext}"
|
61
|
+
end
|
62
|
+
def db_backup_file
|
63
|
+
"#{shared_path}/backup_#{from_env}_db.sql"
|
64
|
+
end
|
65
|
+
def db_backup_zip_file
|
66
|
+
"#{db_backup_file}.#{zip_ext}"
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
def local_content_backup_dir(args={})
|
73
|
+
timestamp = args[:timestamp] || current_timestamp
|
74
|
+
"#{tmp_dir}/#{fetch(:application)}-#{from_env}-content-#{timestamp.to_s.strip}"
|
75
|
+
end
|
76
|
+
|
77
|
+
def generate_remote_tar_content_backup
|
78
|
+
run "cd #{fetch(:shared_path)} && tar czf #{rsync_content_backup_file} 'system'"
|
79
|
+
end
|
80
|
+
|
81
|
+
def local_db_conf(env = nil)
|
82
|
+
env ||= fetch(:to_env)
|
83
|
+
fetch(:config_structure, :rails).to_sym == :sls ?
|
84
|
+
File.join('config', env.to_s, 'database.yml') :
|
85
|
+
File.join('config', 'database.yml')
|
86
|
+
end
|
87
|
+
|
88
|
+
def pluck_pass_str(db_config)
|
89
|
+
db_config['password'].nil? ? '' : "-p'#{db_config['password']}'"
|
90
|
+
end
|
91
|
+
|
92
|
+
def current_timestamp
|
93
|
+
@current_timestamp ||= Time.now.to_i.to_s.strip
|
94
|
+
end
|
95
|
+
|
96
|
+
def retrieve_local_files(env, type)
|
97
|
+
`ls -r #{tmp_dir} | awk -F"-" '{ if ($2 ~ /#{env}/ && $3 ~ /#{type}/) { print $4; } }'`.split(' ')
|
98
|
+
end
|
99
|
+
|
100
|
+
def most_recent_local_backup(env, type)
|
101
|
+
retrieve_local_files(env, type).first.to_i
|
102
|
+
end
|
103
|
+
|
104
|
+
def last_mod_time(path)
|
105
|
+
capture("stat -c%Y #{path}")
|
106
|
+
end
|
107
|
+
|
108
|
+
def server_cache_valid?(path)
|
109
|
+
capture("[ -f #{path} ] || echo '1'").empty? && ((Time.now.to_i - last_mod_time(path)) <= remote_backup_expires)
|
110
|
+
end
|
111
|
+
|
112
|
+
def generate_remote_db_backup
|
113
|
+
run "mysqldump #{mysql_connection_for(from_env)} > #{db_backup_file}"
|
114
|
+
run "rm -f #{db_backup_zip_file} && #{zip} #{db_backup_file} && rm -f #{db_backup_file}"
|
115
|
+
end
|
116
|
+
|
117
|
+
def local_db_backup_file(args = {})
|
118
|
+
env = args[:env] || 'production'
|
119
|
+
timestamp = args[:timestamp] || current_timestamp
|
120
|
+
"#{tmp_dir}/#{fetch(:application)}-#{env}-db-#{timestamp.to_s.strip}.sql"
|
121
|
+
end
|
122
|
+
|
123
|
+
def mysql_connection_for(environment)
|
124
|
+
db_settings = YAML.load_file(local_db_conf(environment))[environment]
|
125
|
+
pass = pluck_pass_str(db_settings)
|
126
|
+
host = (db_settings['host'].nil?) ? nil : "--host=#{db_settings['host']}"
|
127
|
+
socket = (db_settings['socket'].nil?) ? nil : "--socket=#{db_settings['socket']}"
|
128
|
+
user = (db_settings['username'].nil?) ? nil : "-u #{db_settings['username']}"
|
129
|
+
database = (db_settings['database'].nil?) ? nil : " #{db_settings['database']}"
|
130
|
+
[user, pass, host, socket, database ].join(" ")
|
131
|
+
end
|
132
|
+
|
133
|
+
def mysql_db_for(environment)
|
134
|
+
restore_from = ENV['FROM'] || 'production'
|
135
|
+
@from_db ||= YAML.load_file(local_db_conf(restore_from))[restore_from]
|
136
|
+
@from_database ||= (@from_db['database'].nil?) ? nil : " #{@from_db['database']}"
|
137
|
+
end
|
138
|
+
|
139
|
+
namespace :local do
|
140
|
+
|
141
|
+
desc <<-DESC
|
142
|
+
Wrapper for local:sync_db and local:sync_content
|
143
|
+
$> cap local:sync RAILS_ENV=production RESTORE_ENV=development
|
144
|
+
DESC
|
145
|
+
task :sync, :roles =>:app do
|
146
|
+
sync_db
|
147
|
+
if content_sync_method == 'tar'
|
148
|
+
sync_content
|
149
|
+
else
|
150
|
+
rsync_content
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
desc <<-DESC
|
155
|
+
Wrapper for local:force_backup_db, local:force_backup_content, and the local:sync to get
|
156
|
+
a completely fresh set of data from the server
|
157
|
+
$> cap local:sync RAILS_ENV=production RESTORE_ENV=development
|
158
|
+
DESC
|
159
|
+
task :sync_init, :roles =>:app do
|
160
|
+
force_backup_db
|
161
|
+
force_backup_content
|
162
|
+
sync
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
namespace :util do
|
4
|
+
|
5
|
+
namespace :tmp do
|
6
|
+
desc "[capistrano-extensions]: Displays warning if :tmp_dir has more than 10 files or is greater than 50MB"
|
7
|
+
task :check do
|
8
|
+
#[ 5 -le "`ls -1 tmp/cap | wc -l`" ] && echo "Display Me"
|
9
|
+
cmd = %Q{ [ 10 -le "`ls -1 #{tmp_dir} | wc -l`" ] || [ 50 -le "`du -sh #{tmp_dir} | awk '{print int($1)}'`" ] && printf "\033[1;41m Clean up #{tmp_dir} directory \033[0m\n" && du -sh #{tmp_dir}/* }
|
10
|
+
system(cmd)
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "[capistrano-extensions]: Remove the current remote env's backups from :tmp_dir"
|
14
|
+
task :clean_remote do
|
15
|
+
system("rm -rf #{rails_root}/#{tmp_dir}/#{configuration.fetch(:application)}-*")
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'blavosync/lib/ey_logger'
|
2
|
+
require 'blavosync/lib/ey_logger_hooks'
|
3
|
+
require 'blavosync/recipes/util'
|
4
|
+
require 'blavosync/recipes/local'
|
5
|
+
require 'blavosync/recipes/database'
|
6
|
+
require 'blavosync/recipes/content_tar'
|
7
|
+
require 'blavosync/recipes/content_rsync'
|
8
|
+
|
9
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
10
|
+
|
11
|
+
default_run_options[:pty] = true if respond_to?(:default_run_options)
|
12
|
+
set :keep_releases, 3
|
13
|
+
set :runner, defer { user }
|
14
|
+
|
15
|
+
end
|
data/lib/blavosync.rb
CHANGED
@@ -1,295 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
set :rails_root, fetch(:blavosync_local_root, Pathname.new('.').realpath )
|
4
|
-
set :content_dir, fetch(:blavosync_content_directories, content_directories ||= "system" )
|
5
|
-
set :content_path, fetch(:blavosync_content_path, File.join(shared_path, content_dir) )
|
6
|
-
set :public_path, fetch(:blavosync_public_path, File.join(latest_release, 'public') )
|
7
|
-
set :remote_backup_expires, fetch(:blavosync_remote_backup_expires, 100000 )
|
8
|
-
set :zip, fetch(:blavosync_zip_command, "gzip" )
|
9
|
-
set :unzip, fetch(:blavosync_unzip_command, "gunzip" )
|
10
|
-
set :zip_ext, fetch(:blavosync_compressed_extension, "gz" )
|
11
|
-
set :tmp_dir, fetch(:blavosync_tmp_dir, "tmp" )
|
12
|
-
set :content_sync_method, fetch(:blavosync_content_sync_method, 'rsync' )
|
13
|
-
set :from_env, fetch(:blavosync_from_env, (ENV['FROM_ENV'].nil? ? 'production' : ENV['RAILS_ENV']) )
|
14
|
-
set :to_env, fetch(:blavosync_to_env, (ENV['TO_ENV'].nil? ? 'development' : ENV['TO_ENV']) )
|
15
|
-
set :rsync_content_backup_file, fetch(:blavosync_rsync_content_backup_file, "#{shared_path}/system" )
|
16
|
-
set :tar_content_backup_file, fetch(:blavosync_tar_content_backup_file, "#{shared_path}/backup_#{from_env}_content.tar.#{zip_ext}" )
|
17
|
-
set :db_backup_file, fetch(:blavosync_db_backup_file, "#{shared_path}/backup_#{from_env}_db.sql" )
|
18
|
-
set :db_backup_zip_file, fetch(:blavosync_db_backup_zip_file, "#{db_backup_file}.#{zip_ext}" )
|
19
|
-
|
20
|
-
def local_content_backup_dir(args={})
|
21
|
-
timestamp = args[:timestamp] || current_timestamp
|
22
|
-
"#{tmp_dir}/#{application}-#{from_env}-content-#{timestamp.to_s.strip}"
|
23
|
-
end
|
24
|
-
|
25
|
-
def generate_remote_tar_content_backup
|
26
|
-
run "cd #{shared_path} && tar czf #{rsync_content_backup_file} 'system'"
|
27
|
-
end
|
28
|
-
|
29
|
-
def local_db_conf(env = nil)
|
30
|
-
env ||= fetch(:to_env)
|
31
|
-
fetch(:config_structure, :rails).to_sym == :sls ?
|
32
|
-
File.join('config', env.to_s, 'database.yml') :
|
33
|
-
File.join('config', 'database.yml')
|
34
|
-
end
|
35
|
-
|
36
|
-
def pluck_pass_str(db_config)
|
37
|
-
db_config['password'].nil? ? '' : "-p'#{db_config['password']}'"
|
38
|
-
end
|
39
|
-
|
40
|
-
def current_timestamp
|
41
|
-
@current_timestamp ||= Time.now.to_i.to_s.strip
|
42
|
-
end
|
43
|
-
|
44
|
-
def retrieve_local_files(env, type)
|
45
|
-
`ls -r #{tmp_dir} | awk -F"-" '{ if ($2 ~ /#{env}/ && $3 ~ /#{type}/) { print $4; } }'`.split(' ')
|
46
|
-
end
|
47
|
-
|
48
|
-
def most_recent_local_backup(env, type)
|
49
|
-
retrieve_local_files(env, type).first.to_i
|
50
|
-
end
|
51
|
-
|
52
|
-
def last_mod_time(path)
|
53
|
-
capture("stat -c%Y #{path}")
|
54
|
-
end
|
55
|
-
|
56
|
-
def server_cache_valid?(path)
|
57
|
-
capture("[ -f #{path} ] || echo '1'").empty? && ((Time.now.to_i - last_mod_time(path)) <= remote_backup_expires)
|
58
|
-
end
|
59
|
-
|
60
|
-
def generate_remote_db_backup
|
61
|
-
run "mysqldump #{mysql_connection_for(from_env)} > #{db_backup_file}"
|
62
|
-
run "rm -f #{db_backup_zip_file} && #{zip} #{db_backup_file} && rm -f #{db_backup_file}"
|
63
|
-
end
|
64
|
-
|
65
|
-
def local_db_backup_file(args = {})
|
66
|
-
env = args[:env] || 'production'
|
67
|
-
timestamp = args[:timestamp] || current_timestamp
|
68
|
-
"#{tmp_dir}/#{application}-#{env}-db-#{timestamp.to_s.strip}.sql"
|
69
|
-
end
|
70
|
-
|
71
|
-
def mysql_connection_for(environment)
|
72
|
-
db_settings = YAML.load_file(local_db_conf(environment))[environment]
|
73
|
-
pass = pluck_pass_str(db_settings)
|
74
|
-
host = (db_settings['host'].nil?) ? nil : "--host=#{db_settings['host']}"
|
75
|
-
socket = (db_settings['socket'].nil?) ? nil : "--socket=#{db_settings['socket']}"
|
76
|
-
user = (db_settings['username'].nil?) ? nil : "-u #{db_settings['username']}"
|
77
|
-
database = (db_settings['database'].nil?) ? nil : " #{db_settings['database']}"
|
78
|
-
[user, pass, host, socket, database ].join(" ")
|
79
|
-
end
|
80
|
-
|
81
|
-
def mysql_db_for(environment)
|
82
|
-
restore_from = ENV['FROM'] || 'production'
|
83
|
-
@from_db ||= YAML.load_file(local_db_conf(restore_from))[restore_from]
|
84
|
-
@from_database ||= (@from_db['database'].nil?) ? nil : " #{@from_db['database']}"
|
85
|
-
end
|
86
|
-
|
87
|
-
namespace :util do
|
88
|
-
|
89
|
-
namespace :tmp do
|
90
|
-
desc "[capistrano-extensions]: Displays warning if :tmp_dir has more than 10 files or is greater than 50MB"
|
91
|
-
task :check do
|
92
|
-
#[ 5 -le "`ls -1 tmp/cap | wc -l`" ] && echo "Display Me"
|
93
|
-
cmd = %Q{ [ 10 -le "`ls -1 #{tmp_dir} | wc -l`" ] || [ 50 -le "`du -sh #{tmp_dir} | awk '{print int($1)}'`" ] && printf "\033[1;41m Clean up #{tmp_dir} directory \033[0m\n" && du -sh #{tmp_dir}/* }
|
94
|
-
system(cmd)
|
95
|
-
end
|
96
|
-
|
97
|
-
desc "[capistrano-extensions]: Remove the current remote env's backups from :tmp_dir"
|
98
|
-
task :clean_remote do
|
99
|
-
system("rm -rf #{rails_root}/#{tmp_dir}/#{fetch(:application)}-*")
|
100
|
-
end
|
101
|
-
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
namespace :local do
|
106
|
-
|
107
|
-
desc <<-DESC
|
108
|
-
Wrapper for local:sync_db and local:sync_content
|
109
|
-
$> cap local:sync RAILS_ENV=production RESTORE_ENV=development
|
110
|
-
DESC
|
111
|
-
task :sync do
|
112
|
-
sync_db
|
113
|
-
if content_sync_method == 'tar'
|
114
|
-
sync_content
|
115
|
-
else
|
116
|
-
rsync_content
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
desc <<-DESC
|
121
|
-
Wrapper for local:force_backup_db, local:force_backup_content, and the local:sync to get
|
122
|
-
a completely fresh set of data from the server
|
123
|
-
$> cap local:sync RAILS_ENV=production RESTORE_ENV=development
|
124
|
-
DESC
|
125
|
-
task :sync_init do
|
126
|
-
force_backup_db
|
127
|
-
force_backup_content
|
128
|
-
sync
|
129
|
-
end
|
130
|
-
|
131
|
-
desc <<-DESC
|
132
|
-
Backs up deployable environment's database (identified by the
|
133
|
-
RAILS_ENV environment variable, which defaults to 'production') and copies it to the local machine
|
134
|
-
DESC
|
135
|
-
task :backup_db, :roles => :db do
|
136
|
-
files = retrieve_local_files(from_env, 'db')
|
137
|
-
timestamp = most_recent_local_backup(from_env, 'db').to_i
|
138
|
-
last_modified = last_mod_time(db_backup_zip_file).to_i
|
139
|
-
|
140
|
-
if last_modified < (Time.now.to_i - (remote_backup_expires))
|
141
|
-
generate_remote_db_backup
|
142
|
-
should_redownload = true
|
143
|
-
end
|
144
|
-
should_redownload = !(timestamp == last_modified)
|
145
|
-
if should_redownload
|
146
|
-
system "mkdir -p #{tmp_dir}"
|
147
|
-
download(db_backup_zip_file, "#{local_db_backup_file(:env=>from_env, :timestamp=>last_modified)}.#{zip_ext}", :via=> :scp) do|ch, name, sent, total|
|
148
|
-
print "\r\033[1;42m #{File.basename(name)}: #{sent}/#{total} -- #{(sent.to_f * 100 / total.to_f).to_i}% \033[0m"
|
149
|
-
end
|
150
|
-
else
|
151
|
-
print "\r\033[1;42m Your Files are already up-to-date \033[0m\n"
|
152
|
-
@current_timestamp = files.first.to_i
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
desc <<-DESC
|
157
|
-
Regenerate files.
|
158
|
-
DESC
|
159
|
-
task :force_backup_db do
|
160
|
-
generate_remote_db_backup
|
161
|
-
end
|
162
|
-
|
163
|
-
desc <<-DESC
|
164
|
-
Untars the backup file downloaded from local:backup_db (specified via the FROM env
|
165
|
-
variable, which defalts to RAILS_ENV), and imports (via mysql command line tool) it back into the database
|
166
|
-
defined in the RESTORE_ENV env variable (defaults to development).
|
167
|
-
DESC
|
168
|
-
task :restore_db, :roles => :db do
|
169
|
-
mysql_str = "mysql #{mysql_connection_for(to_env)}"
|
170
|
-
mysql_dump = "mysqldump #{mysql_connection_for(from_env)}"
|
171
|
-
local_db_create = "mysql #{mysql_connection_for(to_env)} -e \"create database if not exists #{mysql_db_for(to_env)}\""
|
172
|
-
remote_backup_file = local_db_backup_file(:env => from_env, :timestamp=>most_recent_local_backup(from_env, 'db')).strip
|
173
|
-
|
174
|
-
puts "\n\033[1;42m Restoring database backup to #{to_env} environment FROM #{remote_backup_file}--#{from_env} using #{mysql_str}\033[0m"
|
175
|
-
system(local_db_create.strip)
|
176
|
-
cmd = ""
|
177
|
-
cmd << <<-CMD
|
178
|
-
#{unzip} -c #{remote_backup_file}.#{zip_ext} > #{remote_backup_file} &&
|
179
|
-
#{mysql_str} < #{remote_backup_file} &&
|
180
|
-
rm -f #{remote_backup_file}
|
181
|
-
CMD
|
182
|
-
system(cmd.strip)
|
183
|
-
util::tmp::check
|
184
|
-
end
|
185
|
-
|
186
|
-
desc <<-DESC
|
187
|
-
Wrapper for local:backup_db and local:restore_db.
|
188
|
-
$> cap local:sync_db RAILS_ENV=production RESTORE_ENV=development
|
189
|
-
DESC
|
190
|
-
task :sync_db do
|
191
|
-
transaction do
|
192
|
-
backup_db
|
193
|
-
restore_db
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
desc <<-DESC
|
198
|
-
Ensure that a fresh remote data dump is retrieved before syncing to the local environment.
|
199
|
-
DESC
|
200
|
-
task :resync_db do
|
201
|
-
util::tmp::clean_remote
|
202
|
-
sync_db
|
203
|
-
end
|
204
|
-
|
205
|
-
desc <<-DESC
|
206
|
-
Rsyncs the your production content (identified by the :shared_content and
|
207
|
-
:content_directories properties) from a deployable environment (RAILS_ENV) to the local filesystem.
|
208
|
-
DESC
|
209
|
-
task :rsync_content do
|
210
|
-
from = ENV['FROM'] || 'production'
|
211
|
-
system("rsync -avz -e ssh '#{user}@#{domain}:#{content_path}' '#{rails_root}/tmp/'")
|
212
|
-
end
|
213
|
-
|
214
|
-
desc <<-DESC
|
215
|
-
Creates a symlink to public/system from tmp/system
|
216
|
-
DESC
|
217
|
-
task :rsync_restore_content do
|
218
|
-
# from = ENV['FROM'] || 'production'
|
219
|
-
print "\033[1;45m Linking Assets to public directory \033[0m\n"
|
220
|
-
system "ln -nfs #{rails_root}/tmp/system #{rails_root}/public/system"
|
221
|
-
end
|
222
|
-
|
223
|
-
|
224
|
-
desc <<-DESC
|
225
|
-
Wrapper for local:rsync_content and local:rsync_restore_content
|
226
|
-
$> cap local:rsync RAILS_ENV=production
|
227
|
-
DESC
|
228
|
-
task :rsync do
|
229
|
-
transaction do
|
230
|
-
rsync_content
|
231
|
-
rsync_restore_content
|
232
|
-
end
|
233
|
-
end
|
234
|
-
|
235
|
-
desc <<-DESC
|
236
|
-
Downloads a tarball of shared content (identified by the :shared_content and
|
237
|
-
:content_directories properties) from a deployable environment (RAILS_ENV) to the local filesystem.
|
238
|
-
DESC
|
239
|
-
task :backup_content do
|
240
|
-
files = retrieve_local_files('production', 'content')
|
241
|
-
timestamp = most_recent_local_backup(from_env, 'content').to_i
|
242
|
-
last_modified = last_mod_time(content_backup_file).to_i
|
243
|
-
should_redownload = !(timestamp == last_modified)
|
244
|
-
if should_redownload
|
245
|
-
generate_remote_content_backup if last_modified < (Time.now.to_i - (remote_backup_expires))
|
246
|
-
system("mkdir -p #{tmp_dir}")
|
247
|
-
download(content_backup_file, "#{local_content_backup_dir(:env => from_env, :timestamp=>last_modified)}.tar.#{zip_ext}", :via=> :scp) do|ch, name, sent, total|
|
248
|
-
print "\r\033[1;42m #{File.basename(name)}: #{sent}/#{total} -- #{(sent.to_f * 100 / total.to_f).to_i}% \033[0m"
|
249
|
-
end
|
250
|
-
else
|
251
|
-
print "\r\033[1;42m Your Files are already up-to-date \033[0m\n"
|
252
|
-
@current_timestamp = files.first.to_i
|
253
|
-
end
|
254
|
-
util::tmp::check
|
255
|
-
end
|
256
|
-
|
257
|
-
desc <<-DESC
|
258
|
-
Regenerate files.
|
259
|
-
DESC
|
260
|
-
task :force_backup_content do
|
261
|
-
generate_remote_content_backup
|
262
|
-
end
|
263
|
-
|
264
|
-
desc <<-DESC
|
265
|
-
Restores the backed up content (env var FROM specifies which environment
|
266
|
-
was backed up, defaults to RAILS_ENV) to the local development environment app
|
267
|
-
DESC
|
268
|
-
task :restore_content do
|
269
|
-
timestamp = most_recent_local_backup(from_env, 'content')
|
270
|
-
local_dir = local_content_backup_dir(:env => from_env, :timestamp=>timestamp)
|
271
|
-
print "\033[1;45m Local Dir: #{local_dir} \033[0m\n"
|
272
|
-
system "mkdir -p #{local_dir}"
|
273
|
-
system "tar xzf #{local_dir}.tar.#{zip_ext} -C #{local_dir}"
|
274
|
-
print "\033[1;45m Removing old public/system directory \033[0m\n"
|
275
|
-
system "rm -rf public/system"
|
276
|
-
print "\033[1;45m Moving Assets to public directory \033[0m\n"
|
277
|
-
system "mv #{local_dir}/system public/system"
|
278
|
-
print "\033[1;41m Cleaning up \033[0m\n"
|
279
|
-
system "rm -rf #{local_dir}"
|
280
|
-
end
|
281
|
-
|
282
|
-
|
283
|
-
desc <<-DESC
|
284
|
-
Wrapper for local:backup_content and local:restore_content
|
285
|
-
$> cap local:sync_content RAILS_ENV=production RESTORE_ENV=development
|
286
|
-
DESC
|
287
|
-
task :sync_content do
|
288
|
-
transaction do
|
289
|
-
backup_content
|
290
|
-
restore_content
|
291
|
-
end
|
292
|
-
end
|
293
|
-
end
|
294
|
-
|
1
|
+
module Blavosync
|
2
|
+
VERSION = '0.1.3'
|
295
3
|
end
|
data/test/test_helper.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blavosync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jayronc
|
@@ -21,15 +21,26 @@ extensions: []
|
|
21
21
|
|
22
22
|
extra_rdoc_files:
|
23
23
|
- LICENSE
|
24
|
-
- README.
|
24
|
+
- README.markdown
|
25
25
|
files:
|
26
26
|
- Blavosync.gemspec
|
27
|
+
- History.txt
|
27
28
|
- LICENSE
|
28
|
-
-
|
29
|
+
- Manifest.txt
|
30
|
+
- README.markdown
|
29
31
|
- Rakefile
|
30
32
|
- VERSION
|
31
|
-
- init.rb
|
32
33
|
- lib/blavosync.rb
|
34
|
+
- lib/blavosync/lib/ey_logger.rb
|
35
|
+
- lib/blavosync/lib/ey_logger_hooks.rb
|
36
|
+
- lib/blavosync/recipes.rb
|
37
|
+
- lib/blavosync/recipes/content_rsync.rb
|
38
|
+
- lib/blavosync/recipes/content_tar.rb
|
39
|
+
- lib/blavosync/recipes/database.rb
|
40
|
+
- lib/blavosync/recipes/local.rb
|
41
|
+
- lib/blavosync/recipes/util.rb
|
42
|
+
- test/test_blavosync.rb
|
43
|
+
- test/test_helper.rb
|
33
44
|
has_rdoc: true
|
34
45
|
homepage: http://github.com/indierockmedia/Blavosync
|
35
46
|
licenses: []
|
@@ -58,5 +69,6 @@ rubygems_version: 1.3.5
|
|
58
69
|
signing_key:
|
59
70
|
specification_version: 3
|
60
71
|
summary: Sync a remote db and rsync content to your development environment.
|
61
|
-
test_files:
|
62
|
-
|
72
|
+
test_files:
|
73
|
+
- test/test_blavosync.rb
|
74
|
+
- test/test_helper.rb
|
data/README.rdoc
DELETED
@@ -1,118 +0,0 @@
|
|
1
|
-
== blavosync
|
2
|
-
|
3
|
-
INSTALLATION:
|
4
|
-
Add this line BELOW load 'config/deploy' in your Capfile
|
5
|
-
|
6
|
-
require 'blavosync'
|
7
|
-
|
8
|
-
|
9
|
-
USAGE:
|
10
|
-
adds the following tasks to projects using capistrano
|
11
|
-
|
12
|
-
------------------------------------------------------------
|
13
|
-
cap local:backup_content
|
14
|
-
------------------------------------------------------------
|
15
|
-
Downloads a tarball of shared content (identified by the :shared_content and
|
16
|
-
:content_directories properties) from a deployable environment (RAILS_ENV) to
|
17
|
-
the local filesystem.
|
18
|
-
|
19
|
-
------------------------------------------------------------
|
20
|
-
cap local:backup_db
|
21
|
-
------------------------------------------------------------
|
22
|
-
Backs up deployable environment's database (idgit loentified by the
|
23
|
-
RAILS_ENV environment variable, which defaults to 'production') and copies it to
|
24
|
-
the local machine
|
25
|
-
|
26
|
-
------------------------------------------------------------
|
27
|
-
cap local:force_backup_content
|
28
|
-
------------------------------------------------------------
|
29
|
-
Regenerate files.
|
30
|
-
|
31
|
-
------------------------------------------------------------
|
32
|
-
cap local:force_backup_db
|
33
|
-
------------------------------------------------------------
|
34
|
-
Regenerate files.
|
35
|
-
|
36
|
-
------------------------------------------------------------
|
37
|
-
cap local:restore_content
|
38
|
-
------------------------------------------------------------
|
39
|
-
Restores the backed up content (env var FROM specifies which environment
|
40
|
-
was backed up, defaults to RAILS_ENV) to the local development environment app
|
41
|
-
|
42
|
-
------------------------------------------------------------
|
43
|
-
cap local:restore_db
|
44
|
-
------------------------------------------------------------
|
45
|
-
Untars the backup file downloaded from local:backup_db (specified via the FROM
|
46
|
-
env
|
47
|
-
variable, which defalts to RAILS_ENV), and imports (via mysql command line tool)
|
48
|
-
it back into the database
|
49
|
-
defined in the RESTORE_ENV env variable (defaults to development).
|
50
|
-
|
51
|
-
------------------------------------------------------------
|
52
|
-
cap local:resync_db
|
53
|
-
------------------------------------------------------------
|
54
|
-
Ensure that a fresh remote data dump is retrieved before syncing to the local
|
55
|
-
environment
|
56
|
-
|
57
|
-
------------------------------------------------------------
|
58
|
-
cap local:sync
|
59
|
-
------------------------------------------------------------
|
60
|
-
Wrapper for local:sync_db and local:sync_content
|
61
|
-
$> cap local:sync RAILS_ENV=production RESTORE_ENV=development
|
62
|
-
|
63
|
-
------------------------------------------------------------
|
64
|
-
cap local:sync_content
|
65
|
-
------------------------------------------------------------
|
66
|
-
Wrapper for local:backup_content and local:restore_content
|
67
|
-
$> cap local:sync_content RAILS_ENV=production RESTORE_ENV=development
|
68
|
-
|
69
|
-
------------------------------------------------------------
|
70
|
-
cap local:sync_db
|
71
|
-
------------------------------------------------------------
|
72
|
-
Wrapper for local:backup_db and local:restore_db.
|
73
|
-
$> cap local:sync_db RAILS_ENV=production RESTORE_ENV=development
|
74
|
-
|
75
|
-
------------------------------------------------------------
|
76
|
-
cap local:sync_init
|
77
|
-
------------------------------------------------------------
|
78
|
-
Wrapper for local:force_backup_db, local:force_backup_content, and the
|
79
|
-
local:sync to get
|
80
|
-
a completely fresh set of data from the server
|
81
|
-
$> cap local:sync RAILS_ENV=production RESTORE_ENV=development
|
82
|
-
|
83
|
-
CONFIGURATION:
|
84
|
-
|
85
|
-
the following variables (with defaults shown) are available in your deploy.rb
|
86
|
-
|
87
|
-
|
88
|
-
set :blavosync_local_root, Pathname.new('.').realpath
|
89
|
-
set :blavosync_content_directories, content_directories ||= "system"
|
90
|
-
set :blavosync_content_path, File.join(shared_path, content_dir)
|
91
|
-
set :blavosync_public_path, File.join(latest_release, 'public')
|
92
|
-
set :blavosync_remote_backup_expires, 100000
|
93
|
-
set :blavosync_zip_command, "gzip"
|
94
|
-
set :blavosync_unzip_command, "gunzip"
|
95
|
-
set :blavosync_compressed_extension, "gz"
|
96
|
-
set :blavosync_tmp_dir, "tmp"
|
97
|
-
set :blavosync_content_sync_method, 'rsync'
|
98
|
-
set :blavosync_from_env, (ENV['FROM_ENV'].nil? ? 'production' : ENV['RAILS_ENV'])
|
99
|
-
set :blavosync_to_env, (ENV['TO_ENV'].nil? ? 'development' : ENV['TO_ENV'])
|
100
|
-
set :blavosync_rsync_content_backup_file, "#{shared_path}/system"
|
101
|
-
set :blavosync_tar_content_backup_file, "#{shared_path}/backup_#{from_env}_content.tar.#{zip_ext}"
|
102
|
-
set :blavosync_db_backup_file, "#{shared_path}/backup_#{from_env}_db.sql"
|
103
|
-
set :blavosync_db_backup_zip_file, "#{db_backup_file}.#{zip_ext}"
|
104
|
-
|
105
|
-
|
106
|
-
== Note on Patches/Pull Requests
|
107
|
-
|
108
|
-
* Fork the project.
|
109
|
-
* Make your feature addition or bug fix.
|
110
|
-
* Add tests for it. This is important so I don't break it in a
|
111
|
-
future version unintentionally.
|
112
|
-
* Commit, do not mess with rakefile, version, or history.
|
113
|
-
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
114
|
-
* Send me a pull request. Bonus points for topic branches.
|
115
|
-
|
116
|
-
== Copyright
|
117
|
-
|
118
|
-
Copyright (c) 2009 jayronc. See LICENSE for details.
|
data/init.rb
DELETED