avm-tools 0.14.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e397269b3172cef0af4f83f2c7276fb9dcb51c6d457f7278940701c473d41402
4
- data.tar.gz: 20797859192beecaaafba3f3af1d6c70fb538248b836611d1a37425e43920c62
3
+ metadata.gz: d542c3ce6d969a69098250163e506bff7c11293a2c03bf9afd3c443e3e8bf93f
4
+ data.tar.gz: c9ffe435c0fd1c2f42a66e90bd2b06a27b35307f355047d6c0cd976426a9ffbb
5
5
  SHA512:
6
- metadata.gz: 8114b94bf8609107a002aaf93f99f70594f12ccdb92e009f8a86d28e2a41a1e3853f9adf877eca5e1fa2d120fb23e8ec8bb814123eae80770d62ecf0dfbd3a22
7
- data.tar.gz: bac5f7db55ac67de51619596789953161386565bc19ceed6bc3537a6cb9f034e1ab365d7eff0c86eebf1a049bd5a55d281867977e622e539d4cbbd2df2f2e833
6
+ metadata.gz: 700db3976b2b5f57269ade79a8d43b667819f82e551f6124879b4999f087f770c641313bae39551224349a4d3487e6d4835db60fb9eba556af4048aaace7cb41
7
+ data.tar.gz: 29baf3afeeef3eee66956dde7fcedf8a4de2d641e2635fd8a99c9992f13e02b2d1b3e114833f131d1e107a9615ce1b718a254f61ee2599f3534dcf54bb2f04d4
data/lib/avm.rb CHANGED
@@ -9,5 +9,6 @@ module Avm
9
9
  require 'avm/patches'
10
10
  require 'avm/result'
11
11
  require 'avm/stereotypes'
12
+ require 'avm/templates'
12
13
  require 'avm/tools'
13
14
  end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/data/instance/unit'
4
+
5
+ module Avm
6
+ module Data
7
+ module Instance
8
+ class FilesUnit < ::Avm::Data::Instance::Unit
9
+ EXTENSION = '.tar.gz'
10
+
11
+ attr_reader :fs_path_subpath
12
+
13
+ def initialize(instance, fs_path_subpath)
14
+ super(instance)
15
+ @fs_path_subpath = fs_path_subpath
16
+ end
17
+
18
+ before_load :clear_files
19
+
20
+ def files_path
21
+ ::File.join(instance.read_entry(:fs_path), fs_path_subpath)
22
+ end
23
+
24
+ def dump_command
25
+ instance.host_env.command('tar', '-czf', '-', '-C', files_path, '.')
26
+ end
27
+
28
+ def load_command
29
+ instance.host_env.command('tar', '-xzf', '-', '-C', files_path)
30
+ end
31
+
32
+ def clear_files
33
+ infom "Removing all files under #{files_path}..."
34
+ instance.host_env.command('find', files_path, '-mindepth', 1, '-delete').execute!
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -4,6 +4,7 @@ require 'addressable'
4
4
  require 'eac_ruby_utils/simple_cache'
5
5
  require 'eac_ruby_utils/require_sub'
6
6
  ::EacRubyUtils.require_sub(__FILE__)
7
+ require 'avm/templates/directory'
7
8
 
8
9
  module Avm
9
10
  module Git
@@ -37,21 +38,60 @@ module Avm
37
38
  class Deploy
38
39
  include ::EacRubyUtils::SimpleCache
39
40
 
40
- attr_reader :commit, :target_env, :target_path
41
+ attr_reader :commit, :target_env, :target_path, :appended_directories, :variables_source
41
42
 
42
43
  def initialize(commit, target_env, target_path)
43
44
  @commit = commit
44
45
  @target_env = target_env
45
46
  @target_path = target_path
46
- run
47
+ @appended_directories = []
48
+ @variables_source = nil
47
49
  end
48
50
 
49
- private
51
+ def append_directory(directory)
52
+ @appended_directories << directory
53
+ self
54
+ end
55
+
56
+ def append_directories(directories)
57
+ directories.each { |directory| append_directory(directory) }
58
+ self
59
+ end
60
+
61
+ def variables_source_set(source)
62
+ @variables_source = source
63
+ self
64
+ end
50
65
 
51
66
  def run
