avm-tools 0.22.0 → 0.23.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 15042971f9c97791f18e9e663ddc0bc3294280e1efba45d7f14ac3c6af60e63e
4
- data.tar.gz: 06ff3ac5fa18b309c36372c52cf551c7e2da7059c716087ab6b82739c7ecc48b
3
+ metadata.gz: 9cc8ec766645c9ba79f3bbee342a271a47dfbc9921b433b0de06c2dbdac82470
4
+ data.tar.gz: f2efe1291c604c06320b386de40ab0035641017c040ebc0fa3ff5a56a1b57b3b
5
5
  SHA512:
6
- metadata.gz: 753715c0040270d6fc3e1cf4cc212bca06397e4dd21312e3d148d1575071272ad7b489cbef53872df3919d29b11220ea82a829e54bf315e4257022ccd639576a
7
- data.tar.gz: 59a989fe98205a556e301b8dbe7d5a90f00d075809cd9db6e6a7511b789a256126e43b606431b3344ff632c8a2d61d24cdddd12c380c6822d503c2c9e0ca32f0
6
+ metadata.gz: 31f9530c35e93e73fa80ea12e25c1301dadeda7028624cea0ca58253b201f7c3f7b4f3c015f6e9bc6f4fd7db183010be9adb6c89fe8d858f3e38e97d600e90d7
7
+ data.tar.gz: 3aaa766a741baf3d4e3dd5d33219bc1342fe9c0683802e33ca79472327d7b7909c0e45c4d1fde482fbae3a3f817d9a5315958dac26a02ee9e534b02b23fb10e0
@@ -22,13 +22,13 @@ module Avm
22
22
  if instance.docker_container_exist?
23
23
  run_start
24
24
  else
25
- run_run
25
+ run_run(options)
26
26
  end
27
27
  end
28
28
 
29
- def run_run
29
+ def run_run(options)
30
30
  infom "\"docker run #{instance.docker_container_name}...\""
31
- ::Avm::Executables.docker.command.append(run_run_arguments).system!
31
+ ::Avm::Executables.docker.command.append(run_run_arguments(options)).system!
32
32
  end
33
33
 
34
34
  def run_start
@@ -36,9 +36,10 @@ module Avm
36
36
  ::Avm::Executables.docker.command.append(run_start_arguments).system!
37
37
  end
38
38
 
39
- def run_run_arguments
39
+ def run_run_arguments(options)
40
+ entrypoint_args = options[:entrypoint_args].if_present([])
40
41
  ['run', '-it', '--name', instance.docker_container_name] + instance.docker_run_arguments +
41
- [instance.docker_image.tag]
42
+ [instance.docker_image.tag] + entrypoint_args
42
43
  end
43
44
 
44
45
  def run_start_arguments
@@ -7,7 +7,7 @@ module Avm
7
7
  class Registry
8
8
  class << self
9
9
  def default
10
- @default ||= new(::Avm.configs.read_entry('docker.registry.name'))
10
+ @default ||= new(::Avm.configs.read_entry('self.docker.registry.name'))
11
11
  end
12
12
  end
13
13
 
@@ -14,7 +14,7 @@ module Avm
14
14
  Manipulate Docker images.
15
15
 
16
16
  Usage:
17
- __PROGRAM__ [options] [-B <build-arg>...]
17
+ __PROGRAM__ [options] [-B <build-arg>...] [-E <run-arg>...]
18
18
  __PROGRAM__ -h | --help
19
19
 
20
20
  Options:
@@ -23,6 +23,7 @@ module Avm
23
23
  -p --push Push the image to Docker registry.
24
24
  -r --run Run or start a container with builded image.
25
25
  -B --build-arg=<build-arg> Argument for "docker build".
26
+ -E --entrypoint-arg=<run-arg> Argument for entrypoint on "docker run"
26
27
  -c --clear Remove container if exist before run.
27
28
  DOCOPT
28
29
 
@@ -44,6 +45,7 @@ module Avm
44
45
  infov 'Registry name', registry
45
46
  infov 'Image name', instance.docker_image.tag
46
47
  infov 'Build arguments', build_args
48
+ infov 'Entrypoint arguments', entrypoint_args
47
49
  end
48
50
 
49
51
  def build
@@ -54,12 +56,21 @@ module Avm
54
56
  options.fetch('--build-arg')
55
57
  end
56
58
 
