dapp 0.5.13 → 0.6.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.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/bin/dapp +3 -0
  3. data/config/en/common.yml +35 -6
  4. data/config/en/net_status.yml +20 -6
  5. data/lib/dapp.rb +53 -27
  6. data/lib/dapp/application.rb +48 -27
  7. data/lib/dapp/application/git_artifact.rb +1 -1
  8. data/lib/dapp/application/path.rb +2 -18
  9. data/lib/dapp/application/tags.rb +5 -5
  10. data/lib/dapp/build/stage/artifact.rb +8 -3
  11. data/lib/dapp/build/stage/base.rb +43 -30
  12. data/lib/dapp/build/stage/{infra_install.rb → before_install.rb} +6 -6
  13. data/lib/dapp/build/stage/before_setup.rb +27 -0
  14. data/lib/dapp/build/stage/docker_instructions.rb +12 -1
  15. data/lib/dapp/build/stage/from.rb +4 -3
  16. data/lib/dapp/build/stage/{source_1_archive.rb → ga_archive.rb} +7 -7
  17. data/lib/dapp/build/stage/{source_1_archive_dependencies.rb → ga_archive_dependencies.rb} +4 -4
  18. data/lib/dapp/build/stage/{source_base.rb → ga_base.rb} +31 -7
  19. data/lib/dapp/build/stage/{source_dependencies_base.rb → ga_dependencies_base.rb} +5 -6
  20. data/lib/dapp/build/stage/{source_5.rb → ga_latest_patch.rb} +6 -6
  21. data/lib/dapp/build/stage/install/ga_post_install_patch.rb +21 -0
  22. data/lib/dapp/build/stage/install/ga_post_install_patch_dependencies.rb +21 -0
  23. data/lib/dapp/build/stage/install/ga_pre_install_patch.rb +21 -0
  24. data/lib/dapp/build/stage/install/ga_pre_install_patch_dependencies.rb +31 -0
  25. data/lib/dapp/build/stage/install/install.rb +31 -0
  26. data/lib/dapp/build/stage/mod/artifact.rb +9 -19
  27. data/lib/dapp/build/stage/mod/group.rb +42 -0
  28. data/lib/dapp/build/stage/mod/logging.rb +62 -26
  29. data/lib/dapp/build/stage/setup/chef_cookbooks.rb +37 -0
  30. data/lib/dapp/build/stage/setup/ga_post_setup_patch.rb +25 -0
  31. data/lib/dapp/build/stage/setup/ga_post_setup_patch_dependencies.rb +31 -0
  32. data/lib/dapp/build/stage/setup/ga_pre_setup_patch.rb +25 -0
  33. data/lib/dapp/build/stage/setup/ga_pre_setup_patch_dependencies.rb +27 -0
  34. data/lib/dapp/build/stage/setup/setup.rb +31 -0
  35. data/lib/dapp/builder/base.rb +9 -6
  36. data/lib/dapp/builder/chef.rb +128 -107
  37. data/lib/dapp/builder/chef/berksfile.rb +3 -0
  38. data/lib/dapp/builder/shell.rb +4 -3
  39. data/lib/dapp/cli.rb +8 -6
  40. data/lib/dapp/cli/base.rb +6 -1
  41. data/lib/dapp/cli/bp.rb +41 -0
  42. data/lib/dapp/cli/build.rb +17 -4
  43. data/lib/dapp/cli/cleanup.rb +24 -0
  44. data/lib/dapp/cli/list.rb +2 -2
  45. data/lib/dapp/cli/push.rb +8 -9
  46. data/lib/dapp/cli/run.rb +3 -4
  47. data/lib/dapp/cli/spush.rb +20 -0
  48. data/lib/dapp/cli/stages.rb +2 -0
  49. data/lib/dapp/cli/stages/cleanup.rb +7 -3
  50. data/lib/dapp/cli/stages/flush.rb +6 -3
  51. data/lib/dapp/config/application.rb +17 -11
  52. data/lib/dapp/config/chef.rb +4 -0
  53. data/lib/dapp/config/docker.rb +3 -2
  54. data/lib/dapp/config/git_artifact.rb +1 -2
  55. data/lib/dapp/config/main.rb +5 -2
  56. data/lib/dapp/config/shell.rb +20 -16
  57. data/lib/dapp/docker_registry.rb +32 -0
  58. data/lib/dapp/docker_registry/base.rb +47 -0
  59. data/lib/dapp/docker_registry/default.rb +18 -0
  60. data/lib/dapp/docker_registry/mod/authorization.rb +62 -0
  61. data/lib/dapp/docker_registry/mod/request.rb +44 -0
  62. data/lib/dapp/error/image.rb +6 -0
  63. data/lib/dapp/error/project.rb +6 -0
  64. data/lib/dapp/error/registry.rb +6 -0
  65. data/lib/dapp/exception/registry.rb +6 -0
  66. data/lib/dapp/git_artifact.rb +6 -7
  67. data/lib/dapp/git_repo/base.rb +1 -1
  68. data/lib/dapp/git_repo/remote.rb +6 -38
  69. data/lib/dapp/helper/sha256.rb +3 -3
  70. data/lib/dapp/helper/shellout.rb +25 -7
  71. data/lib/dapp/helper/streaming.rb +1 -3
  72. data/lib/dapp/image/argument.rb +31 -18
  73. data/lib/dapp/image/docker.rb +15 -8
  74. data/lib/dapp/image/stage.rb +10 -12
  75. data/lib/dapp/lock/base.rb +44 -0
  76. data/lib/dapp/lock/error.rb +14 -0
  77. data/lib/dapp/lock/file.rb +33 -0
  78. data/lib/dapp/prctl.rb +22 -0
  79. data/lib/dapp/project.rb +75 -0
  80. data/lib/dapp/project/command/bp.rb +24 -0
  81. data/lib/dapp/project/command/build.rb +21 -0
  82. data/lib/dapp/project/command/cleanup.rb +24 -0
  83. data/lib/dapp/project/command/common.rb +51 -0
  84. data/lib/dapp/project/command/list.rb +14 -0
  85. data/lib/dapp/project/command/push.rb +21 -0
  86. data/lib/dapp/project/command/run.rb +15 -0
  87. data/lib/dapp/project/command/spush.rb +17 -0
  88. data/lib/dapp/project/command/stages_cleanup.rb +70 -0
  89. data/lib/dapp/project/command/stages_flush.rb +18 -0
  90. data/lib/dapp/project/dappfile.rb +70 -0
  91. data/lib/dapp/project/lock.rb +27 -0
  92. data/lib/dapp/project/logging/base.rb +107 -0
  93. data/lib/dapp/project/logging/process.rb +104 -0
  94. data/lib/dapp/project/paint.rb +16 -0
  95. data/lib/dapp/project/ssh_agent.rb +77 -0
  96. data/lib/dapp/version.rb +1 -1
  97. metadata +74 -27
  98. data/lib/dapp/application/deps/gitartifact.rb +0 -39
  99. data/lib/dapp/application/logging.rb +0 -120
  100. data/lib/dapp/application/system_shellout.rb +0 -63
  101. data/lib/dapp/build/stage/chef_cookbooks.rb +0 -33
  102. data/lib/dapp/build/stage/infra_setup.rb +0 -27
  103. data/lib/dapp/build/stage/install.rb +0 -27
  104. data/lib/dapp/build/stage/setup.rb +0 -27
  105. data/lib/dapp/build/stage/source_1.rb +0 -21
  106. data/lib/dapp/build/stage/source_1_dependencies.rb +0 -27
  107. data/lib/dapp/build/stage/source_2.rb +0 -17
  108. data/lib/dapp/build/stage/source_2_dependencies.rb +0 -17
  109. data/lib/dapp/build/stage/source_3.rb +0 -17
  110. data/lib/dapp/build/stage/source_3_dependencies.rb +0 -23
  111. data/lib/dapp/build/stage/source_4.rb +0 -21
  112. data/lib/dapp/build/stage/source_4_dependencies.rb +0 -27
  113. data/lib/dapp/cli/smartpush.rb +0 -19
  114. data/lib/dapp/controller.rb +0 -119
  115. data/lib/dapp/error/controller.rb +0 -6
  116. data/lib/dapp/helper/log.rb +0 -73