52
- mkdir_target
53
- clear_content
54
- send_untar_package
67
+ on_build_dir do
68
+ copy_git_content
69
+ appended_directories.each { |directory| copy_appended_directory(directory) }
70
+ mkdir_target
71
+ clear_content
72
+ send_untar_package
73
+ end
74
+ end
75
+
76
+ private
77
+
78
+ attr_reader :build_dir
79
+
80
+ def on_build_dir
81
+ @build_dir = ::Dir.mktmpdir
82
+ yield
83
+ ensure
84
+ ::FileUtils.rm_rf(@build_dir)
85
+ end
86
+
87
+ def copy_git_content
88
+ git_archive_command.pipe(untar_git_archive_command).execute!
89
+ end
90
+
91
+ def copy_appended_directory(directory)
92
+ raise 'Variables source not set' if variables_source.blank?
93
+
94
+ ::Avm::Templates::Directory.new(directory).apply(variables_source, build_dir)
55
95
  end
56
96
 
57
97
  def mkdir_target
@@ -60,20 +100,32 @@ module Avm
60
100
 
61
101
  def clear_content
62
102
  target_env.command(
63
- 'find', target_path, '-mindepth', 1, '-exec', 'rm', '-rf', '{}', ';'
103
+ 'find', target_path, '-mindepth', '1', '-maxdepth', '1', '-exec', 'rm', '-rf', '{}', ';'
64
104
  ).execute!
65
105
  end
66
106
 
67
107
  def send_untar_package
68
- git_archive_command.pipe(untar_command).execute!
108
+ tar_build_command.pipe(untar_build_command).execute!
69
109
  end
70
110
 
71
111
  def git_archive_command
72
112
  commit.git.command('archive', '--format=tar', commit.sha1)
73
113
  end
74
114
 
75
- def untar_command
76
- target_env.command('tar', '-xf', '-', '-C', target_path)
115
+ def untar_git_archive_command
116
+ source_env.command('tar', '-xf', '-', '-C', build_dir)
117
+ end
118
+
119
+ def tar_build_command
120
+ source_env.command('tar', '-czO', '-C', build_dir, '.')
121
+ end
122
+
123
+ def untar_build_command
124
+ target_env.command('tar', '-xzf', '-', '-C', target_path)
125
+ end
126
+
127
+ def source_env
128
+ ::EacRubyUtils::Envs.local
77
129
  end
78
130
  end
79
131
  end
@@ -39,6 +39,10 @@ module Avm
39
39
  "#{application.id}_#{suffix}"
40
40
  end
41
41
 
42
+ def to_s
43
+ id
44
+ end
45
+
42
46
  def host_env_uncached
43
47
  if read_entry('host') == 'localhost'
44
48
  ::EacRubyUtils::Envs.local
@@ -46,6 +50,12 @@ module Avm
46
50
  ::EacRubyUtils::Envs.ssh("#{read_entry('user')}@#{read_entry('host')}")
47
51
  end
48
52
  end
53
+
54
+ private
55
+
56
+ def source_instance_uncached
57
+ ::Avm::Instances::Base.by_id(read_entry(:source_instance_id))
58
+ end
49
59
  end
50
60
  end
51
61
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/string/inflections'
4
+ require 'avm/templates'
5
+
6
+ class Object
7
+ class << self
8
+ def template
9
+ @template ||= ::Avm::Templates.template(name.underscore)
10
+ end
11
+
12
+ def template_path
13
+ @template_path ||= ::Avm::Templates.template_path(name.underscore)
14
+ end
15
+ end
16
+
17
+ def template
18
+ self.class.template
19
+ end
20
+
21
+ def template_path
22
+ self.class.template_path
23
+ end
24
+ end
data/lib/avm/result.rb CHANGED
@@ -66,5 +66,11 @@ module Avm
66
66
 
67
67
  raise "Tipo desconhecido: \"#{type}\" (Válido: #{self.class.lists.type.values.join(', ')})"
68
68
  end
69
+
70
+ class Error < StandardError
71
+ def to_result
72
+ ::Avm::Result.error(message)
73
+ end
74
+ end
69
75
  end
