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
@@ -0,0 +1,21 @@
1
+ module Dapp
2
+ module Build
3
+ module Stage
4
+ module InstallGroup
5
+ # GAPostInstallPatch
6
+ class GAPostInstallPatch < GABase
7
+ include Mod::Group
8
+
9
+ def initialize(application, next_stage)
10
+ @prev_stage = GAPostInstallPatchDependencies.new(application, self)
11
+ super
12
+ end
13
+
14
+ def next_g_a_stage
15
+ super.next_stage # GAPreSetupPatch
16
+ end
17
+ end # GAPostInstallPatch
18
+ end
19
+ end # Stage
20
+ end # Build
21
+ end # Dapp
@@ -0,0 +1,21 @@
1
+ module Dapp
2
+ module Build
3
+ module Stage
4
+ module InstallGroup
5
+ # GAPostInstallPatchDependencies
6
+ class GAPostInstallPatchDependencies < GADependenciesBase
7
+ include Mod::Group
8
+
9
+ def initialize(application, next_stage)
10
+ @prev_stage = Install.new(application, self)
11
+ super
12
+ end
13
+
14
+ def dependencies
15
+ [application.builder.before_setup_checksum]
16
+ end
17
+ end # GAPostInstallPatchDependencies
18
+ end
19
+ end # Stage
20
+ end # Build
21
+ end # Dapp
@@ -0,0 +1,21 @@
1
+ module Dapp
2
+ module Build
3
+ module Stage
4
+ module InstallGroup
5
+ # GAPostInstallPatch
6
+ class GAPreInstallPatch < GABase
7
+ include Mod::Group
8
+
9
+ def initialize(application, next_stage)
10
+ @prev_stage = GAPreInstallPatchDependencies.new(application, self)
11
+ super
12
+ end
13
+
14
+ def prev_g_a_stage
15
+ dependencies_stage.prev_stage # GAArchive
16
+ end
17
+ end # GAPostInstallPatch
18
+ end
19
+ end # Stage
20
+ end # Build
21
+ end # Dapp
@@ -0,0 +1,31 @@
1
+ module Dapp
2
+ module Build
3
+ module Stage
4
+ module InstallGroup
5
+ # GAPreInstallPatchDependencies
6
+ class GAPreInstallPatchDependencies < GADependenciesBase
7
+ include Mod::Group
8
+
9
+ def initialize(application, next_stage)
10
+ @prev_stage = GAArchive.new(application, self)
11
+ super
12
+ end
13
+
14
+ def dependencies
15
+ [install_dependencies_files_checksum, application.builder.install_checksum]
16
+ end
17
+
18
+ def empty?
19
+ super || dependencies_empty?
20
+ end
21
+
22
+ private
23
+
24
+ def install_dependencies_files_checksum
25
+ @install_dependencies_files_checksum ||= dependencies_files_checksum(application.config._install_dependencies)
26
+ end
27
+ end # GAPreInstallPatchDependencies
28
+ end
29
+ end # Stage
30
+ end # Build
31
+ end # Dapp
@@ -0,0 +1,31 @@
1
+ module Dapp
2
+ module Build
3
+ module Stage
4
+ module InstallGroup
5
+ # Install
6
+ class Install < Base
7
+ include Mod::Group
8
+
9
+ def initialize(application, next_stage)
10
+ @prev_stage = GAPreInstallPatch.new(application, self)
11
+ super
12
+ end
13
+
14
+ def empty?
15
+ super && !application.builder.install?
16
+ end
17
+
18
+ def dependencies
19
+ prev_stage.prev_stage.dependencies # GAPreInstallPatchDependencies
20
+ end
21
+
22
+ def image
23
+ super do |image|
24
+ application.builder.install(image)
25
+ end
26
+ end
27
+ end # Install
28
+ end
29
+ end # Stage
30
+ end # Build
31
+ end # Dapp
@@ -7,15 +7,14 @@ module Dapp
7
7
  module Artifact
8
8
  def artifacts
9
9
  @artifacts ||= begin
10
- verbose = application.log_verbose?
11
10
  application.config._artifact.map do |artifact|