59
+ def entrypoint_args
60
+ options.fetch('--entrypoint-arg')
61
+ end
62
+
57
63
  def push
58
64
  instance.docker_image.push if options.fetch('--push')
59
65
  end
60
66
 
61
67
  def container_run
62
- instance.docker_container.run(clear: options.fetch('--clear')) if options.fetch('--run')
68
+ return unless options.fetch('--run')
69
+
70
+ instance.docker_container.run(
71
+ entrypoint_args: entrypoint_args,
72
+ clear: options.fetch('--clear')
73
+ )
63
74
  end
64
75
 
65
76
  def registry_uncached
@@ -4,7 +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
+ require 'avm/patches/object/template'
8
8
 
9
9
  module Avm
10
10
  module Git
@@ -92,7 +92,7 @@ module Avm
92
92
  def copy_appended_directory(directory)
93
93
  raise 'Variables source not set' if variables_source.blank?
94
94
 
95
- ::Avm::Templates::Directory.new(directory).apply(variables_source, build_dir)
95
+ ::EacRubyUtils::Templates::Directory.new(directory).apply(variables_source, build_dir)
96
96
  end
97
97
 
98
98
  def mkdir_target
@@ -1,24 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/core_ext/string/inflections'
4
- require 'avm/templates'
3
+ require 'eac_ruby_utils/patches/object/template'
5
4
 
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
5
+ ::EacRubyUtils::Templates::Searcher.default.included_paths << ::File.expand_path(
6
+ ('../' * 4) + 'template', __dir__
7
+ )
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/require_sub'
4
+ require 'avm/instances/base'
5
+
6
+ module Avm
7
+ module Self
8
+ ::EacRubyUtils.require_sub(__FILE__)
9
+
10
+ class << self
11
+ def instance
12
+ @instance ||= ::Avm::Self::Instance.by_id('avm-tools_self')
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'avm/docker/image'
5
+
6
+ module Avm
7
+ module Self
8
+ class DockerImage < ::Avm::Docker::Image
9
+ common_constructor :registry
10
+
11
+ def tag
12
+ registry.name
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/instances/base'
4
+ require 'avm/self/docker_image'
5
+ require 'avm/stereotypes/eac_ubuntu_base0/docker_image'
6
+
7
+ module Avm
8
+ module Self
9
+ class Instance < ::Avm::Instances::Base
10
+ def docker_image_class
11
+ ::Avm::Self::DockerImage
12
+ end
13
+
14
+ def docker_run_arguments
15
+ ['-e', "LOCAL_USER_ID=#{::Process.uid}"]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -3,7 +3,7 @@
3
3
  require 'eac_ruby_utils/core_ext'
4
4
  require 'avm/patches/object/template'
5
5
  require 'avm/stereotypes/eac_ubuntu_base0/apache'
6
- require 'avm/templates/file'
6
+ require 'avm/patches/object/template'
7
7
 
8
8
  module Avm
9
9
  module Stereotypes
@@ -25,9 +25,8 @@ module Avm
25
25
  end
26
26
 
27
27
  def no_ssl_site_content
28
- ::Avm::Templates::File.new(
29
- ::File.join(::Avm::Stereotypes::EacWebappBase0::ApacheHost.template_path, 'no_ssl.conf')
30
- ).apply(EntriesReader.new(self, instance))
28
+ ::Avm::Stereotypes::EacWebappBase0::ApacheHost.template.child('no_ssl.conf')
29
+ .apply(EntriesReader.new(self, instance))
31
30
  end
32
31
 
33
32
  private
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/console/docopt_runner'
4
+ require 'eac_ruby_utils/require_sub'
5
+ require 'avm/self'
6
+
7
+ module Avm
8
+ module Tools
9
+ class Runner < ::EacRubyUtils::Console::DocoptRunner
10
+ class Self < ::EacRubyUtils::Console::DocoptRunner
11
+ ::EacRubyUtils.require_sub(__FILE__)
12
+
13
+ DOC = <<~DOCOPT
14
+ Utilities for self avm-tools.
15
+
16
+ Usage:
17
+ __PROGRAM__ [options] __SUBCOMMANDS__
18
+ __PROGRAM__ -h | --help
19
+
20
+ Options:
21
+ -h --help Show this screen.
22
+ DOCOPT
23
+
24
+ def instance
25
+ ::Avm::Self.instance
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/docker/runner'
4
+
5
+ module Avm
6
+ module Tools
7
+ class Runner < ::EacRubyUtils::Console::DocoptRunner
8
+ class Self < ::EacRubyUtils::Console::DocoptRunner
9
+ class Docker < ::Avm::Docker::Runner
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Avm
4
4
  module Tools