70
76
  end
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'delegate'
4
+ require 'eac_ruby_utils/core_ext'
5
+ require 'eac_launcher/git/base'
6
+ require 'avm/git/commit'
7
+ require 'avm/patches/object/template'
8
+
9
+ module Avm
10
+ module Stereotypes
11
+ module EacWordpressBase0
12
+ class Deploy
13
+ enable_console_speaker
14
+ enable_simple_cache
15
+
16
+ attr_reader :instance, :git_reference
17
+
18
+ DEFAULT_REMOTE_NAME = 'origin'
19
+
20
+ def initialize(instance, git_reference)
21
+ @instance = instance
22
+ @git_reference = git_reference
23
+ end
24
+
25
+ def run
26
+ start_banner
27
+ git_deploy
28
+ setup_files_units
29
+ assert_instance_branch
30
+ ::Avm::Result.success('Deployed')
31
+ rescue ::Avm::Result::Error => e
32
+ e.to_result
33
+ end
34
+
35
+ def start_banner
36
+ infov 'Instance', instance
37
+ infov 'Git reference (User)', git_reference.if_present('- BLANK -')
38
+ infov 'Git remote name', git_remote_name
39
+ infov 'Git reference (Found)', git_reference_found
40
+ infov 'Git commit SHA1', commit_sha1
41
+ end
42
+
43
+ def git_deploy
44
+ infom 'Deploying source code and appended content...'
45
+ ::Avm::Git::Commit.new(git, commit_sha1).deploy_to_env_path(
46
+ instance.host_env,
47
+ instance.read_entry(:fs_path)
48
+ ).append_directory(template_path).variables_source_set(instance).run
49
+ end
50
+
51
+ def setup_files_units
52
+ ::Avm::Stereotypes::EacWordpressBase0::Instance::FILES_UNITS
53
+ .each do |data_key, fs_path_subpath|
54
+ FilesUnit.new(self, data_key, fs_path_subpath).run
55
+ end
56
+ end
57
+
58
+ def assert_instance_branch
59
+ infom 'Setting instance branch...'
60
+ git.execute!('push', git_remote_name, "#{commit_sha1}:refs/heads/#{instance.id}", '-f')
61
+ end
62
+
63
+ def commit_sha1_uncached
64
+ git_fetch
65
+ r = git.rev_parse(git_reference_found)
66
+ return r if r
67
+
68
+ raise ::Avm::Result::Error, "No commit SHA1 found for \"#{git_reference_found}\""
69
+ end
70
+
71
+ def git_reference_found_uncached
72
+ %w[git_reference instance_branch master_branch].map { |b| send(b) }.find(&:present?) ||
73
+ raise(
74
+ ::Avm::Result::Error,
75
+ 'No git reference found (Searched for option, instance and master)'
76
+ )
77
+ end
78
+
79
+ def git_uncached
80
+ ::EacLauncher::Git::Base.new(git_repository_path)
81
+ end
82
+
83
+ def instance_branch
84
+ remote_branch(instance.id)
85
+ end
86
+
87
+ def master_branch
88
+ remote_branch('master')
89
+ end
90
+
91
+ def git_remote_name
92
+ DEFAULT_REMOTE_NAME
93
+ end
94
+
95
+ def git_remote_hashs_uncached
96
+ git.remote_hashs(git_remote_name)
97
+ end
98
+
99
+ def git_fetch_uncached
100
+ infom "Fetching remote \"#{git_remote_name}\" from \"#{git_repository_path}\"..."
101
+ git.fetch(git_remote_name)
102
+ end
103
+
104
+ def git_repository_path
105
+ instance.source_instance.read_entry(:fs_path)
106
+ end
107
+
108
+ def remote_branch(name)
109
+ git_remote_hashs.key?("refs/heads/#{name}") ? "#{git_remote_name}/#{name}" : nil
110
+ end
111
+
112
+ class FilesUnit < ::SimpleDelegator
113
+ attr_reader :data_key, :fs_path_subpath
114
+
115
+ def initialize(deploy, data_key, fs_path_subpath)
116
+ super(deploy)
117
+ @data_key = data_key
118
+ @fs_path_subpath = fs_path_subpath
119
+ end
120
+
121
+ def run
122
+ assert_source_directory
123
+ link_source_target
124
+ end
125
+
126
+ def assert_source_directory
127
+ infom "Asserting \"#{data_key}\" source directory..."
128
+ instance.host_env.command('mkdir', '-p', source_path).execute!
129
+ end
130
+
131
+ def source_path
132
+ ::File.join(instance.read_entry(:data_fs_path), data_key.to_s)
133
+ end
134
+
135
+ def target_path
136
+ ::File.join(instance.read_entry(:fs_path), fs_path_subpath.to_s)
137
+ end
138
+
139
+ def link_source_target
140
+ infom "Linking \"#{data_key}\" directory..."
141
+ instance.host_env.command('rm', '-rf', target_path).execute!
142
+ instance.host_env.command('ln', '-s', source_path, target_path).execute!
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
@@ -2,8 +2,8 @@
2
2
 