12
- process = application.t(code: 'process.artifact_building', data: { name: artifact._config._name })
13
- application.log_secondary_process(process, short: !verbose) do
14
- application.with_log_indent do
11
+ process = application.project.t(code: 'process.artifact_building', data: { name: artifact._config._name })
12
+ application.project.log_secondary_process(process, short: !application.project.log_verbose?) do
13
+ application.project.with_log_indent do
15
14
  {
16
15
  name: artifact._config._name,
17
16
  options: artifact._artifact_options,
18
- app: Application.new(artifact_app_options(artifact, verbose)).tap(&:build!)
17
+ app: application.artifact(artifact._config).tap(&:build!)
19
18
  }
20
19
  end
21
20
  end
@@ -23,22 +22,13 @@ module Dapp
23
22
  end
24
23
  end
25
24
 
26
- def artifact_app_options(artifact, verbose)
27
- {
28
- config: artifact._config,
29
- cli_options: application.cli_options.merge(log_quiet: !verbose),
30
- ignore_git_fetch: application.ignore_git_fetch,
31
- is_artifact: true
32
- }
33
- end
34
-
35
25
  def artifacts_signatures
36
26
  artifacts.map { |artifact| hashsum [artifact[:app].signature, artifact[:options]] }
37
27
  end
38
28
 
39
29
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
40
30
  def apply_artifact(artifact, image)
41
- return if application.dry_run?
31
+ return if application.project.dry_run?
42
32
 
43
33
  artifact_name = artifact[:name]
44
34
  app = artifact[:app]
@@ -52,8 +42,9 @@ module Dapp
52
42
  "--volume #{application.tmp_path('artifact', artifact_name)}:#{app.container_tmp_path(artifact_name)}",
53
43
  '--entrypoint /bin/bash']
54
44
  commands = safe_cp(where_to_add, app.container_tmp_path(artifact_name), Process.uid, Process.gid)
55
- application.log_secondary_process(application.t(code: 'process.artifact_copy', data: { name: artifact_name }), short: true) do
56
- app.run(docker_options, [%(-ec '#{application.shellout_pack(commands)}')])
45
+ application.project.log_secondary_process(application.project.t(code: 'process.artifact_copy',
46
+ data: { name: artifact_name }), short: true) do
47
+ app.run(docker_options, [%(-ec '#{application.project.shellout_pack(commands)}')])
57
48
  end
58
49
 
59
50
  commands = safe_cp(application.container_tmp_path('artifact', artifact_name), where_to_add, owner, group, cwd, paths)
@@ -68,8 +59,7 @@ module Dapp
68
59
  credentials += "-o #{owner} " if owner
69
60
  credentials += "-g #{group} " if group
70
61
 
71
- copy_files = proc do |from_, cwd_, path_ = ''|
72
- cwd_ = File.expand_path(File.join('/', cwd_))
62
+ copy_files = lambda do |from_, cwd_, path_ = ''|
73
63
  "find #{File.join(from_, cwd_, path_)} -type f -exec bash -ec 'install -D #{credentials} {} " \
74
64
  "#{File.join(to, "$(echo {} | sed -e \"s/#{File.join(from_, cwd_).gsub('/', '\\/')}//g\")")}' \\;"
75
65
  end
@@ -0,0 +1,42 @@
1
+ module Dapp
2
+ module Build
3
+ module Stage
4
+ # Mod
5
+ module Mod
6
+ # Group
7
+ module Group
8
+ def log_image_build
9
+ return super if should_be_quiet?
10
+ log_group_name if group_should_be_opened?
11
+ application.project.with_log_indent { super }
12
+ end
13
+
14
+ def log_group_name
15
+ application.project.log_step(application.project.t(code: group_name, context: :group))
16
+ end
17
+
18
+ def group_name
19
+ class_to_lowercase(self.class.name.split('::')[-2])
20
+ end
21
+
22
+ def group_should_be_opened?
23
+ !group_opened? && image_should_be_build?
24
+ end
25
+
26
+ def group_opened?
27
+ return false if prev_group_stage.nil?
28
+ prev_group_stage.group_opened? || prev_group_stage.image_should_be_build?
29
+ end
30
+
31
+ def prev_group_stage
32
+ prev_stage if prev_stage.respond_to?(:group_name) && prev_stage.group_name == group_name
33
+ end
34
+
35
+ def log_name_context
36
+ [super, group_name].join('.')
37
+ end
38
+ end
39
+ end # Mod
40
+ end # Stage
41
+ end # Build
42
+ end # Dapp
@@ -5,42 +5,74 @@ module Dapp
5
5
  module Mod