5
- VERSION = '0.22.0'
5
+ VERSION = '0.23.0'
6
6
  end
7
7
  end
@@ -0,0 +1,17 @@
1
+ FROM ruby:2.4
2
+ RUN gem install avm-tools
3
+
4
+ RUN apt-get update && apt-get -y --no-install-recommends install \
5
+ ca-certificates \
6
+ curl
7
+
8
+ RUN gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4
9
+ RUN curl -o /usr/local/bin/gosu -SL "https://github.com/tianon/gosu/releases/download/1.4/gosu-$(dpkg --print-architecture)" \
10
+ && curl -o /usr/local/bin/gosu.asc -SL "https://github.com/tianon/gosu/releases/download/1.4/gosu-$(dpkg --print-architecture).asc" \
11
+ && gpg --verify /usr/local/bin/gosu.asc \
12
+ && rm /usr/local/bin/gosu.asc \
13
+ && chmod +x /usr/local/bin/gosu
14
+ COPY entrypoint.sh /usr/local/bin/entrypoint.sh
15
+ RUN chmod +x /usr/local/bin/entrypoint.sh
16
+ ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
17
+ CMD []
@@ -0,0 +1,12 @@
1
+ #!/bin/bash
2
+
3
+ # Add local user
4
+ # Either use the LOCAL_USER_ID if passed in at runtime or
5
+ # fallback
6
+
7
+ USER_ID=${LOCAL_USER_ID:-9001}
8
+
9
+ echo "Starting with UID : $USER_ID"
10
+ useradd --shell /bin/bash -u $USER_ID -o -c "" -m user
11
+ export HOME=/home/user
12
+ exec /usr/local/bin/gosu user avm "$@"
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.22.0
4
+ version: 0.23.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-11-14 00:00:00.000000000 Z
11
+ date: 2019-11-20 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.16'
79
+ version: '0.17'
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.16'
86
+ version: '0.17'
87
87
  - !ruby/object:Gem::Dependency
88
88
  name: filesize
89
89
  requirement: !ruby/object:Gem::Requirement
@@ -222,6 +222,9 @@ files:
222
222
  - lib/avm/patches/eac_launcher_git_base.rb
223
223
  - lib/avm/patches/object/template.rb
224
224
  - lib/avm/result.rb
225
+ - lib/avm/self.rb
226
+ - lib/avm/self/docker_image.rb
227
+ - lib/avm/self/instance.rb
225
228
  - lib/avm/stereotypes.rb
226
229
  - lib/avm/stereotypes/eac_rails_base0.rb
227
230
  - lib/avm/stereotypes/eac_rails_base0/apache_host.rb
@@ -244,9 +247,6 @@ files:
244
247
  - lib/avm/stereotypes/postgresql/instance.rb
245
248
  - lib/avm/stereotypes/postgresql/instance/data_unit.rb
246
249
  - lib/avm/stereotypes/postgresql/instance_with.rb
247
- - lib/avm/templates.rb
248
- - lib/avm/templates/directory.rb
249
- - lib/avm/templates/file.rb
250
250
  - lib/avm/tools.rb
251
251
  - lib/avm/tools/git.rb
252
252
  - lib/avm/tools/runner.rb
@@ -270,7 +270,11 @@ files:
270
270
  - lib/avm/tools/runner/git/dirty_files.rb
271
271
  - lib/avm/tools/runner/git/issue.rb
272
272
  - lib/avm/tools/runner/git/issue/complete.rb
273
+ - lib/avm/tools/runner/self.rb
274
+ - lib/avm/tools/runner/self/docker.rb
273
275
  - lib/avm/tools/version.rb
276
+ - template/avm/self/docker_image/Dockerfile
277
+ - template/avm/self/docker_image/entrypoint.sh
274
278
  - template/avm/stereotypes/eac_rails_base0/deploy/config/database.yml.template
275
279
  - template/avm/stereotypes/eac_ubuntu_base0/docker_image/Dockerfile
276
280
  - template/avm/stereotypes/eac_webapp_base0/apache_host/no_ssl.conf
@@ -1,51 +0,0 @@
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(subpath)
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
@@ -1,96 +0,0 @@
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
@@ -1,101 +0,0 @@
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-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