3
3
  require 'avm/instances/base'
4
4
  require 'avm/stereotypes/postgresql/instance_with'
5
+ require 'avm/data/instance/files_unit'
5
6
  require 'avm/data/instance/package'
6
- require 'avm/stereotypes/eac_wordpress_base0/uploads_data_unit'
7
7
 
8
8
  module Avm
9
9
  module Stereotypes
@@ -11,6 +11,8 @@ module Avm
11
11
  class Instance < ::Avm::Instances::Base
12
12
  include ::Avm::Stereotypes::Postgresql::InstanceWith
13
13
 
14
+ FILES_UNITS = { uploads: 'wp-content/uploads', themes: 'wp-content/themes' }.freeze
15
+
14
16
  def data_dump(argv = [])
15
17
  run_subcommand(::Avm::Tools::Runner::EacWordpressBase0::Data::Dump, argv)
16
18
  end
@@ -22,7 +24,7 @@ module Avm
22
24
 
23
25
  def data_package
24
26
  @data_package ||= ::Avm::Data::Instance::Package.new(
25
- self, units: { database: database_unit, uploads: UploadsDataUnit.new(self) }
27
+ self, units: { database: database_unit }.merge(files_units)
26
28
  )
27
29
  end
28
30
 
@@ -37,6 +39,14 @@ module Avm
37
39
  SQL
38
40
  end
39
41
  end
42
+
43
+ private
44
+
45
+ def files_units
46
+ FILES_UNITS.map do |data_key, fs_path_subpath|
47
+ [data_key, ::Avm::Data::Instance::FilesUnit.new(self, fs_path_subpath)]
48
+ end.to_h
49
+ end
40
50
  end
41
51
  end
42
52
  end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/require_sub'