6
6
  # Logging
7
7
  module Logging
8
+ def log_image_build(&image_build)
9
+ if empty? then log_state(:empty)
10
+ elsif image.tagged? then log_state(:using_cache)
11
+ elsif should_be_not_present? then log_state(:not_present)
12
+ elsif application.project.dry_run? then log_state(:build, styles: { status: :success })
13
+ else log_image_build_process(&image_build)
14
+ end
15
+ ensure
16
+ log_build
17
+ end
18
+
8
19
  def log_build
9
- application.with_log_indent do
10
- application.log_info application.t(code: 'image.signature', data: { signature: image_name })
11
- unless empty?
12
- log_image_info
13
- log_image_commands unless ignore_log_commands?
14
- end
15
- end if application.log? && application.log_verbose?
20
+ application.project.with_log_indent do
21
+ application.project.log_info application.project.t(code: 'image.signature', data: { signature: image_name })
22
+ log_image_details unless empty?
23
+ end if application.project.log_verbose? && !should_be_quiet?
24
+ end
25
+
26
+ def log_image_details
27
+ if image.tagged?
28
+ log_image_created_at
29
+ log_image_size
30
+ end
31
+ log_image_commands unless ignore_log_commands?
32
+ end
33
+
34
+ def log_image_created_at
35
+ application.project.log_info application.project.t(code: 'image.info.created_at',
36
+ data: { value: Time.parse(image.created_at).localtime })
37
+ end
38
+
39
+ def log_image_size
40
+ if from_image.tagged? && !prev_stage.nil?
41
+ size = image.size.to_f - from_image.size.to_f
42
+ code = 'image.info.difference'
43
+ else
44
+ size = image.size
45
+ code = 'image.info.size'
46
+ end
47
+ application.project.log_info application.project.t(code: code, data: { value: size.to_f.round(2) })
16
48
  end
17
49
 
18
50
  def log_image_commands
19
51
  return if (bash_commands = image.send(:bash_commands)).empty?
20
- application.log_info application.t(code: 'image.commands')
21
- application.with_log_indent { application.log_info bash_commands.join("\n") }
52
+ application.project.log_info application.project.t(code: 'image.commands')
53
+ application.project.with_log_indent { application.project.log_info bash_commands.join("\n") }
22
54
  end
23
55
 
24
- def log_image_info
25
- return unless image.tagged?
26
- date, size = image_info
27
- application.log_info application.t(code: 'image.info.date', data: { value: date })
28
- size_code = size_difference? ? 'image.info.difference' : 'image.info.size'
29
- application.log_info application.t(code: size_code, data: { value: size })
56
+ def log_name
57
+ application.project.t(code: name, context: log_name_context)
30
58
  end
31
59
 
32
- def image_info
33
- date, size = image.info
34
- if size_difference?
35
- _date, from_size = from_image.info
36
- size = size.to_f - from_size.to_f
37
- end
60
+ def log_name_context
61
+ :stage
62
+ end
38
63
 
39
- [Time.parse(date).localtime, size.to_f.round(2)]
64
+ def log_state(state_code, styles: {})
65
+ application.project.log_state(log_name,
66
+ state: application.project.t(code: state_code, context: 'state'),
67
+ styles: styles) unless should_be_quiet?
40
68
  end
41
69
 
42
- def size_difference?
43
- from_image.tagged? && !prev_stage.nil?
70
+ def log_image_build_process
71
+ return yield if should_be_quiet?
72
+ application.project.log_process(log_name, process: application.project.t(code: 'status.process.building'),
73
+ short: should_not_be_detailed?) do
74
+ yield
75
+ end
44
76
  end