@@ -5,12 +5,24 @@ module Dapp
5
5
  include Streaming
6
6
 
7
7
  def shellout(*args, log_verbose: false, **kwargs)
8
- do_shellout = proc do
9
- log_verbose = (log_verbose && cli_options[:log_verbose]) if defined? cli_options
10
- kwargs[:live_stream] ||= STDOUT if log_verbose
11
- ::Mixlib::ShellOut.new(*args, timeout: 3600, **kwargs).run_command
8
+ log_verbose = (log_verbose && cli_options[:log_verbose]) if defined? cli_options
9
+ kwargs[:live_stream] ||= STDOUT if log_verbose
10
+
11
+ env = nil
12
+
13
+ Shellout.default_env_keys.each do |env_key|
14
+ env_key = env_key.to_s.upcase
15
+ env ||= {}
16
+ env[env_key] = ENV[env_key]
12
17
  end
13
18
 
19
+ param_env = (kwargs.delete(:env) || kwargs.delete(:environment))
20
+ param_env = param_env.map { |key, value| [key.to_s.upcase, value.to_s] }.to_h if param_env
21
+
22
+ env = (env || {}).merge(param_env) if param_env
23
+ kwargs[:env] = env if env
24
+
25
+ do_shellout = -> { ::Mixlib::ShellOut.new(*args, timeout: 3600, **kwargs).run_command }
14
26
  if defined? ::Bundler
