capistrano-net_storage 0.5.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +63 -0
- data/README.md +59 -39
- data/capistrano-net_storage.gemspec +4 -4
- data/lib/capistrano/net_storage/archiver/base.rb +8 -11
- data/lib/capistrano/net_storage/archiver/tar_gzip.rb +12 -10
- data/lib/capistrano/net_storage/archiver/zip.rb +13 -10
- data/lib/capistrano/net_storage/bundler/default.rb +55 -0
- data/lib/capistrano/net_storage/bundler/null.rb +15 -0
- data/lib/capistrano/net_storage/cleaner.rb +34 -68
- data/lib/capistrano/net_storage/config.rb +103 -95
- data/lib/capistrano/net_storage/config_uploader.rb +58 -0
- data/lib/capistrano/net_storage/plugin.rb +40 -2
- data/lib/capistrano/net_storage/scm/base.rb +6 -27
- data/lib/capistrano/net_storage/scm/git.rb +17 -15
- data/lib/capistrano/net_storage/transport/base.rb +9 -21
- data/lib/capistrano/net_storage/version.rb +1 -1
- data/lib/capistrano/net_storage.rb +35 -2
- data/lib/capistrano/tasks/net_storage.rake +38 -128
- metadata +10 -15
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -7
- data/.travis.yml +0 -13
- data/lib/capistrano/net_storage/all.rb +0 -20
- data/lib/capistrano/net_storage/base.rb +0 -18
- data/lib/capistrano/net_storage/bundler.rb +0 -70
- data/lib/capistrano/net_storage/coordinator.rb +0 -38
- data/lib/capistrano/net_storage/error.rb +0 -6
- data/lib/capistrano/net_storage/utils.rb +0 -62
@@ -1,169 +1,177 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
require 'capistrano/net_storage/
|
4
|
-
require 'capistrano/net_storage/
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
require 'capistrano/net_storage/cleaner'
|
4
|
+
require 'capistrano/net_storage/bundler/default'
|
5
|
+
require 'capistrano/net_storage/bundler/null'
|
6
|
+
require 'capistrano/net_storage/config_uploader'
|
5
7
|
|
6
8
|
module Capistrano
|
7
9
|
module NetStorage
|
8
10
|
class Config
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
when :archiver
|
15
|
-
Capistrano::NetStorage::Archiver::Zip
|
16
|
-
when :scm
|
17
|
-
Capistrano::NetStorage::SCM::Git
|
18
|
-
when :cleaner
|
19
|
-
Capistrano::NetStorage::Cleaner
|
20
|
-
when :bundler
|
21
|
-
Capistrano::NetStorage::Bundler
|
22
|
-
when :transport
|
23
|
-
msg = 'You have to set :net_storage_transport because no default transport class!'
|
24
|
-
raise Capistrano::NetStorage::Error, msg
|
25
|
-
else
|
26
|
-
raise "Unknown type! #{type}"
|
27
|
-
end
|
28
|
-
end
|
11
|
+
|
12
|
+
# Settings for delegate classes
|
13
|
+
|
14
|
+
def transport_class
|
15
|
+
fetch(:net_storage_transport)
|
29
16
|
end
|
30
17
|
|
31
|
-
|
32
|
-
|
33
|
-
fetch(:net_storage_servers, -> { release_roles(:all) })
|
18
|
+
def archiver_class
|
19
|
+
fetch(:net_storage_archiver)
|
34
20
|
end
|
35
21
|
|
36
|
-
def
|
37
|
-
|
22
|
+
def scm_class
|
23
|
+
fetch(:net_storage_scm)
|
38
24
|
end
|
39
25
|
|
40
|
-
|
41
|
-
|
42
|
-
def config_files
|
43
|
-
@config_files ||= fetch(:net_storage_config_files)
|
26
|
+
def cleaner_class
|
27
|
+
Capistrano::NetStorage::Cleaner
|
44
28
|
end
|
45
29
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
true
|
30
|
+
def bundler_class
|
31
|
+
if skip_bundle?
|
32
|
+
Capistrano::NetStorage::Bundler::Null
|
33
|
+
else
|
34
|
+
Capistrano::NetStorage::Bundler::Default
|
52
35
|
end
|
53
|
-
@skip_bundle
|
54
36
|
end
|
55
37
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
@archive_on_missing
|
38
|
+
def config_uploader_class
|
39
|
+
Capistrano::NetStorage::ConfigUploader
|
40
|
+
end
|
41
|
+
|
42
|
+
# Settings for syncing config
|
43
|
+
|
44
|
+
def config_files
|
45
|
+
fetch(:net_storage_config_files)
|
65
46
|
end
|
66
47
|
|
67
|
-
# If +true+, use +rsync+ to sync config files.
|
68
|
-
# Otherwise, use +upload!+ by sshkit.
|
69
|
-
# Defaults to +false+
|
70
|
-
# @see #rsync_options
|
71
48
|
def upload_files_by_rsync?
|
72
|
-
|
49
|
+
fetch(:net_storage_upload_files_by_rsync)
|
73
50
|
end
|
74
51
|
|
75
|
-
# You can set +:user+, +:keys+, +:port+ as ssh options for +rsync+ command to sync configs
|
76
|
-
# when +:net_storage_upload_files_by_rsync+ is set +true+.
|
77
|
-
# @see #upload_files_by_rsync?
|
78
52
|
def rsync_options
|
79
|
-
|
53
|
+
fetch(:net_storage_rsync_options)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Settings for tuning performance
|
57
|
+
|
58
|
+
def max_parallels
|
59
|
+
fetch(:net_storage_max_parallels)
|
60
|
+
end
|
61
|
+
|
62
|
+
def reuse_archive?
|
63
|
+
fetch(:net_storage_reuse_archive)
|
64
|
+
end
|
65
|
+
|
66
|
+
def keep_remote_archives
|
67
|
+
fetch(:net_storage_keep_remote_archives)
|
68
|
+
end
|
69
|
+
|
70
|
+
# Settings for behavioral changes
|
71
|
+
|
72
|
+
def skip_bundle?
|
73
|
+
fetch(:net_storage_skip_bundle)
|
74
|
+
end
|
75
|
+
|
76
|
+
def multi_app_mode?
|
77
|
+
fetch(:net_storage_multi_app_mode)
|
80
78
|
end
|
81
79
|
|
82
|
-
#
|
83
80
|
# Path settings
|
84
|
-
#
|
85
81
|
|
86
|
-
# Path
|
82
|
+
# Path to application of remote release_path
|
83
|
+
# @return [Pathname]
|
84
|
+
def release_app_path
|
85
|
+
if multi_app_mode?
|
86
|
+
release_path.join(fetch(:application))
|
87
|
+
else
|
88
|
+
release_path
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Path to base directory on local
|
87
93
|
# @return [Pathname]
|
88
94
|
def local_base_path
|
89
|
-
|
95
|
+
Pathname.new(fetch(:net_storage_local_base_path))
|
90
96
|
end
|
91
97
|
|
92
|
-
# Path to
|
98
|
+
# Path to a mirror repository on local
|
93
99
|
# @return [Pathname]
|
94
100
|
def local_mirror_path
|
95
|
-
|
96
|
-
@local_mirror_path ||= local_base_path.join('mirror')
|
101
|
+
local_base_path.join('mirror')
|
97
102
|
end
|
98
103
|
|
99
104
|
# Path to keep release directories on local
|
100
105
|
# @return [Pathname]
|
101
106
|
def local_releases_path
|
102
|
-
|
103
|
-
@local_releases_path ||= local_base_path.join('releases')
|
107
|
+
local_base_path.join('releases')
|
104
108
|
end
|
105
109
|
|
106
|
-
# Path to
|
110
|
+
# Path to local release directory, where a release is to be prepared
|
107
111
|
# @return [Pathname]
|
108
112
|
def local_release_path
|
109
|
-
|
113
|
+
local_releases_path.join(release_timestamp)
|
110
114
|
end
|
111
115
|
|
112
|
-
#
|
116
|
+
# Path to application of local release_path
|
117
|
+
# @return [Pathname]
|
118
|
+
def local_release_app_path
|
119
|
+
if multi_app_mode?
|
120
|
+
local_release_path.join(fetch(:application))
|
121
|
+
else
|
122
|
+
local_release_path
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
# Shared cache directory to speed up installing gems on local
|
113
127
|
# @return [Pathname]
|
114
128
|
def local_bundle_path
|
115
|
-
|
116
|
-
@local_bundle_path ||= local_base_path.join('bundle')
|
129
|
+
local_base_path.join('bundle')
|
117
130
|
end
|
118
131
|
|
119
132
|
# Path of archive directories on local
|
120
133
|
# @return [Pathname]
|
121
134
|
def local_archives_path
|
122
|
-
|
123
|
-
@local_archives_path ||= local_base_path.join('archives')
|
135
|
+
local_base_path.join('archives')
|
124
136
|
end
|
125
137
|
|
126
138
|
# Destination path to archive application on local
|
127
139
|
# @return [Pathname]
|
128
140
|
def local_archive_path
|
129
|
-
|
141
|
+
local_archives_path.join("#{release_timestamp}.#{archive_file_extension}")
|
130
142
|
end
|
131
143
|
|
132
144
|
# Path of archive directories on remote servers
|
133
145
|
# @return [Pathname]
|
134
146
|
def archives_path
|
135
|
-
|
136
|
-
@archives_path ||= deploy_path.join('net_storage_archives')
|
147
|
+
Pathname.new(fetch(:net_storage_archives_path))
|
137
148
|
end
|
138
149
|
|
139
150
|
# Path of archive file to be downloaded on remote servers
|
140
151
|
# @return [Pathname]
|
141
152
|
def archive_path
|
142
|
-
|
153
|
+
archives_path.join("#{release_timestamp}.#{archive_file_extension}")
|
143
154
|
end
|
144
155
|
|
145
156
|
# Suffix of archive file
|
146
157
|
# @return [String]
|
147
|
-
def
|
148
|
-
|
149
|
-
when Capistrano::NetStorage::Archiver::Zip
|
150
|
-
'zip'
|
151
|
-
when Capistrano::NetStorage::Archiver::TarGzip
|
152
|
-
'tar.gz'
|
153
|
-
else
|
154
|
-
'archive'
|
155
|
-
end
|
158
|
+
def archive_file_extension
|
159
|
+
archiver_class.file_extension
|
156
160
|
end
|
157
161
|
|
158
|
-
|
162
|
+
def archive_suffix
|
163
|
+
warn <<~WARN
|
164
|
+
######### DEPRECATION WARNING #########
|
159
165
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
166
|
+
`Capistrano::NetStorage.config.archive_suffix` is no longer available
|
167
|
+
at #{caller[0]}
|
168
|
+
|
169
|
+
Use following method instead.
|
170
|
+
`Capistrano::NetStorage.config.archive_file_extension`
|
171
|
+
|
172
|
+
WARN
|
173
|
+
|
174
|
+
archive_file_extension
|
167
175
|
end
|
168
176
|
end
|
169
177
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Capistrano
|
2
|
+
module NetStorage
|
3
|
+
class ConfigUploader
|
4
|
+
# These values are intentionally separated from config and fixed.
|
5
|
+
# If you have trouble with these defaults for 10^2 ~ 10^3 servers, please contact us on GitHub.
|
6
|
+
# Ideally, you can upload files to 10000 servers in 50 seconds. (2.0 second jitter + 0.5 second execution time)
|
7
|
+
MAX_PARALLEL_TO_UPLOAD = 500
|
8
|
+
JITTER_DURATION_TO_UPLOAD = 2.0
|
9
|
+
|
10
|
+
# Check for prerequisites.
|
11
|
+
# Same interface to delegated class
|
12
|
+
def check
|
13
|
+
end
|
14
|
+
|
15
|
+
def upload_config_files
|
16
|
+
config = Capistrano::NetStorage.config
|
17
|
+
|
18
|
+
on release_roles(:all), in: :groups, limit: MAX_PARALLEL_TO_UPLOAD do |host|
|
19
|
+
if config.upload_files_by_rsync?
|
20
|
+
rsh_option = Capistrano::NetStorage::ConfigUploader.build_ssh_command(host)
|
21
|
+
run_locally do
|
22
|
+
sleep Random.rand(JITTER_DURATION_TO_UPLOAD)
|
23
|
+
execute :rsync, '-az', "--rsh='#{rsh_option}'", *config.config_files, "#{host.hostname}:#{config.release_app_path.join('config')}"
|
24
|
+
end
|
25
|
+
else
|
26
|
+
# slow and not recommended.
|
27
|
+
files.each do |src|
|
28
|
+
upload! src, dest_dir
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Build ssh command with options for rsync
|
35
|
+
def self.build_ssh_command(host)
|
36
|
+
user_opt = ''
|
37
|
+
key_opt = ''
|
38
|
+
port_opt = ''
|
39
|
+
ssh_options = Capistrano::NetStorage.config.rsync_options
|
40
|
+
|
41
|
+
if user = host.user || ssh_options[:user]
|
42
|
+
user_opt = " -l #{user}"
|
43
|
+
end
|
44
|
+
|
45
|
+
if keys = (host.keys.empty? ? ssh_options[:keys] : host.keys)
|
46
|
+
keys = keys.is_a?(Array) ? keys : [keys]
|
47
|
+
key_opt = keys.map { |key| " -i #{key}" }.join('')
|
48
|
+
end
|
49
|
+
|
50
|
+
if port = host.port || ssh_options[:port]
|
51
|
+
port_opt = " -p #{port}"
|
52
|
+
end
|
53
|
+
|
54
|
+
"ssh#{user_opt}#{key_opt}#{port_opt}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -1,14 +1,52 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
1
3
|
require 'capistrano/scm/plugin'
|
2
|
-
|
4
|
+
|
5
|
+
require 'capistrano/net_storage/archiver/tar_gzip'
|
6
|
+
require 'capistrano/net_storage/scm/git'
|
3
7
|
|
4
8
|
module Capistrano
|
5
9
|
module NetStorage
|
6
10
|
class Plugin < ::Capistrano::SCM::Plugin
|
11
|
+
# See README.md for details of settings
|
12
|
+
def set_defaults
|
13
|
+
set_if_empty :net_storage_transport, -> { raise ArgumentError, 'You have to `set(:net_storage_transport, Capistrano::NetStorage::S3)` # or your custom class' }
|
14
|
+
set_if_empty :net_storage_archiver, Capistrano::NetStorage::Archiver::TarGzip
|
15
|
+
set_if_empty :net_storage_scm, Capistrano::NetStorage::SCM::Git
|
16
|
+
|
17
|
+
set_if_empty :net_storage_config_files, []
|
18
|
+
set_if_empty :net_storage_upload_files_by_rsync, true
|
19
|
+
set_if_empty :net_storage_rsync_options, -> { fetch(:ssh_options, {}) }
|
20
|
+
|
21
|
+
set_if_empty :net_storage_max_parallels, 1000
|
22
|
+
set_if_empty :net_storage_reuse_archive, true
|
23
|
+
|
24
|
+
set_if_empty :net_storage_local_base_path, Pathname.new("#{Dir.pwd}/.local_net_storage")
|
25
|
+
set_if_empty :net_storage_archives_path, -> { deploy_path.join('net_storage_archives') }
|
26
|
+
|
27
|
+
set_if_empty :net_storage_skip_bundle, false
|
28
|
+
set_if_empty :net_storage_multi_app_mode, false
|
29
|
+
|
30
|
+
set_if_empty :net_storage_keep_remote_archives, 10
|
31
|
+
end
|
32
|
+
|
33
|
+
def define_tasks
|
34
|
+
eval_rakefile File.expand_path("../tasks/net_storage.rake", __dir__)
|
35
|
+
end
|
36
|
+
|
7
37
|
def register_hooks
|
8
38
|
after 'deploy:new_release_path', 'net_storage:create_release'
|
9
39
|
before 'deploy:check', 'net_storage:check'
|
10
|
-
|
40
|
+
after 'deploy:cleanup', 'net_storage:cleanup'
|
11
41
|
end
|
12
42
|
end
|
13
43
|
end
|
14
44
|
end
|
45
|
+
|
46
|
+
# initialization code to access global settings via Capistrano::NetStorage
|
47
|
+
|
48
|
+
require 'capistrano/net_storage'
|
49
|
+
require 'capistrano/net_storage/config'
|
50
|
+
|
51
|
+
config = Capistrano::NetStorage::Config.new
|
52
|
+
Capistrano::NetStorage.setup!(config: Capistrano::NetStorage::Config.new)
|
@@ -1,47 +1,26 @@
|
|
1
|
-
require 'capistrano/net_storage/utils'
|
2
|
-
|
3
1
|
module Capistrano
|
4
2
|
module NetStorage
|
5
3
|
module SCM
|
6
|
-
#
|
7
|
-
# @abstract
|
4
|
+
# Abstract class to handle SCM between local_mirror_path and local_release_path
|
8
5
|
class Base
|
9
|
-
include Capistrano::NetStorage::Utils
|
10
|
-
|
11
|
-
# Check SCM prerequisites
|
12
|
-
# @abstract
|
13
6
|
def check
|
14
|
-
raise NotImplementedError
|
7
|
+
raise NotImplementedError, "Implement `#{self.class}#{__method__}` to check prerequisites for SCM"
|
15
8
|
end
|
16
9
|
|
17
|
-
# Clone repository to local
|
18
|
-
# @abstract
|
19
10
|
def clone
|
20
|
-
raise NotImplementedError
|
11
|
+
raise NotImplementedError, "Implement `#{self.class}#{__method__}` to clone repository to `Capistrano::NetStorage.config.local_mirror_path`"
|
21
12
|
end
|
22
13
|
|
23
|
-
# Update local repository
|
24
|
-
# @abstract
|
25
14
|
def update
|
26
|
-
raise NotImplementedError
|
15
|
+
raise NotImplementedError, "Implement `#{self.class}#{__method__}` to update repository in `Capistrano::NetStorage.config.local_mirror_path`"
|
27
16
|
end
|
28
17
|
|
29
|
-
# Set current revision to be deployed of the repository
|
30
|
-
# @abstract
|
31
18
|
def set_current_revision
|
32
|
-
raise NotImplementedError
|
19
|
+
raise NotImplementedError, "Implement `#{self.class}#{__method__}` to set current revision by `set :current_revision, revision`"
|
33
20
|
end
|
34
21
|
|
35
|
-
# Prepare snapshot of repository to be archived for release
|
36
|
-
# @abstract
|
37
22
|
def prepare_archive
|
38
|
-
raise NotImplementedError
|
39
|
-
end
|
40
|
-
|
41
|
-
# Copy local config files to servers
|
42
|
-
def sync_config
|
43
|
-
return unless config.config_files
|
44
|
-
upload_files(config.config_files, release_path.join('config'))
|
23
|
+
raise NotImplementedError, "Implement `#{self.class}#{__method__}` to extract and prepare release into `Capistrano::NetStorage.config.local_release_path`"
|
45
24
|
end
|
46
25
|
end
|
47
26
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'capistrano/net_storage/scm/base'
|
2
2
|
|
3
|
-
# Internal SCM class for Git repository
|
4
3
|
class Capistrano::NetStorage::SCM::Git < Capistrano::NetStorage::SCM::Base
|
5
4
|
def check
|
6
5
|
run_locally do
|
@@ -9,51 +8,54 @@ class Capistrano::NetStorage::SCM::Git < Capistrano::NetStorage::SCM::Base
|
|
9
8
|
end
|
10
9
|
|
11
10
|
def clone
|
12
|
-
|
11
|
+
config = Capistrano::NetStorage.config
|
12
|
+
|
13
13
|
run_locally do
|
14
|
-
if
|
15
|
-
info t(:mirror_exists, at:
|
14
|
+
if test "[ -f #{config.local_mirror_path}/HEAD ]"
|
15
|
+
info t(:mirror_exists, at: config.local_mirror_path)
|
16
16
|
else
|
17
|
-
execute :git, :clone, '--mirror', repo_url,
|
17
|
+
execute :git, :clone, '--mirror', repo_url, config.local_mirror_path
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
def update
|
23
|
-
|
23
|
+
config = Capistrano::NetStorage.config
|
24
|
+
|
24
25
|
run_locally do
|
25
|
-
within
|
26
|
+
within config.local_mirror_path do
|
26
27
|
execute :git, :remote, :update
|
27
28
|
end
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
31
32
|
def set_current_revision
|
32
|
-
|
33
|
-
|
33
|
+
config = Capistrano::NetStorage.config
|
34
|
+
|
34
35
|
run_locally do
|
35
|
-
within
|
36
|
+
within config.local_mirror_path do
|
36
37
|
set :current_revision, capture(:git, "rev-list --max-count=1 #{fetch(:branch)}")
|
37
38
|
end
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
41
42
|
def prepare_archive
|
42
|
-
|
43
|
+
config = Capistrano::NetStorage.config
|
44
|
+
|
43
45
|
run_locally do
|
44
|
-
execute :mkdir, '-p',
|
46
|
+
execute :mkdir, '-p', config.local_release_path
|
45
47
|
|
46
|
-
within
|
48
|
+
within config.local_mirror_path do
|
47
49
|
if tree = fetch(:repo_tree)
|
48
50
|
stripped = tree.slice %r{^/?(.*?)/?$}, 1 # strip both side /
|
49
51
|
num_components = stripped.count('/')
|
50
52
|
execute(
|
51
53
|
:git, :archive, fetch(:branch), tree,
|
52
54
|
"| tar -x --strip-components #{num_components} -f - -C ",
|
53
|
-
|
55
|
+
config.local_release_path
|
54
56
|
)
|
55
57
|
else
|
56
|
-
execute :git, :archive, fetch(:branch), '| tar -x -C',
|
58
|
+
execute :git, :archive, fetch(:branch), '| tar -x -C', config.local_release_path
|
57
59
|
end
|
58
60
|
end
|
59
61
|
end
|
@@ -1,39 +1,27 @@
|
|
1
1
|
module Capistrano
|
2
2
|
module NetStorage
|
3
3
|
module Transport
|
4
|
-
# Abstract class to
|
5
|
-
# @abstract
|
4
|
+
# Abstract class to upload archive from local to storage and download from storage to remote
|
6
5
|
class Base
|
7
|
-
# Check prerequisites for transport
|
8
|
-
# @abstract
|
9
6
|
def check
|
10
|
-
raise NotImplementedError
|
7
|
+
raise NotImplementedError, "Implement `#{self.class}#{__method__}` to check prerequisites for Transport"
|
11
8
|
end
|
12
9
|
|
13
|
-
|
14
|
-
|
15
|
-
def find_uploaded
|
16
|
-
raise NotImplementedError
|
10
|
+
def archive_exists?
|
11
|
+
raise NotImplementedError, "Implement `#{self.class}#{__method__}` to test archive on storage corresponding to `fetch(:current_revision) + Config#archive_file_extension`"
|
17
12
|
end
|
18
13
|
|
19
|
-
# Upload archive onto remote storage
|
20
|
-
# @abstract
|
21
14
|
def upload
|
22
|
-
raise NotImplementedError
|
15
|
+
raise NotImplementedError, "Implement `#{self.class}#{__method__}` to upload archive from `Capistrano::NetStorage.config.local_archive_path` to remote storage"
|
23
16
|
end
|
24
17
|
|
25
|
-
# Download archive from remote storage to servers.
|
26
|
-
# Archive file should be placed at +config.archive_path+
|
27
|
-
# @abstract
|
28
18
|
def download
|
29
|
-
raise NotImplementedError
|
19
|
+
raise NotImplementedError, "Implement `#{self.class}#{__method__}` to download archive from remote storage to `Capistrano::NetStorage.config.archive_path`"
|
30
20
|
end
|
31
21
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
# raise NotImplementedError
|
36
|
-
# end
|
22
|
+
def cleanup
|
23
|
+
raise NotImplementedError, "Implement `#{self.class}#{__method__}` to clean archives on remote storage to `Capistrano::NetStorage.config.keep_remote_archives`"
|
24
|
+
end
|
37
25
|
end
|
38
26
|
end
|
39
27
|
end
|
@@ -1,2 +1,35 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
module Capistrano
|
2
|
+
module NetStorage
|
3
|
+
class << self
|
4
|
+
attr_reader :config
|
5
|
+
|
6
|
+
def setup!(config:)
|
7
|
+
@config = config
|
8
|
+
end
|
9
|
+
|
10
|
+
def transport
|
11
|
+
config.transport_class.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def archiver
|
15
|
+
config.archiver_class.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def scm
|
19
|
+
config.scm_class.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def cleaner
|
23
|
+
config.cleaner_class.new
|
24
|
+
end
|
25
|
+
|
26
|
+
def bundler
|
27
|
+
config.bundler_class.new
|
28
|
+
end
|
29
|
+
|
30
|
+
def config_uploader
|
31
|
+
config.config_uploader_class.new
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|