45
77
 
46
78
  def ignore_log_commands?
@@ -48,7 +80,7 @@ module Dapp
48
80
  end
49
81
 
50
82
  def should_be_skipped?
51
- image.tagged? && !application.log_verbose? && application.cli_options[:introspect_stage].nil?
83
+ image.tagged? && !application.project.log_verbose? && application.project.cli_options[:introspect_stage].nil?
52
84
  end
53
85
 
54
86
  def should_not_be_detailed?
@@ -56,7 +88,11 @@ module Dapp
56
88
  end
57
89
 
58
90
  def should_be_introspected?
59
- application.cli_options[:introspect_stage] == name && !application.dry_run? && !application.is_artifact
91
+ application.project.cli_options[:introspect_stage] == name && !application.project.dry_run? && !application.is_artifact
92
+ end
93
+
94
+ def should_be_quiet?
95
+ application.is_artifact && !application.project.log_verbose?
60
96
  end
61
97
  end
62
98
  end # Mod
@@ -0,0 +1,37 @@
1
+ module Dapp
2
+ module Build
3
+ module Stage
4
+ module SetupGroup
5
+ # ChefCookbooks
6
+ class ChefCookbooks < Base
7
+ include Mod::Group
8
+
9
+ def initialize(application, next_stage)
10
+ @prev_stage = Setup.new(application, self)
11
+ super
12
+ end
13
+
14
+ def dependencies
15
+ [application.builder.chef_cookbooks_checksum]
16
+ end
17
+
18
+ def image
19
+ super do |image|
20
+ application.builder.chef_cookbooks(image)
21
+ end
22
+ end
23
+
24
+ protected
25
+
26
+ def should_not_be_detailed?
27
+ true
28
+ end
29
+
30
+ def ignore_log_commands?
31
+ true
32
+ end
33
+ end # ChefCookbooks
34
+ end
35
+ end # Stage
36
+ end # Build
37
+ end # Dapp
@@ -0,0 +1,25 @@
1
+ module Dapp
2
+ module Build
3
+ module Stage
4
+ module SetupGroup
5
+ # GAPostSetupPatch
6
+ class GAPostSetupPatch < GABase
7
+ include Mod::Group
8
+
9
+ def initialize(application, next_stage)
10
+ @prev_stage = GAPostSetupPatchDependencies.new(application, self)
11
+ super
12
+ end
13
+
14
+ def prev_g_a_stage
15
+ super.prev_stage # GAPreSetupPatch
16
+ end
17
+
18
+ def next_g_a_stage
19
+ next_stage # GALatestPatch
20
+ end
21
+ end # GAPostSetupPatch
22
+ end
23
+ end # Stage
24
+ end # Build
25
+ end # Dapp
@@ -0,0 +1,31 @@
1
+ module Dapp
2
+ module Build
3
+ module Stage
4
+ module SetupGroup
5
+ # GAPostSetupPatchDependencies
6
+ class GAPostSetupPatchDependencies < GADependenciesBase
7
+ include Mod::Group
8
+
9
+ MAX_PATCH_SIZE = 1024 * 1024
10
+
11
+ def initialize(application, next_stage)
12
+ @prev_stage = ChefCookbooks.new(application, self)
13
+ super
14
+ end
15
+
16
+ def dependencies
17
+ [(changes_size_since_g_a_pre_setup_patch / MAX_PATCH_SIZE).to_i]
18
+ end
19
+
20
+ private
21
+
22
+ def changes_size_since_g_a_pre_setup_patch
23
+ application.git_artifacts.map do |git_artifact|
24
+ git_artifact.patch_size(prev_stage.prev_stage.prev_stage.layer_commit(git_artifact), git_artifact.latest_commit)
25
+ end.reduce(0, :+)
26
+ end
27
+ end # GAPostSetupPatchDependencies
28
+ end
29
+ end # Stage
30
+ end # Build
31
+ end # Dapp