15
27
  ::Bundler.with_clean_env { do_shellout.call }
16
28
  else
@@ -37,9 +49,15 @@ module Dapp
37
49
  "eval $(echo #{Base64.strict_encode64(command)} | base64 --decode)"
38
50
  end
39
51
 
40
- def self.included(base)
41
- base.extend(self)
42
- end
52
+ class << self
53
+ def included(base)
54
+ base.extend(self)
55
+ end
56
+
57
+ def default_env_keys
58
+ @default_env_keys ||= []
59
+ end
60
+ end # << self
43
61
  end
44
62
  end # Helper
45
63
  end # Dapp
@@ -21,8 +21,6 @@ module Dapp
21
21
  module Proxy
22
22
  # Base
23
23
  class Base
24
- include Helper::Log
25
-
26
24
  def initialize(*streams, with_time: false)
27
25
  @streams = streams
28
26
  @with_time = with_time
@@ -33,7 +31,7 @@ module Dapp
33
31
  end
34
32
 
35
33
  def format_string(str)
36
- str.lines.map { |l| "#{log_time if @with_time}#{l.strip}\n" }.join
34
+ str.lines.map { |l| "#{Project::Logging.log_time if @with_time}#{l.strip}\n" }.join
37
35
  end
38
36
  end
39
37
 
@@ -38,8 +38,8 @@ module Dapp
38
38
  add_change_option(:user, value)
39
39
  end
40
40
 
41
- def add_cmd(value)
42
- add_option(:cmd, value)
41
+ def add_service_change_label(**options)
42
+ add_service_change_option(:label, options)
43
43
  end
44
44
 
45
45
  def add_volume(value)
@@ -50,18 +50,25 @@ module Dapp
50
50
  add_option(:'volumes-from', value)
51
51
  end
52
52
 
53
- def add_entrypoint(value)
54
- add_option(:entrypoint, value)
55
- end
56
-
57
53
  def add_command(*commands)
58
54
  @bash_commands.concat(commands.flatten)
59
55
  end
60
56
 
