dapp 0.6.1 → 0.6.2
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 +4 -4
- data/bin/dapp +3 -3
- data/config/en/common.yml +19 -4
- data/config/en/net_status.yml +13 -4
- data/lib/dapp.rb +48 -16
- data/lib/dapp/application.rb +75 -40
- data/lib/dapp/application/path.rb +3 -2
- data/lib/dapp/application/stages.rb +59 -0
- data/lib/dapp/artifact.rb +22 -0
- data/lib/dapp/build/stage/after_install_artifact.rb +13 -0
- data/lib/dapp/build/stage/after_setup_artifact.rb +17 -0
- data/lib/dapp/build/stage/artifact_base.rb +80 -0
- data/lib/dapp/build/stage/artifact_default.rb +62 -0
- data/lib/dapp/build/stage/base.rb +47 -12
- data/lib/dapp/build/stage/before_install.rb +6 -5
- data/lib/dapp/build/stage/before_install_artifact.rb +13 -0
- data/lib/dapp/build/stage/before_setup.rb +7 -8
- data/lib/dapp/build/stage/before_setup_artifact.rb +13 -0
- data/lib/dapp/build/stage/build_artifact.rb +32 -0
- data/lib/dapp/build/stage/docker_instructions.rb +4 -22
- data/lib/dapp/build/stage/from.rb +7 -8
- data/lib/dapp/build/stage/ga_archive.rb +1 -1
- data/lib/dapp/build/stage/ga_archive_dependencies.rb +1 -1
- data/lib/dapp/build/stage/ga_artifact_patch.rb +21 -0
- data/lib/dapp/build/stage/ga_base.rb +6 -29
- data/lib/dapp/build/stage/ga_dependencies_base.rb +4 -13
- data/lib/dapp/build/stage/ga_latest_patch.rb +2 -2
- data/lib/dapp/build/stage/import_artifact.rb +69 -0
- data/lib/dapp/build/stage/install/ga_post_install_patch.rb +1 -1
- data/lib/dapp/build/stage/install/ga_post_install_patch_dependencies.rb +1 -1
- data/lib/dapp/build/stage/install/ga_pre_install_patch_dependencies.rb +1 -7
- data/lib/dapp/build/stage/install/install.rb +12 -7
- data/lib/dapp/build/stage/mod/logging.rb +10 -7
- data/lib/dapp/build/stage/setup/chef_cookbooks.rb +3 -4
- data/lib/dapp/build/stage/setup/ga_post_setup_patch.rb +1 -1
- data/lib/dapp/build/stage/setup/ga_pre_setup_patch.rb +2 -2
- data/lib/dapp/build/stage/setup/ga_pre_setup_patch_dependencies.rb +2 -8
- data/lib/dapp/build/stage/setup/setup.rb +12 -7
- data/lib/dapp/builder/base.rb +13 -1
- data/lib/dapp/builder/chef.rb +125 -79
- data/lib/dapp/builder/chef/cookbook_metadata.rb +1 -1
- data/lib/dapp/builder/shell.rb +2 -3
- data/lib/dapp/cli.rb +3 -3
- data/lib/dapp/cli/base.rb +0 -2
- data/lib/dapp/cli/bp.rb +0 -4
- data/lib/dapp/cli/build.rb +3 -7
- data/lib/dapp/cli/cleanup.rb +0 -2
- data/lib/dapp/cli/list.rb +0 -2
- data/lib/dapp/cli/mrproper.rb +22 -0
- data/lib/dapp/cli/push.rb +4 -3
- data/lib/dapp/cli/run.rb +0 -2
- data/lib/dapp/cli/spush.rb +0 -2
- data/lib/dapp/cli/stage_image.rb +24 -0
- data/lib/dapp/cli/stages.rb +7 -5
- data/lib/dapp/cli/stages/cleanup_local.rb +28 -0
- data/lib/dapp/cli/stages/cleanup_repo.rb +24 -0
- data/lib/dapp/cli/stages/{flush.rb → flush_local.rb} +4 -6
- data/lib/dapp/cli/stages/{cleanup.rb → flush_repo.rb} +4 -6
- data/lib/dapp/cli/stages/pull.rb +28 -0
- data/lib/dapp/cli/stages/push.rb +24 -0
- data/lib/dapp/config/application.rb +185 -44
- data/lib/dapp/config/artifact.rb +10 -50
- data/lib/dapp/config/directive/artifact.rb +77 -0
- data/lib/dapp/config/directive/build_dir.rb +9 -0
- data/lib/dapp/config/directive/chef.rb +95 -0
- data/lib/dapp/config/directive/docker/artifact.rb +26 -0
- data/lib/dapp/config/directive/docker/base.rb +91 -0
- data/lib/dapp/config/directive/git_artifact.rb +59 -0
- data/lib/dapp/config/directive/shell/artifact.rb +38 -0
- data/lib/dapp/config/directive/shell/base.rb +85 -0
- data/lib/dapp/config/directive/tmp_dir.rb +36 -0
- data/lib/dapp/config/main.rb +1 -7
- data/lib/dapp/core_ext/hash.rb +21 -0
- data/lib/dapp/docker_registry/base.rb +60 -5
- data/lib/dapp/docker_registry/mod/request.rb +2 -14
- data/lib/dapp/git_artifact.rb +32 -23
- data/lib/dapp/git_repo/base.rb +1 -1
- data/lib/dapp/image/argument.rb +3 -3
- data/lib/dapp/image/docker.rb +13 -16
- data/lib/dapp/image/scratch.rb +29 -0
- data/lib/dapp/image/stage.rb +33 -23
- data/lib/dapp/lock/base.rb +18 -11
- data/lib/dapp/lock/file.rb +18 -16
- data/lib/dapp/prctl.rb +1 -0
- data/lib/dapp/project.rb +22 -9
- data/lib/dapp/project/command/bp.rb +2 -5
- data/lib/dapp/project/command/build.rb +1 -2
- data/lib/dapp/project/command/cleanup.rb +9 -7
- data/lib/dapp/project/command/common.rb +37 -12
- data/lib/dapp/project/command/mrproper.rb +57 -0
- data/lib/dapp/project/command/push.rb +8 -2
- data/lib/dapp/project/command/run.rb +1 -1
- data/lib/dapp/project/command/stage_image.rb +15 -0
- data/lib/dapp/project/command/stages/cleanup_local.rb +100 -0
- data/lib/dapp/project/command/stages/cleanup_repo.rb +65 -0
- data/lib/dapp/project/command/stages/common.rb +48 -0
- data/lib/dapp/project/command/stages/flush_local.rb +24 -0
- data/lib/dapp/project/command/stages/flush_repo.rb +22 -0
- data/lib/dapp/project/command/stages/pull.rb +26 -0
- data/lib/dapp/project/command/stages/push.rb +22 -0
- data/lib/dapp/project/dappfile.rb +3 -1
- data/lib/dapp/project/deps/base.rb +52 -0
- data/lib/dapp/project/deps/gitartifact.rb +36 -0
- data/lib/dapp/project/lock.rb +20 -13
- data/lib/dapp/project/logging/base.rb +20 -3
- data/lib/dapp/project/logging/i18n.rb +25 -0
- data/lib/dapp/project/logging/paint.rb +47 -0
- data/lib/dapp/project/logging/process.rb +17 -10
- data/lib/dapp/project/shellout/base.rb +74 -0
- data/lib/dapp/project/shellout/streaming.rb +49 -0
- data/lib/dapp/project/shellout/system.rb +72 -0
- data/lib/dapp/project/ssh_agent.rb +8 -9
- data/lib/dapp/version.rb +1 -1
- metadata +48 -17
- data/lib/dapp/build/stage/artifact.rb +0 -40
- data/lib/dapp/build/stage/mod/artifact.rb +0 -79
- data/lib/dapp/config/chef.rb +0 -51
- data/lib/dapp/config/docker.rb +0 -82
- data/lib/dapp/config/git_artifact.rb +0 -51
- data/lib/dapp/config/shell.rb +0 -64
- data/lib/dapp/helper/i18n.rb +0 -20
- data/lib/dapp/helper/paint.rb +0 -27
- data/lib/dapp/helper/shellout.rb +0 -63
- data/lib/dapp/helper/streaming.rb +0 -47
- data/lib/dapp/project/command/stages_cleanup.rb +0 -72
- data/lib/dapp/project/command/stages_flush.rb +0 -20
- data/lib/dapp/project/paint.rb +0 -16
data/lib/dapp/project/lock.rb
CHANGED
|
@@ -7,20 +7,27 @@ module Dapp
|
|
|
7
7
|
build_path.join('locks')
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
def
|
|
11
|
-
|
|
10
|
+
def _lock(name)
|
|
11
|
+
@_locks ||= {}
|
|
12
|
+
@_locks[name] ||= ::Dapp::Lock::File.new(lock_path, name)
|
|
13
|
+
end
|
|
12
14
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
def lock(name, *_args, default_timeout: 300, **kwargs, &blk)
|
|
16
|
+
if dry_run?
|
|
17
|
+
yield if block_given?
|
|
18
|
+
else
|
|
19
|
+
timeout = cli_options[:lock_timeout] || default_timeout
|
|
20
|
+
_lock(name).synchronize(
|
|
21
|
+
timeout: timeout,
|
|
22
|
+
on_wait: proc do |&do_wait|
|
|
23
|
+
log_secondary_process(
|
|
24
|
+
t(code: 'process.waiting_resouce_lock', data: { name: name }),
|
|
25
|
+
short: true,
|
|
26
|
+
&do_wait
|
|
27
|
+
)
|
|
28
|
+
end, **kwargs, &blk
|
|
29
|
+
)
|
|
30
|
+
end
|
|
24
31
|
end
|
|
25
32
|
end # Lock
|
|
26
33
|
end # Project
|
|
@@ -17,6 +17,14 @@ module Dapp
|
|
|
17
17
|
cli_options[:log_verbose]
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
+
def introspect_error?
|
|
21
|
+
cli_options[:introspect_error]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def introspect_before_error?
|
|
25
|
+
cli_options[:introspect_before_error]
|
|
26
|
+
end
|
|
27
|
+
|
|
20
28
|
def dry_run?
|
|
21
29
|
cli_options[:dry_run]
|
|
22
30
|
end
|
|
@@ -26,6 +34,13 @@ module Dapp
|
|
|
26
34
|
log(*args, **kwargs)
|
|
27
35
|
end
|
|
28
36
|
|
|
37
|
+
def log_step_with_indent(step)
|
|
38
|
+
log_step(step)
|
|
39
|
+
with_log_indent do
|
|
40
|
+
yield
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
29
44
|
def log_step(*args, **kwargs)
|
|
30
45
|
kwargs[:style] = :step
|
|
31
46
|
log(*args, **kwargs)
|
|
@@ -51,7 +66,7 @@ module Dapp
|
|
|
51
66
|
end
|
|
52
67
|
|
|
53
68
|
def log_time
|
|
54
|
-
|
|
69
|
+
"#{DateTime.now.strftime('%Y-%m-%dT%T%z')} "
|
|
55
70
|
end
|
|
56
71
|
|
|
57
72
|
def log_format_string(str, time: true, indent: true, style: nil)
|
|
@@ -90,8 +105,10 @@ module Dapp
|
|
|
90
105
|
end
|
|
91
106
|
end
|
|
92
107
|
|
|
93
|
-
|
|
94
|
-
|
|
108
|
+
class << self
|
|
109
|
+
def included(base)
|
|
110
|
+
base.extend(self)
|
|
111
|
+
end
|
|
95
112
|
end
|
|
96
113
|
|
|
97
114
|
protected
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Dapp
|
|
2
|
+
class Project
|
|
3
|
+
module Logging
|
|
4
|
+
# I18n
|
|
5
|
+
module I18n
|
|
6
|
+
def self.initialize
|
|
7
|
+
::I18n.load_path << Dir[File.join(Dapp.root, 'config', '**', '*')].select { |path| File.file?(path) }
|
|
8
|
+
::I18n.reload!
|
|
9
|
+
::I18n.locale = :en
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def t(context: nil, **desc)
|
|
13
|
+
code = desc[:code]
|
|
14
|
+
data = desc[:data] || {}
|
|
15
|
+
paths = []
|
|
16
|
+
paths << [:common, context, code].join('.') if context
|
|
17
|
+
paths << [:common, code].join('.')
|
|
18
|
+
::I18n.t(*paths, **data, raise: true)
|
|
19
|
+
rescue ::I18n::MissingTranslationData => _e
|
|
20
|
+
raise ::NetStatus::Exception, code: :missing_translation, data: { code: code }
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end # Helper
|
|
24
|
+
end
|
|
25
|
+
end # Dapp
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module Dapp
|
|
2
|
+
# Project
|
|
3
|
+
class Project
|
|
4
|
+
module Logging
|
|
5
|
+
# Paint
|
|
6
|
+
module Paint
|
|
7
|
+
FORMAT = {
|
|
8
|
+
step: [:yellow, :bold],
|
|
9
|
+
info: [:blue],
|
|
10
|
+
success: [:green, :bold],
|
|
11
|
+
warning: [:red, :bold],
|
|
12
|
+
secondary: [:white, :bold],
|
|
13
|
+
default: [:white]
|
|
14
|
+
}.freeze
|
|
15
|
+
|
|
16
|
+
def self.initialize(mode)
|
|
17
|
+
::Paint.mode = case mode
|
|
18
|
+
when 'auto' then STDOUT.tty? ? 8 : 0
|
|
19
|
+
when 'on' then 8
|
|
20
|
+
when 'off' then 0
|
|
21
|
+
else raise
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def paint_style(name)
|
|
26
|
+
FORMAT[name].tap do |format|
|
|
27
|
+
raise if format.nil?
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def paint_string(object, style_name)
|
|
32
|
+
::Paint[unpaint(object.to_s), *paint_style(style_name)]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def unpaint(str)
|
|
36
|
+
::Paint.unpaint(str)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class << self
|
|
40
|
+
def included(base)
|
|
41
|
+
base.extend(self)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end # Paint
|
|
45
|
+
end
|
|
46
|
+
end # Project
|
|
47
|
+
end # Dapp
|
|
@@ -26,19 +26,26 @@ module Dapp
|
|
|
26
26
|
log "#{formatted_message}#{formatted_status}"
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
# rubocop:disable Metrics/ParameterLists
|
|
30
|
+
def log_process(message, process: nil, short: false, quiet: false, style: {}, status: {}, &blk)
|
|
31
|
+
return yield if quiet
|
|
32
|
+
|
|
30
33
|
style[:message] ||= DEFAULT_STYLE[:message]
|
|
31
34
|
style[:process] ||= DEFAULT_STYLE[:process]
|
|
32
35
|
style[:failed] ||= DEFAULT_STYLE[:failed]
|
|
33
36
|
style[:success] ||= DEFAULT_STYLE[:success]
|
|
34
37
|
|
|
38
|
+
status[:success] ||= t(code: 'status.success.default')
|
|
39
|
+
status[:failed] ||= t(code: 'status.failed.default')
|
|
40
|
+
|
|
35
41
|
if log_verbose? && !short
|
|
36
42
|
process ||= t(code: 'status.process.default')
|
|
37
|
-
log_process_verbose(message, process: process, style: style, &blk)
|
|
43
|
+
log_process_verbose(message, process: process, style: style, status: status, &blk)
|
|
38
44
|
else
|
|
39
|
-
log_process_short(message, style: style, &blk)
|
|
45
|
+
log_process_short(message, style: style, status: status, &blk)
|
|
40
46
|
end
|
|
41
47
|
end
|
|
48
|
+
# rubocop:enable Metrics/ParameterLists
|
|
42
49
|
|
|
43
50
|
def log_secondary_process(message, **kwargs, &blk)
|
|
44
51
|
log_process(message, **kwargs.merge(style: { message: :secondary, success: :secondary }), &blk)
|
|
@@ -46,19 +53,19 @@ module Dapp
|
|
|
46
53
|
|
|
47
54
|
protected
|
|
48
55
|
|
|
49
|
-
def log_process_verbose(message, process:, style: {}, &blk)
|
|
56
|
+
def log_process_verbose(message, process:, style: {}, status: {}, &blk)
|
|
50
57
|
process = paint_string(rjust(process, message), style[:process])
|
|
51
58
|
info = paint_string(message, style[:message]) + process
|
|
52
59
|
success_message = paint_string(slice(message), style[:message]) +
|
|
53
|
-
paint_string(rjust(
|
|
54
|
-
failed_message = paint_string(slice(message) + rjust(
|
|
60
|
+
paint_string(rjust(status[:success], message), style[:success])
|
|
61
|
+
failed_message = paint_string(slice(message) + rjust(status[:failed], message), style[:failed])
|
|
55
62
|
log_process_default(info, success_message, failed_message, &blk)
|
|
56
63
|
end
|
|
57
64
|
|
|
58
|
-
def log_process_short(message, style: {}, &blk)
|
|
65
|
+
def log_process_short(message, style: {}, status: {}, &blk)
|
|
59
66
|
info = "#{paint_string(slice(message), style[:message])} ... "
|
|
60
|
-
success_message = paint_string(rjust(
|
|
61
|
-
failed_message = paint_string(rjust(
|
|
67
|
+
success_message = paint_string(rjust(status[:success], info), style[:success])
|
|
68
|
+
failed_message = paint_string(rjust(status[:failed], info), style[:failed])
|
|
62
69
|
log_process_default(info, success_message, failed_message, inline: true, &blk)
|
|
63
70
|
end
|
|
64
71
|
|
|
@@ -90,7 +97,7 @@ module Dapp
|
|
|
90
97
|
def free_space(str)
|
|
91
98
|
base_time = log_time? ? log_time.length : 0
|
|
92
99
|
indent = log_indent.length
|
|
93
|
-
str =
|
|
100
|
+
str = unpaint(str.to_s).length
|
|
94
101
|
time = 15
|
|
95
102
|
terminal_width - base_time - str - indent - time
|
|
96
103
|
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
module Dapp
|
|
2
|
+
class Project
|
|
3
|
+
# Shellout
|
|
4
|
+
module Shellout
|
|
5
|
+
# Base
|
|
6
|
+
module Base
|
|
7
|
+
include Streaming
|
|
8
|
+
|
|
9
|
+
def shellout(*args, **kwargs)
|
|
10
|
+
env = nil
|
|
11
|
+
|
|
12
|
+
Base.default_env_keys.each do |env_key|
|
|
13
|
+
env_key = env_key.to_s.upcase
|
|
14
|
+
env ||= {}
|
|
15
|
+
env[env_key] = ENV[env_key]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
param_env = (kwargs.delete(:env) || kwargs.delete(:environment))
|
|
19
|
+
param_env = param_env.map { |key, value| [key.to_s.upcase, value.to_s] }.to_h if param_env
|
|
20
|
+
|
|
21
|
+
env = (env || {}).merge(param_env) if param_env
|
|
22
|
+
kwargs[:env] = env if env
|
|
23
|
+
|
|
24
|
+
do_shellout = -> { ::Mixlib::ShellOut.new(*args, timeout: 3600, **kwargs).run_command }
|
|
25
|
+
if defined? ::Bundler
|
|
26
|
+
::Bundler.with_clean_env { do_shellout.call }
|
|
27
|
+
else
|
|
28
|
+
do_shellout.call
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def shellout!(*args, **kwargs)
|
|
33
|
+
shellout_with_logging(**kwargs) do |options|
|
|
34
|
+
shellout(*args, **options).tap(&:error!)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def shellout_pack(command)
|
|
39
|
+
"eval $(#{echo_path} #{Base64.strict_encode64(command)} | base64 --decode)"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class << self
|
|
43
|
+
def included(base)
|
|
44
|
+
base.extend(self)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def default_env_keys
|
|
48
|
+
@default_env_keys ||= []
|
|
49
|
+
end
|
|
50
|
+
end # << self
|
|
51
|
+
|
|
52
|
+
protected
|
|
53
|
+
|
|
54
|
+
def shellout_with_logging(log_verbose: false, **kwargs)
|
|
55
|
+
return yield(**kwargs) unless instance_of? Project
|
|
56
|
+
|
|
57
|
+
begin
|
|
58
|
+
stream = Stream.new
|
|
59
|
+
if log_verbose && log_verbose?
|
|
60
|
+
kwargs[:live_stream] = Proxy::Base.new(stream, STDOUT, with_time: log_time?)
|
|
61
|
+
else
|
|
62
|
+
kwargs[:live_stdout] = Proxy::Base.new(stream, with_time: log_time?)
|
|
63
|
+
end
|
|
64
|
+
kwargs[:live_stderr] = Proxy::Error.new(stream, with_time: log_time?)
|
|
65
|
+
|
|
66
|
+
yield(**kwargs)
|
|
67
|
+
rescue ::Mixlib::ShellOut::ShellCommandFailed => e
|
|
68
|
+
raise Error::Shellout, code: class_to_lowercase(e.class), data: { stream: stream.show }
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end # Helper
|
|
74
|
+
end # Dapp
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module Dapp
|
|
2
|
+
class Project
|
|
3
|
+
module Shellout
|
|
4
|
+
# Streaming
|
|
5
|
+
module Streaming
|
|
6
|
+
# Stream
|
|
7
|
+
class Stream
|
|
8
|
+
def buffer
|
|
9
|
+
@buffer ||= []
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def <<(string)
|
|
13
|
+
buffer << string
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def show
|
|
17
|
+
buffer.join.strip
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Proxy
|
|
22
|
+
module Proxy
|
|
23
|
+
# Base
|
|
24
|
+
class Base
|
|
25
|
+
def initialize(*streams, with_time: false)
|
|
26
|
+
@streams = streams
|
|
27
|
+
@with_time = with_time
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def <<(str)
|
|
31
|
+
@streams.each { |s| s << format_string(str) }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def format_string(str)
|
|
35
|
+
str.lines.map { |l| "#{Project.log_time if @with_time}#{l.strip}\n" }.join
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Error
|
|
40
|
+
class Error < Base
|
|
41
|
+
def format_string(str)
|
|
42
|
+
"#{Project.paint_string(super.strip, :warning)}\n"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end # Helper
|
|
49
|
+
end # Dapp
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
module Dapp
|
|
2
|
+
# Project
|
|
3
|
+
class Project
|
|
4
|
+
module Shellout
|
|
5
|
+
# System
|
|
6
|
+
module System
|
|
7
|
+
SYSTEM_SHELLOUT_IMAGE = 'ubuntu:14.04'.freeze
|
|
8
|
+
SYSTEM_SHELLOUT_VERSION = 2
|
|
9
|
+
|
|
10
|
+
def system_shellout_container_name
|
|
11
|
+
"dapp_system_shellout_#{hashsum [SYSTEM_SHELLOUT_VERSION,
|
|
12
|
+
SYSTEM_SHELLOUT_IMAGE,
|
|
13
|
+
Deps::Base::BASE_VERSION,
|
|
14
|
+
Deps::Gitartifact::GITARTIFACT_VERSION]}"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def system_shellout_container
|
|
18
|
+
@system_shellout_container ||= begin
|
|
19
|
+
lock(system_shellout_container_name) do
|
|
20
|
+
if shellout("docker inspect #{system_shellout_container_name}").exitstatus.nonzero?
|
|
21
|
+
volumes_from = [base_container, gitartifact_container]
|
|
22
|
+
log_secondary_process(t(code: 'process.system_shellout_container_loading'), short: true) do
|
|
23
|
+
shellout! ['docker run --detach --privileged', '--restart always',
|
|
24
|
+
"--name #{system_shellout_container_name}",
|
|
25
|
+
*volumes_from.map { |container| "--volumes-from #{container}" },
|
|
26
|
+
'--volume /:/.system_shellout_root',
|
|
27
|
+
"#{SYSTEM_SHELLOUT_IMAGE} #{bash_path} -ec 'while true ; do sleep 1 ; done'"].join(' ')
|
|
28
|
+
|
|
29
|
+
shellout! ["docker exec #{system_shellout_container_name}",
|
|
30
|
+
"bash -ec '#{[
|
|
31
|
+
'mkdir -p /.system_shellout_root/.dapp',
|
|
32
|
+
'mount --rbind /.dapp /.system_shellout_root/.dapp'
|
|
33
|
+
].join(' && ')}'"].join(' ')
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
system_shellout_container_name
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def system_shellout(command, **kwargs)
|
|
43
|
+
shellout _to_system_shellout_command(command), **kwargs
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def system_shellout!(command, **kwargs)
|
|
47
|
+
shellout! _to_system_shellout_command(command), **kwargs
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
def _to_system_shellout_command(command)
|
|
53
|
+
cmd = shellout_pack ["cd #{Dir.pwd}", command].join(' && ')
|
|
54
|
+
"docker exec #{system_shellout_container} chroot /.system_shellout_root bash -ec '#{[
|
|
55
|
+
*System.default_env_keys.map do |env_key|
|
|
56
|
+
env_key = env_key.to_s.upcase
|
|
57
|
+
"export #{env_key}=#{ENV[env_key]}"
|
|
58
|
+
end, cmd
|
|
59
|
+
].join(' && ')}'"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
public
|
|
63
|
+
|
|
64
|
+
class << self
|
|
65
|
+
def default_env_keys
|
|
66
|
+
@default_env_keys ||= []
|
|
67
|
+
end
|
|
68
|
+
end # << self
|
|
69
|
+
end # System
|
|
70
|
+
end
|
|
71
|
+
end # Project
|
|
72
|
+
end # Dapp
|
|
@@ -5,12 +5,13 @@ module Dapp
|
|
|
5
5
|
module SshAgent
|
|
6
6
|
class << self
|
|
7
7
|
def included(_base)
|
|
8
|
-
::Dapp::
|
|
8
|
+
::Dapp::Project::Shellout::Base.default_env_keys << 'SSH_AUTH_SOCK'
|
|
9
|
+
::Dapp::Project::Shellout::System.default_env_keys << 'SSH_AUTH_SOCK'
|
|
9
10
|
end
|
|
10
11
|
end # << self
|
|
11
12
|
|
|
12
13
|
def run_ssh_agent
|
|
13
|
-
raise
|
|
14
|
+
raise 'Cannot fork dapp process: there are active file locks' unless ::Dapp::Lock::File.counter.zero?
|
|
14
15
|
|
|
15
16
|
sock_name = "dapp-ssh-#{SecureRandom.uuid}"
|
|
16
17
|
|
|
@@ -22,10 +23,10 @@ module Dapp
|
|
|
22
23
|
|
|
23
24
|
@ssh_agent_pid = nil
|
|
24
25
|
|
|
25
|
-
Signal.trap('INT') {
|
|
26
|
+
Signal.trap('INT') {}
|
|
26
27
|
Signal.trap('TERM') { Process.kill('TERM', @ssh_agent_pid) if @ssh_agent_pid }
|
|
27
28
|
|
|
28
|
-
@ssh_agent_pid =
|
|
29
|
+
@ssh_agent_pid = Process.fork do
|
|
29
30
|
STDOUT.reopen '/dev/null', 'a'
|
|
30
31
|
STDERR.reopen '/dev/null', 'a'
|
|
31
32
|
exec 'ssh-agent', '-d', '-a', sock_path
|
|
@@ -36,9 +37,7 @@ module Dapp
|
|
|
36
37
|
|
|
37
38
|
begin
|
|
38
39
|
::Timeout.timeout(10) do
|
|
39
|
-
until File.exist? sock_path
|
|
40
|
-
sleep 0.001
|
|
41
|
-
end
|
|
40
|
+
sleep 0.001 until File.exist? sock_path
|
|
42
41
|
end
|
|
43
42
|
rescue ::Timeout::Error
|
|
44
43
|
raise ::Dapp::Error::Project, code: :cannot_run_ssh_agent
|
|
@@ -47,7 +46,7 @@ module Dapp
|
|
|
47
46
|
end
|
|
48
47
|
|
|
49
48
|
def add_ssh_key(ssh_key_path)
|
|
50
|
-
shellout! "ssh-add #{ssh_key_path}", env: {SSH_AUTH_SOCK: ssh_auth_sock(force_run_agent: true)}
|
|
49
|
+
shellout! "ssh-add #{ssh_key_path}", env: { SSH_AUTH_SOCK: ssh_auth_sock(force_run_agent: true) }
|
|
51
50
|
end
|
|
52
51
|
|
|
53
52
|
def ssh_auth_sock(force_run_agent: false)
|
|
@@ -70,7 +69,7 @@ module Dapp
|
|
|
70
69
|
raise ::Dapp::Error::Project, code: :ssh_key_not_found,
|
|
71
70
|
data: { path: ssh_key } unless File.exist? ssh_key
|
|
72
71
|
|
|
73
|
-
File.chmod
|
|
72
|
+
File.chmod 0o600, ssh_key
|
|
74
73
|
add_ssh_key ssh_key
|
|
75
74
|
end
|
|
76
75
|
end
|