4
+ ::EacRubyUtils.require_sub(__FILE__)
5
+
6
+ module Avm
7
+ module Templates
8
+ class << self
9
+ def template(subpath, required = true)
10
+ path = template_path
11
+ if path.blank?
12
+ return nil unless required
13
+
14
+ raise "Template not found for subpath \"#{subpath}\" (Included paths: #{included_paths})"
15
+ end
16
+ return ::Avm::Templates::File.new(path) if ::File.file?(path)
17
+ return ::Avm::Templates::Directory.new(path) if ::File.directory?(path)
18
+
19
+ raise 'Invalid branching'
20
+ end
21
+
22
+ # @return The absolute path of template if found, +nil+ otherwise.
23
+ def template_path(subpath)
24
+ included_paths.each do |included_path|
25
+ r = search_template_in_included_path(included_path, subpath)
26
+ return r if r
27
+ end
28
+ nil
29
+ end
30
+
31
+ def included_paths
32
+ @included_paths ||= ::Set.new([::File.expand_path('../../template', __dir__)])
33
+ end
34
+
35
+ private
36
+
37
+ def search_template_in_included_path(included_path, subpath)
38
+ path = ::File.join(included_path, subpath)
39
+ dir = ::File.dirname(path)
40
+ Dir.entries(dir).each do |entry|
41
+ next if %w[. ..].include?(entry)
42
+ return path if template_basename(entry) == ::File.basename(subpath)
43
+ end
44
+ end
45
+
46
+ def template_basename(entry)
47
+ entry.gsub(/(?:\.[a-z0-9]+)+\z/i, '')
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/templates/file'
4
+
5
+ module Avm
6
+ module Templates
7
+ class Directory
8
+ TEMPLATE_EXTNAME = '.template'
9
+
10
+ attr_reader :path
11
+
12
+ def initialize(path)
13
+ @path = path
14
+ end
15
+
16
+ def apply(variables_source, directory)
17
+ TemplateNode.new(self, '.', directory, variables_source).apply
18
+ end
19
+
20
+ private
21
+
22
+ def apply_fs_object(source_relative, target)
23
+ if ::File.directory?(source_absolute(source_relative))
24
+ apply_directory(source_relative, target)
25
+ elsif ::File.file?(source_absolute(source_relative))
26
+ end
27
+ end
28
+
29
+ def source_absolute(source_relative)
30
+ ::File.expand_path(source_relative, path)
31
+ end
32
+
33
+ class TemplateNode
34
+ attr_reader :source_directory, :source_relative, :target_root_directory, :variables_source
35
+
36
+ def initialize(source_directory, source_relative, target_root_directory, variables_source)
37
+ @source_directory = source_directory
38
+ @source_relative = source_relative
39
+ @target_root_directory = target_root_directory
40
+ @variables_source = variables_source
41
+ end
42
+
43
+ def apply
44
+ if file?
45
+ apply_file
46
+ elsif directory?
47
+ apply_directory
48
+ else
49
+ raise "Unknown filesystem type: #{source_absolute}"
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def apply_directory
56
+ ::FileUtils.mkdir_p(target_absolute)
57
+ Dir.entries(source_absolute).each do |entry|
58
+ child(entry).apply unless %w[. ..].include?(entry)
59
+ end
60
+ end
61
+
62
+ def apply_file
63
+ if ::File.extname(source_absolute) == TEMPLATE_EXTNAME
64
+ ::Avm::Templates::File.new(source_absolute).apply_to_file(
65
+ variables_source, target_absolute
66
+ )
67
+ else
68
+ ::FileUtils.cp(source_absolute, target_absolute)
69
+ end
70
+ end
71
+
72
+ def child(entry)
73
+ TemplateNode.new(source_directory, ::File.join(source_relative, entry),
74
+ target_root_directory, variables_source)
75
+ end
76
+
77
+ def file?
78
+ ::File.file?(source_absolute)
79
+ end
80
+
81
+ def directory?
82
+ ::File.directory?(source_absolute)
83
+ end
84
+
85
+ def source_absolute
86
+ ::File.expand_path(source_relative, source_directory.path)
87
+ end
88
+
89
+ def target_absolute
90
+ ::File.expand_path(source_relative, target_root_directory)
91
+ .gsub(/#{::Regexp.quote(TEMPLATE_EXTNAME)}\z/, '')
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/hash/indifferent_access'
4
+ require 'eac_ruby_utils/simple_cache'
5
+
6
+ module Avm
7
+ module Templates
8
+ class File
9
+ include ::EacRubyUtils::SimpleCache
10
+
11
+ VARIABLE_DELIMITER = ::Regexp.quote('%%')
12
+ VARIABLE_PATTERN = /#{VARIABLE_DELIMITER}([a-z_][a-z0-9_]*)#{VARIABLE_DELIMITER}/i.freeze
13
+
14
+ attr_reader :path
15
+
16
+ def initialize(path)
17
+ @path = path
18
+ end
19
+
20
+ # +variables_provider+ A [Hash] or object which responds to +read_entry(entry_name)+.
21
+ def apply(variables_source)
22
+ variables_provider = build_variables_provider(variables_source)
23
+ variables.inject(content) do |a, e|
24
+ a.gsub(variable_pattern(e), variables_provider.variable_value(e).to_s)
25
+ end
26
+ end
27
+
28
+ def apply_to_file(variables_source, output_file_path)
29
+ ::File.write(output_file_path, apply(variables_source))
30
+ end
31
+
32
+ private
33
+
34
+ def variables_uncached
35
+ content.scan(VARIABLE_PATTERN).map(&:first).map do |name|
36
+ sanitize_variable_name(name)
37
+ end.to_set
38
+ end
39
+
40
+ def content_uncached
41
+ ::File.read(path)
42
+ end
43
+
44
+ def sanitize_variable_name(variable_name)
45
+ variable_name.to_s.downcase
46
+ end
47
+
48
+ def build_variables_provider(variables_source)
49
+ return HashVariablesProvider.new(variables_source) if variables_source.is_a?(::Hash)
50
+ return EntriesReaderVariablesProvider.new(variables_source) if
51
+ variables_source.respond_to?(:read_entry)
52
+
53
+ raise "Variables provider not found for #{variables_source}"
54
+ end
55
+
56
+ def variable_pattern(name)
57
+ /#{VARIABLE_DELIMITER}#{::Regexp.quote(name)}#{VARIABLE_DELIMITER}/i
58
+ end
59
+
60
+ class BaseVariablesProvider
61
+ attr_reader :source
62
+
63
+ def initialize(source)
64
+ @source = source
65
+ end
66
+
67
+ def variable_value(name)
68
+ return variable_fetch(name) if variable_exist?(name)
69
+
70
+ raise VariableNotFoundError, "Variable \"#{name}\" not found in #{source}"
71
+ end
72
+ end
73
+
74
+ class HashVariablesProvider < BaseVariablesProvider
75
+ def initialize(source)
76
+ super(source.with_indifferent_access)
77
+ end
78
+
79
+ def variable_exist?(name)
80
+ source.key?(name)
81
+ end
82
+
83
+ def variable_fetch(name)
84
+ source.fetch(name)
85
+ end
86
+ end
87
+
88
+ class EntriesReaderVariablesProvider < BaseVariablesProvider
89
+ def variable_exist?(_name)
90
+ true
91
+ end
92
+
93
+ def variable_fetch(name)
94
+ source.read_entry(name)
95
+ end
96
+ end
97
+
98
+ class VariableNotFoundError < StandardError; end
99
+ end
100
+ end
101
+ end
@@ -4,6 +4,7 @@ require 'eac_ruby_utils/console/docopt_runner'
4
4
  require 'eac_ruby_utils/simple_cache'
5
5
  require 'avm/stereotypes/eac_wordpress_base0/instance'
6
6
  require 'avm/tools/runner/eac_wordpress_base0/data'
7
+ require 'avm/tools/runner/eac_wordpress_base0/deploy'
7
8
 
8
9
  module Avm
9
10
  module Tools
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/console/docopt_runner'
4
+ require 'eac_ruby_utils/console/speaker'
5
+ require 'avm/stereotypes/eac_wordpress_base0/deploy'
6
+
7
+ module Avm
8
+ module Tools
9
+ class Runner < ::EacRubyUtils::Console::DocoptRunner
10
+ class EacWordpressBase0 < ::EacRubyUtils::Console::DocoptRunner
11
+ class Deploy < ::EacRubyUtils::Console::DocoptRunner
12
+ include ::EacRubyUtils::Console::Speaker
13
+
14
+ DOC = <<~DOCOPT
15
+ Deploy for EacWordpressBase0 instance.
16
+
17
+ Usage:
18
+ __PROGRAM__ [options]
19
+ __PROGRAM__ -h | --help
20
+
21
+ Options:
22
+ -h --help Show this screen.
23
+ -r --reference=<git-reference> Git reference to deploy.
24
+ DOCOPT
25
+
26
+ def run
27
+ result = ::Avm::Stereotypes::EacWordpressBase0::Deploy.new(
28
+ context(:instance),
29
+ options.fetch('--reference')
30
+ ).run
31
+ if result.error?
32
+ fatal_error result.to_s
33
+ else
34
+ infov 'Result', result.label
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -17,13 +17,14 @@ module Avm
17
17
  DOC = <<~DOCOPT
18
18
  Deploy a Git revision to a location (Local or remote).
19
19
 
20
- Usage:
21
- __PROGRAM__ [options] <target-url>
22
- __PROGRAM__ -h | --help
20
+ Usage:
21
+ __PROGRAM__ [options] <target-url> [<append-directories>...]
22
+ __PROGRAM__ -h | --help
23
23
 
24
24
  Options:
25
- -h --help Mostra esta ajuda.
26
- -r --reference=<reference> Reference [default: HEAD].
25
+ -h --help Mostra esta ajuda.
26
+ -r --reference=<reference> Reference [default: HEAD].
27
+ -i --instance=<instance-id> Read entries from instance with id=<instance-id>.
27
28
  DOCOPT
28
29
 
29
30
  def run
@@ -38,6 +39,7 @@ module Avm
38
39
  def input_banner
39
40
  infov 'Repository', git
40
41
  infov 'Reference', reference
42
+ infov 'Instance ID', instance_id.if_present('- BLANK -')
41
43
  end
42
44
 
43
45
  def validate
@@ -63,8 +65,23 @@ module Avm
63
65
  end
64
66
 
65
67
  def deploy
66
- commit = ::Avm::Git::Commit.new(git, reference_sha1)
67
- commit.deploy_to_url(options.fetch('<target-url>'))
68
+ ::Avm::Git::Commit.new(git, reference_sha1)
69
+ .deploy_to_url(options.fetch('<target-url>'))
70
+ .append_directories(options.fetch('<append-directories>'))
71
+ .variables_source_set(variables_source)
72
+ .run
73
+ end
74
+
75
+ def variables_source
76
+ instance || ::Avm.configs
77
+ end
78
+
79
+ def instance_uncached
80
+ instance_id.if_present { |v| ::Avm::Instances::Base.by_id(v) }
81
+ end
82
+
83
+ def instance_id
84
+ options.fetch('--instance')
68
85
  end
69
86
  end
70
87
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Avm
4
4
  module Tools
5
- VERSION = '0.14.0'
5
+ VERSION = '0.15.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: avm-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esquilo Azul Company
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-03 00:00:00.000000000 Z
11
+ date: 2019-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aranha-parsers
@@ -76,14 +76,14 @@ dependencies:
76
76
  requirements:
77
77
  - - "~>"
78
78
  - !ruby/object:Gem::Version
79
- version: '0.13'
79
+ version: '0.14'
80
80
  type: :runtime
81
81
  prerelease: false
82
82
  version_requirements: !ruby/object:Gem::Requirement
83
83
  requirements:
84
84
  - - "~>"
85
85
  - !ruby/object:Gem::Version
86
- version: '0.13'
86
+ version: '0.14'
87
87
  - !ruby/object:Gem::Dependency
88
88
  name: filesize
89
89
  requirement: !ruby/object:Gem::Requirement
@@ -173,6 +173,7 @@ files:
173
173
  - lib/avm/configs.rb
174
174
  - lib/avm/data.rb
175
175
  - lib/avm/data/instance.rb
176
+ - lib/avm/data/instance/files_unit.rb
176
177
  - lib/avm/data/instance/package.rb
177
178
  - lib/avm/data/instance/unit.rb
178
179
  - lib/avm/data/package.rb
@@ -203,14 +204,18 @@ files:
203
204
  - lib/avm/instances/entries.rb
204
205
  - lib/avm/patches.rb
205
206
  - lib/avm/patches/eac_launcher_git_base.rb
207
+ - lib/avm/patches/object/template.rb
206
208
  - lib/avm/result.rb
207
209
  - lib/avm/stereotypes.rb
210
+ - lib/avm/stereotypes/eac_wordpress_base0/deploy.rb
208
211
  - lib/avm/stereotypes/eac_wordpress_base0/instance.rb
209
- - lib/avm/stereotypes/eac_wordpress_base0/uploads_data_unit.rb
210
212
  - lib/avm/stereotypes/postgresql.rb
211
213
  - lib/avm/stereotypes/postgresql/instance.rb
212
214
  - lib/avm/stereotypes/postgresql/instance/data_unit.rb
213
215
  - lib/avm/stereotypes/postgresql/instance_with.rb
216
+ - lib/avm/templates.rb
217
+ - lib/avm/templates/directory.rb
218
+ - lib/avm/templates/file.rb
214
219
  - lib/avm/tools.rb
215
220
  - lib/avm/tools/git.rb
216
221
  - lib/avm/tools/runner.rb
@@ -218,6 +223,7 @@ files:
218
223
  - lib/avm/tools/runner/eac_wordpress_base0/data.rb
219
224
  - lib/avm/tools/runner/eac_wordpress_base0/data/dump.rb
220
225
  - lib/avm/tools/runner/eac_wordpress_base0/data/load.rb
226
+ - lib/avm/tools/runner/eac_wordpress_base0/deploy.rb
221
227
  - lib/avm/tools/runner/files.rb
222
228
  - lib/avm/tools/runner/files/rotate.rb
223
229
  - lib/avm/tools/runner/git.rb
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'minitar'
4
- require 'zlib'
5
- require 'avm/data/instance/unit'
6
-
7
- module Avm
8
- module Stereotypes
9
- module EacWordpressBase0
10
- class Instance < ::Avm::Instances::Base
11
- class UploadsDataUnit < ::Avm::Data::Instance::Unit
12
- EXTENSION = '.tar.gz'
13
-
14
- before_load :clear_uploads
15
-
16
- def uploads_path
17
- ::File.join(instance.read_entry(:fs_path), 'wp-content', 'uploads')
18
- end
19
-
20
- def dump_command
21
- instance.host_env.command('tar', '-czf', '-', '-C', uploads_path, '.')
22
- end
23
-
24
- def load_command
25
- instance.host_env.command('tar', '-xzf', '-', '-C', uploads_path)
26
- end
27
-
28
- def clear_uploads
29
- infom "Removing all files under #{uploads_path}..."
30
- instance.host_env.command('find', uploads_path, '-mindepth', 1, '-delete').execute!
31
- end
32
- end
33
- end
34
- end
35
- end
36
- end