57
+ def prepare_instructions(options)
58
+ options.map do |key, vals|
59
+ case key
60
+ when :cmd, :entrypoint then [vals]
61
+ when :env, :label then vals.map(&method(:options_to_args)).flatten
62
+ else vals
63
+ end.map { |val| %(#{key.to_s.upcase} #{val}) }
64
+ end.flatten
65
+ end
66
+
61
67
  protected
62
68
 
63
69
  attr_reader :bash_commands
64
- attr_reader :options, :change_options
70
+ attr_reader :change_options, :service_change_options
71
+ attr_reader :options
65
72
 
66
73
  def add_option(key, value)
67
74
  add_option_default(options, key, value)
@@ -71,11 +78,15 @@ module Dapp
71
78
  add_option_default(change_options, key, value)
72
79
  end
73
80
 
81
+ def add_service_change_option(key, value)
82
+ add_option_default(service_change_options, key, value)
83
+ end
84
+
74
85
  def add_option_default(hash, key, value)
75
86
  hash[key] = (hash[key].nil? ? [value] : (hash[key] << value)).flatten
76
87
  end
77
88
 
78
- def from_options
89
+ def from_change_options
79
90
  return {} if from.nil?
80
91
  [:entrypoint, :cmd].each_with_object({}) do |option, options|
81
92
  options[option] = self.class.image_config_option(image_id: from.built_id, option: option)
@@ -87,21 +98,23 @@ module Dapp
87
98
  end
88
99
 
89
100
  def prepared_options
90
- prepared_options_default(options) { |key, vals| Array(vals).map { |val| "--#{key}=#{val}" }.join(' ') }
101
+ all_options.map { |key, vals| Array(vals).map { |val| "--#{key}=#{val}" } }.flatten.join(' ')
102
+ end
103
+
104
+ def all_options
105
+ service_options.merge(options)
106
+ end
107
+
108
+ def service_options
109
+ { entrypoint: '/bin/bash', name: container_name }
91
110
  end
92
111
 
93
112
  def prepared_change
94
- prepared_options_default(from_options.merge(change_options)) do |key, vals|
95
- case key
96
- when :cmd, :entrypoint then [vals]
97
- when :env, :label then vals.map(&method(:options_to_args)).flatten
98
- else vals
99
- end.map { |val| %(-c '#{key.to_s.upcase} #{val}') }.join(' ')
100
- end
113
+ prepare_instructions(all_change_options).map { |instruction| %(-c '#{instruction}') }.join(' ')
101
114
  end
102
115
 
103
- def prepared_options_default(hash)
104
- hash.map { |key, vals| yield(key, vals) }.join(' ')
116
+ def all_change_options
117
+ from_change_options.merge(change_options.merge(service_change_options) { |_, v1, v2| [v1, v2].flatten })
105
118
  end
106
119
 
107
120
  def prepared_bash_command
@@ -7,10 +7,12 @@ module Dapp
7
7
 
8
8
  attr_reader :from
9
9
  attr_reader :name
10
+ attr_reader :project
10
11
 
11
- def initialize(name:, from: nil)
12
+ def initialize(name:, project:, from: nil)
12
13
  @from = from
13
14
  @name = name
15
+ @project = project
14
16
  end
15
17
 
16
18
  def id
@@ -43,9 +45,14 @@ module Dapp
43
45
  !!@pulled
44
46
  end
45
47
 
46
- def info
48
+ def created_at
47
49
  raise Error::Build, code: :image_not_exist, data: { name: name } unless tagged?
48
- [cache[:created_at], cache[:size]]
50
+ cache[:created_at]
51
+ end
52
+
53
+ def size
54
+ raise Error::Build, code: :image_not_exist, data: { name: name } unless tagged?
55
+ cache[:size]
49
56
  end
50
57
 
51
58
  def self.image_config_option(image_id:, option:)
@@ -53,23 +60,23 @@ module Dapp
53
60
  output == 'null' ? [] : JSON.parse(output)
54
61
  end
55
62
 
63
+ def cache_reset
64
+ self.class.cache_reset(name)
65
+ end
66
+
56
67
  protected
57
68
 
58
69
  def cache
59
70
  self.class.cache[name.to_s] || {}
60
71
  end
61
72
 
62
- def cache_reset
63
- self.class.cache.delete(name)
64
- self.class.cache_reset(name)
65
- end
66
-
67
73
  class << self
68
74
  def cache
69
75
  @cache ||= (@cache = {}).tap { cache_reset }
70
76
  end
71
77
 
72
78
  def cache_reset(name = '')
79
+ cache.delete(name)
73
80
  shellout!("docker images --format='{{.Repository}}:{{.Tag}};{{.ID}};{{.CreatedAt}};{{.Size}}' #{name}").stdout.lines.each do |line|
74
81
  name, id, created_at, size = line.split(';')
75
82
  cache[name] = { id: id, created_at: created_at, size: size }
@@ -5,13 +5,14 @@ module Dapp
5
5
  class Stage < Docker
6
6
  include Argument
7
7
 
8
- def initialize(name:, built_id: nil, from: nil)
8
+ def initialize(name:, project:, built_id: nil, from: nil)
9
9
  @bash_commands = []
10
10
  @options = {}
11
11
  @change_options = {}
12
- @container_name = SecureRandom.hex
12
+ @service_change_options = {}
13
+ @container_name = "#{name[/[[^:].]*/]}.#{SecureRandom.hex(4)}"
13
14
  @built_id = built_id
14
- super(name: name, from: from)
15
+ super(name: name, project: project, from: from)
15
16
  end
16
17
 
17
18
  def labels
@@ -29,18 +30,15 @@ module Dapp
29
30
  shellout("docker rm #{container_name}")
30
31
  end
31
32
 
32
- def export!(name, log_verbose: false, log_time: false, force: false)
33
- image = self.class.new(built_id: built_id, name: name)
34
- image.tag!(log_verbose: log_verbose, log_time: log_time, force: force)
33
+ def export!(name, log_verbose: false, log_time: false)
34
+ image = self.class.new(name: name, project: project, built_id: built_id)
35
+ image.tag!(log_verbose: log_verbose, log_time: log_time)
35
36
  image.push!(log_verbose: log_verbose, log_time: log_time)
36
37
  image.untag!
37
38
  end
38
39
 
39
- def tag!(log_verbose: false, log_time: false, force: false)
40
- if !(existed_id = id).nil? && !force
41
- raise Error::Build, code: :another_image_already_tagged if built_id != existed_id
42
- return
43
- end
40
+ def tag!(log_verbose: false, log_time: false)
41
+ project.log_warning(desc: { code: :another_image_already_tagged, context: 'warning' }) if !(existed_id = id).nil? && built_id != existed_id
44
42
  shellout!("docker tag #{built_id} #{name}", log_verbose: log_verbose, log_time: log_time)
45
43
  cache_reset
46
44
  end
@@ -51,7 +49,7 @@ module Dapp
51
49
 
52
50
  def run!(log_verbose: false, log_time: false, introspect_error: false, introspect_before_error: false)
53
51
  raise Error::Build, code: :built_id_not_defined if from.built_id.nil?
54
- shellout!("docker run #{prepared_options} --entrypoint /bin/bash --name=#{container_name} #{from.built_id} -ec '#{prepared_bash_command}'",
52
+ shellout!("docker run #{prepared_options} #{from.built_id} -ec '#{prepared_bash_command}'",
55
53
  log_verbose: log_verbose, log_time: log_time)
56
54
  rescue Error::Shellout => _e
57
55
  raise unless introspect_error || introspect_before_error
@@ -0,0 +1,44 @@
1
+ module Dapp
2
+ # Lock
3
+ module Lock
4
+ # Base
5
+ class Base
6
+ attr_reader :name
7
+ attr_reader :on_wait
8
+ attr_reader :timeout
9
+
10
+ def initialize(name, timeout: 60, on_wait: nil)
11
+ @name = name
12
+ @on_wait = on_wait
13
+ @timeout = timeout
14
+ end
15
+
16
+ def lock(shared: false)
17
+ raise
18
+ end
19
+
20
+ def unlock
21
+ raise
22
+ end
23
+
24
+ def synchronize(*args)
25
+ lock(*args)
26
+ begin
27
+ yield if block_given?
28
+ ensure
29
+ unlock
30
+ end
31
+ end
32
+
33
+ protected
34
+
35
+ def _waiting(&blk)
36
+ if @on_wait
37
+ @on_wait.call { ::Timeout.timeout(timeout, &blk) }
38
+ else
39
+ ::Timeout.timeout(timeout, &blk)
40
+ end
41
+ end
42
+ end # Base
43
+ end # Lock
44
+ end # Dapp
@@ -0,0 +1,14 @@
1
+ module Dapp
2
+ # Lock
3
+ module Lock
4
+ # Error
5
+ module Error
6
+ # Timeout
7
+ class Timeout < ::Dapp::Error::Base
8
+ def initialize(**net_status)
9
+ super(context: :lock, **net_status)
10
+ end
11
+ end # Timeout
12
+ end # Error
13
+ end # Lock
14
+ end # Dapp
@@ -0,0 +1,33 @@
1
+ module Dapp
2
+ # Lock
3
+ module Lock
4
+ # File
5
+ class File < Base
6
+ attr_reader :lock_path
7
+
8
+ def initialize(lock_path, name, **kwargs)
9
+ super(name, **kwargs)
10
+ @lock_path = Pathname.new(lock_path).tap(&:mkpath)
11
+ end
12
+
13
+ def lock(shared: false)
14
+ return if @file
15
+ @file = ::File.open(lock_path.join(name), ::File::RDWR | ::File::CREAT, 0644)
16
+
17
+ begin
18
+ mode = (shared ? ::File::LOCK_SH : ::File::LOCK_EX)
19
+ _waiting { @file.flock(mode) } unless @file.flock(mode | ::File::LOCK_NB)
20
+ rescue ::Timeout::Error
21
+ raise Dapp::Lock::Error::Timeout, code: :timeout,
22
+ data: { name: name, timeout: timeout }
23
+ end
24
+ end
25
+
26
+ def unlock
27
+ @file.flock(::File::LOCK_UN)
28
+ @file.close
29
+ @file = nil
30
+ end
31
+ end # File
32
+ end # Lock
33
+ end # Dapp
@@ -0,0 +1,22 @@
1
+ module Prctl
2
+ PR_SET_PDEATHSIG = 1
3
+
4
+ class << self
5
+ def _fiddle_func
6
+ require 'fiddle'
7
+ @_fiddle_func ||= Fiddle::Function.new(
8
+ Fiddle::Handle['prctl'.freeze], [
9
+ Fiddle::TYPE_INT,
10
+ Fiddle::TYPE_LONG,
11
+ Fiddle::TYPE_LONG,
12
+ Fiddle::TYPE_LONG,
13
+ Fiddle::TYPE_LONG
14
+ ], Fiddle::TYPE_INT
15
+ )
16
+ end
17
+
18
+ def call(*a)
19
+ _fiddle_func.call(*a)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,75 @@
1
+ module Dapp
2
+ # Project
3
+ class Project
4
+ include Lock
5
+ include Dappfile
6
+ include Paint
7
+ include Command::Common
8
+ include Command::Run
9
+ include Command::Build
10
+ include Command::Bp
11
+ include Command::Push
12
+ include Command::Spush
13
+ include Command::List
14
+ include Command::StagesFlush
15
+ include Command::StagesCleanup
16
+ include Command::Cleanup
17
+ include Logging::Base
18
+ include Logging::Process
19
+
20
+ include SshAgent
21
+ include Helper::I18n
22
+ include Helper::Shellout
23
+ include Helper::Paint
24
+ include Helper::Sha256
25
+
26
+ attr_reader :cli_options
27
+ attr_reader :apps_patterns
28
+
29
+ def initialize(cli_options: {}, apps_patterns: nil)
30
+ @cli_options = cli_options
31
+ @apps_patterns = apps_patterns || []
32
+ @apps_patterns << '*' unless @apps_patterns.any?
33
+
34
+ paint_initialize
35
+ Helper::I18n.initialize
36
+ end
37
+
38
+ def name
39
+ @name ||= begin
40
+ shellout!("git -C #{path} config --get remote.origin.url").stdout.strip.split('/').last[/.*(?=.git)/]
41
+ rescue Error::Shellout
42
+ File.basename(path)
43
+ end
44
+ end
45
+
46
+ def path
47
+ @path ||= begin
48
+ dappfile_path = dappfiles.first
49
+ if File.basename(expand_path(dappfile_path, 2)) == '.dapps'
50
+ expand_path(dappfile_path, 3)
51
+ else
52
+ expand_path(dappfile_path)
53
+ end
54
+ end
55
+ end
56
+
57
+ def build_path
58
+ @build_path ||= begin
59
+ if cli_options[:build_dir]
60
+ Pathname.new(cli_options[:build_dir])
61
+ else
62
+ Pathname.new(path).join('.dapps_build')
63
+ end.expand_path.tap(&:mkpath)
64
+ end
65
+ end
66
+
67
+ def cache_format
68
+ "dappstage-#{name}-%{application_name}"
69
+ end
70
+
71
+ def stage_dapp_label_format
72
+ '%{application_name}'
73
+ end
74
+ end # Project
75
+ end # Dapp