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,25 @@
1
+ module Dapp
2
+ module Build
3
+ module Stage
4
+ module SetupGroup
5
+ # GAPrePatch
6
+ class GAPreSetupPatch < GABase
7
+ include Mod::Group
8
+
9
+ def initialize(application, next_stage)
10
+ @prev_stage = GAPreSetupPatchDependencies.new(application, self)
11
+ super
12
+ end
13
+
14
+ def prev_g_a_stage
15
+ super.prev_stage # GAPostInstallPatch
16
+ end
17
+
18
+ def next_g_a_stage
19
+ super.next_stage # GAPostSetupPatch
20
+ end
21
+ end # GAPrePatch
22
+ end
23
+ end # Stage
24
+ end # Build
25
+ end # Dapp
@@ -0,0 +1,27 @@
1
+ module Dapp
2
+ module Build
3
+ module Stage
4
+ module SetupGroup
5
+ # GAPreSetupPatchDependencies
6
+ class GAPreSetupPatchDependencies < GADependenciesBase
7
+ include Mod::Group
8
+
9
+ def initialize(application, next_stage)
10
+ @prev_stage = BeforeSetup.new(application, self)
11
+ super
12
+ end
13
+
14
+ def dependencies
15
+ [setup_dependencies_files_checksum, application.builder.setup_checksum]
16
+ end
17
+
18
+ private
19
+
20
+ def setup_dependencies_files_checksum
21
+ @setup_files_checksum ||= dependencies_files_checksum(application.config._setup_dependencies)
22
+ end
23
+ end # GAPreSetupPatchDependencies
24
+ end
25
+ end # Stage
26
+ end # Build
27
+ end # Dapp
@@ -0,0 +1,31 @@
1
+ module Dapp
2
+ module Build
3
+ module Stage
4
+ module SetupGroup
5
+ # Setup
6
+ class Setup < Base
7
+ include Mod::Group
8
+
9
+ def initialize(application, next_stage)
10
+ @prev_stage = GAPreSetupPatch.new(application, self)
11
+ super
12
+ end
13
+
14
+ def empty?
15
+ super && !application.builder.setup?
16
+ end
17
+
18
+ def dependencies
19
+ prev_stage.prev_stage.dependencies # GAPreSetupPatchDependencies
20
+ end
21
+
22
+ def image
23
+ super do |image|
24
+ application.builder.setup(image)
25
+ end
26
+ end
27
+ end # Setup
28
+ end
29
+ end # Stage
30
+ end # Build
31
+ end # Dapp
@@ -8,27 +8,30 @@ module Dapp
8
8
  @application = application
9
9
  end
10
10
 
11
- def infra_install?
11
+ def before_application_export
12
+ end
13
+
14
+ def before_install?
12
15
  false
13
16
  end
14
17
 
15
- def infra_install(_image)
18
+ def before_install(_image)
16
19
  raise
17
20
  end
18
21
 
19
- def infra_install_checksum
22
+ def before_install_checksum
20
23
  raise
21
24
  end
22
25
 
23
- def infra_setup?
26
+ def before_setup?
24
27
  false
25
28
  end
26
29
 
27
- def infra_setup(_image)
30
+ def before_setup(_image)
28
31
  raise
29
32
  end
30
33
 
31
- def infra_setup_checksum
34
+ def before_setup_checksum
32
35
  raise
33
36
  end
34
37
 
@@ -11,18 +11,28 @@ module Dapp
11
11
 
12
12
  DEFAULT_CHEFDK_IMAGE = 'dappdeps/chefdk:0.17.3-1'.freeze # TODO: config, DSL, DEFAULT_CHEFDK_IMAGE
13
13
 
14
- [:infra_install, :infra_setup, :install, :setup].each do |stage|
15
- define_method("#{stage}_checksum") do
16
- application.hashsum [stage_cookbooks_checksum(stage), *stage_cookbooks_runlist(stage)]
14
+ def before_application_export
15
+ super
16
+
17
+ %i(before_install install before_setup setup chef_cookbooks).each do |stage|
18
+ raise ::Dapp::Error::Application, code: :cookbooks_stage_checksum_not_caclculated,
19
+ data: { stage: stage } unless stage_cookbooks_checksum_path(stage).exist?
17
20
  end
21
+ end
22
+
23
+ %i(before_install install before_setup setup).each do |stage|
24
+ define_method("#{stage}_checksum") { stage_cookbooks_checksum(stage) }
18
25
 
19
26
  define_method("#{stage}?") { !stage_empty?(stage) }
20
27
 
21
- define_method("#{stage}") do |image|
28
+ define_method(stage.to_s) do |image|
22
29
  unless stage_empty?(stage)
23
30
  image.add_volumes_from(chefdk_container)
31
+ image.add_command 'export PATH=/.dapp/deps/chefdk/bin:$PATH',
32
+ "export DAPP_BUILD_STAGE=#{stage}"
33
+
24
34
  image.add_volume "#{stage_build_path(stage)}:#{container_stage_build_path(stage)}:ro"
25
- image.add_command ['/.dapp/deps/chefdk/bin/chef-solo',
35
+ image.add_command ['chef-solo',
26
36
  '--legacy-mode',
27
37
  "-c #{container_stage_config_path(stage)}",
28
38
  "-o #{stage_cookbooks_runlist(stage).join(',')}"].join(' ')
@@ -35,10 +45,10 @@ module Dapp
35
45
  end
36
46
 
37
47
  def chef_cookbooks(image)
38
- image.add_volume "#{cookbooks_vendor_path(chef_cookbooks_stage: true)}:#{application.container_dapp_path('chef_vendored_cookbooks')}"
48
+ image.add_volume "#{cookbooks_vendor_path}:#{application.container_dapp_path('chef_cookbooks')}"
39
49
  image.add_command(
40
50
  'mkdir -p /usr/share/dapp/chef_repo',
41
- ["cp -a #{application.container_dapp_path('chef_vendored_cookbooks')} ",
51
+ ["cp -a #{application.container_dapp_path('chef_cookbooks')} ",
42
52
  '/usr/share/dapp/chef_repo/cookbooks'].join
43
53
  )
44
54
  end
@@ -78,11 +88,11 @@ module Dapp
78
88
  end
79
89
 
80
90
  def berksfile_lock_checksum
81
- application.hashsum berksfile_lock_path.read if berksfile_lock_path.exist?
91
+ application.hashsum(berksfile_lock_path.read) if berksfile_lock_path.exist?
82
92
  end
83
93
 
84
94
  def stage_cookbooks_checksum_path(stage)
85
- application.build_path("#{cookbooks_checksum}.#{stage}.checksum")
95
+ application.build_path.join("#{cookbooks_checksum}.#{stage}.checksum")
86
96
  end
87
97
 
88
98
  def stage_cookbooks_checksum(stage)
@@ -90,18 +100,28 @@ module Dapp
90
100
  stage_cookbooks_checksum_path(stage).read.strip
91
101
  else
92
102
  checksum = if stage == :chef_cookbooks
93
- cookbooks_checksum
103
+ paths = Dir[cookbooks_vendor_path('**/*')].map(&Pathname.method(:new))
104
+
105
+ application.hashsum [
106
+ application.paths_content_hashsum(paths),
107
+ *paths.map { |p| p.relative_path_from(cookbooks_vendor_path).to_s }.sort
108
+ ]
94
109
  else
95
110
  paths = Dir[stage_cookbooks_path(stage, '**/*')].map(&Pathname.method(:new))
96
111
 
97
112
  application.hashsum [
98
113
  application.paths_content_hashsum(paths),
99
114
  *paths.map { |p| p.relative_path_from(stage_cookbooks_path(stage)).to_s }.sort,
100
- stage == :infra_install ? chefdk_image : nil
115
+ *enabled_modules,
116
+ stage == :before_install ? chefdk_image : nil
101
117
  ].compact
102
118
  end
103
119
 
104
- stage_cookbooks_checksum_path(stage).write "#{checksum}\n"
120
+ stage_cookbooks_checksum_path(stage).tap do |path|
121
+ path.parent.mkpath
122
+ path.write "#{checksum}\n"
123
+ end
124
+
105
125
  checksum
106
126
  end
107
127
  end
@@ -109,21 +129,20 @@ module Dapp
109
129
  def cookbooks_checksum
110
130
  @cookbooks_checksum ||= begin
111
131
  paths = berksfile
112
- .local_cookbooks
113
- .values
114
- .map { |cookbook| cookbook[:path] }
115
- .product(LOCAL_COOKBOOK_CHECKSUM_PATTERNS)
116
- .map { |cb, dir| Dir[cb.join(dir)] }
117
- .flatten
118
- .map(&Pathname.method(:new))
132
+ .local_cookbooks
133
+ .values
134
+ .map { |cookbook| cookbook[:path] }
135
+ .product(LOCAL_COOKBOOK_CHECKSUM_PATTERNS)
136
+ .map { |cb, dir| Dir[cb.join(dir)] }
137
+ .flatten
138
+ .map(&Pathname.method(:new))
119
139
 
120
140
  application.hashsum [
121
141
  application.paths_content_hashsum(paths),
122
142
  *paths.map { |p| p.relative_path_from(berksfile.home_path).to_s }.sort,
123
- berksfile_lock_checksum,
124
- *enabled_recipes,
143
+ (berksfile_lock_checksum unless application.project.cli_options[:dev]),
125
144
  *enabled_modules
126
- ]
145
+ ].compact
127
146
  end
128
147
  end
129
148
 
@@ -137,9 +156,9 @@ module Dapp
137
156
 
138
157
  def chefdk_container
139
158
  @chefdk_container ||= begin
140
- if application.shellout("docker inspect #{chefdk_container_name}").exitstatus.nonzero?
141
- application.log_secondary_process(application.t(code: 'process.chefdk_container_loading'), short: true) do
142
- application.shellout(
159
+ if application.project.shellout("docker inspect #{chefdk_container_name}").exitstatus.nonzero?
160
+ application.project.log_secondary_process(application.project.t(code: 'process.chefdk_loading'), short: true) do
161
+ application.project.shellout(
143
162
  ['docker run',
144
163
  '--restart=no',
145
164
  "--name #{chefdk_container_name}",
@@ -148,91 +167,97 @@ module Dapp
148
167
  )
149
168
  end
150
169
  end
170
+
151
171
  chefdk_container_name
152
172
  end
153
173
  end
154
174
 
155
175
  # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
156
- def install_cookbooks(dest_path, chef_cookbooks_stage: false)
176
+ def install_cookbooks
157
177
  volumes_from = chefdk_container
158
- application.log_secondary_process(application.t(code: "process.#{chef_cookbooks_stage ? 'chef_cookbooks_stage_berks_vendor' : 'berks_vendor'}")) do
159
- ssh_auth_socket_path = nil
160
- ssh_auth_socket_path = Pathname.new(ENV['SSH_AUTH_SOCK']).expand_path if ENV['SSH_AUTH_SOCK'] && File.exist?(ENV['SSH_AUTH_SOCK'])
178
+ application.project.log_secondary_process(application.project.t(code: 'process.berks_vendor')) do
179
+ before_vendor_commands = [].tap do |commands|
180
+ unless application.project.cli_options[:dev]
181
+ commands.push(
182
+ ['if [ ! -f Berksfile.lock ] ; then ',
183
+ 'echo "Berksfile.lock not found" 1>&2 ; ',
184
+ 'exit 1 ; ',
185
+ 'fi'].join
186
+ )
187
+ end
188
+ end
161
189
 
162
- before_berks_vendor = [
190
+ after_vendor_commands = [].tap do |commands|
191
+ if application.project.cli_options[:dev]
192
+ commands.push(
193
+ ["install -o #{Process.uid} -g #{Process.gid} --mode $(stat -c %a Berksfile.lock) ",
194
+ "Berksfile.lock #{berksfile_lock_path}"].join
195
+ )
196
+ else
197
+ commands.push(
198
+ "export LOCKDIFF=$(diff -u1 Berksfile.lock #{berksfile_lock_path})",
199
+ ['if [ "$LOCKDIFF" != "" ] ; then ',
200
+ 'echo -e "Bad Berksfile.lock\n$LOCKDIFF" 1>&2 ; ',
201
+ 'exit 1 ; ',
202
+ 'fi'].join
203
+ )
204
+ end
205
+ end
206
+
207
+ vendor_commands = [
163
208
  'mkdir -p ~/.ssh',
164
209
  'echo "Host *" >> ~/.ssh/config',
165
210
  'echo " StrictHostKeyChecking no" >> ~/.ssh/config',
166
- ('if [ ! -f Berksfile.lock ] ; then echo "Berksfile.lock not found" 2>&2 ; exit 1 ; fi' unless chef_cookbooks_stage),
167
- 'if [ -f Berksfile.lock ] ; then cp -a Berksfile.lock /tmp/Berksfile.lock.orig ; fi'
168
- ]
169
-
170
- after_berks_vendor = []
171
- if chef_cookbooks_stage
172
- after_berks_vendor.concat [
173
- 'cp -a /tmp/Berksfile.lock.orig Berksfile.lock'
174
- ]
175
- else
176
- after_berks_vendor.concat [
177
- 'export LOCKDIFF=$(diff -u0 Berksfile.lock /tmp/Berksfile.lock.orig)',
178
- ['if [ "$LOCKDIFF" != "" ] ; then ',
179
- 'cp -a /tmp/Berksfile.lock.orig Berksfile.lock ; ',
180
- 'echo -e "Bad Berksfile.lock\n$LOCKDIFF" 1>&2 ; exit 1 ; fi'].join
181
- ]
182
- end
183
-
184
- move_cookbooks = [
185
- ["find /tmp/vendored_cookbooks -type d -exec bash -ec '",
211
+ *berksfile.local_cookbooks
212
+ .values
213
+ .map { |cookbook| "rsync --archive --relative #{cookbook[:path]} /tmp/local_cookbooks" },
214
+ "cd /tmp/local_cookbooks/#{berksfile_path.parent}",
215
+ *before_vendor_commands,
216
+ '/.dapp/deps/chefdk/bin/berks vendor /tmp/cookbooks',
217
+ *after_vendor_commands,
218
+ ["find /tmp/cookbooks -type d -exec bash -ec '",
186
219
  "install -o #{Process.uid} -g #{Process.gid} --mode $(stat -c %a {}) -d ",
187
- "#{dest_path}/$(echo {} | sed -e \"s/^\\/tmp\\/vendored_cookbooks//\")' \\;"].join,
188
- ["find /tmp/vendored_cookbooks -type f -exec bash -ec '",
220
+ "#{_cookbooks_vendor_path}/$(echo {} | sed -e \"s/^\\/tmp\\/cookbooks//\")' \\;"].join,
221
+ ["find /tmp/cookbooks -type f -exec bash -ec '",
189
222
  "install -o #{Process.uid} -g #{Process.gid} --mode $(stat -c %a {}) {} ",
190
- "#{dest_path}/$(echo {} | sed -e \"s/\\/tmp\\/vendored_cookbooks//\")' \\;"].join
223
+ "#{_cookbooks_vendor_path}/$(echo {} | sed -e \"s/\\/tmp\\/cookbooks//\")' \\;"].join,
224
+ "install -o #{Process.uid} -g #{Process.gid} --mode 0644 <(date +%s.%N) #{_cookbooks_vendor_path.join('.created_at')}"
191
225
  ]
192
226
 
193
- vendor_commands = [
194
- *before_berks_vendor.compact,
195
- "/.dapp/deps/chefdk/bin/berks vendor /tmp/vendored_cookbooks",
196
- *after_berks_vendor.compact,
197
- *move_cookbooks.compact
198
- ]
199
-
200
- application.shellout!(
227
+ application.project.shellout!(
201
228
  ['docker run --rm',
202
- ("--volume #{ssh_auth_socket_path}:#{ssh_auth_socket_path}" if ssh_auth_socket_path),
203
- "--volume #{dest_path.tap(&:mkpath)}:#{dest_path}",
229
+ "--volumes-from #{volumes_from}",
204
230
  *berksfile.local_cookbooks
205
231
  .values
206
232
  .map { |cookbook| "--volume #{cookbook[:path]}:#{cookbook[:path]}" },
207
- "--volumes-from #{volumes_from}",
208
- "--workdir #{berksfile_path.parent}",
209
- ("--env SSH_AUTH_SOCK=#{ssh_auth_socket_path}" if ssh_auth_socket_path),
210
- ('--env DAPP_CHEF_COOKBOOKS_VENDORING=1' if chef_cookbooks_stage),
211
- "dappdeps/berksdeps:0.1.0 bash -ec '#{application.shellout_pack(vendor_commands.join(' && '))}'"].compact.join(' '),
212
- log_verbose: application.log_verbose?
233
+ ("--volume #{application.project.ssh_auth_sock}:#{application.project.ssh_auth_sock}" if application.project.ssh_auth_sock),
234
+ "--volume #{_cookbooks_vendor_path.tap(&:mkpath)}:#{_cookbooks_vendor_path}",
235
+ ("--env SSH_AUTH_SOCK=#{application.project.ssh_auth_sock}" if application.project.ssh_auth_sock),
236
+ "dappdeps/berksdeps:0.1.0 bash -ec '#{application.project.shellout_pack(vendor_commands.join(' && '))}'"].compact.join(' '),
237
+ log_verbose: application.project.log_verbose?
213
238
  )
214
239
  end
215
240
  end
216
241
  # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
217
242
 
218
- def _cookbooks_vendor_path(chef_cookbooks_stage: false)
219
- application.tmp_path(
220
- application.config._name,
221
- ['cookbooks',
222
- chef_cookbooks_stage ? 'chef_cookbooks_stage' : nil,
223
- cookbooks_checksum].compact.join('.')
224
- )
243
+ def _cookbooks_vendor_path
244
+ application.build_path.join('cookbooks', cookbooks_checksum)
225
245
  end
226
246
 
227
- def cookbooks_vendor_path(*path, chef_cookbooks_stage: false)
228
- _cookbooks_vendor_path(chef_cookbooks_stage: chef_cookbooks_stage).tap do |cookbooks_path|
229
- install_cookbooks(cookbooks_path, chef_cookbooks_stage: chef_cookbooks_stage) unless cookbooks_path.exist?
247
+ def cookbooks_vendor_path(*path)
248
+ _cookbooks_vendor_path.tap do |cookbooks_path|
249
+ application.project.lock("#{application.config._basename}.cookbooks.#{cookbooks_checksum}", default_timeout: 120) do
250
+ @install_cookbooks ||= begin
251
+ install_cookbooks unless _cookbooks_vendor_path.join('.created_at').exist? && !application.project.cli_options[:dev]
252
+ true
253
+ end
254
+ end
230
255
  end.join(*path)
231
256
  end
232
257
 
233
258
  # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
234
259
  def install_stage_cookbooks(stage)
235
- select_existing_paths = proc do |cookbook_path, paths|
260
+ select_existing_paths = ->(cookbook_path, paths) do
236
261
  paths.select { |from, _| cookbook_path.join(from).exist? }
237
262
  end
238
263
 
@@ -250,9 +275,8 @@ module Dapp
250
275
  mdapp_enabled = is_mdapp && enabled_modules.include?(mdapp_name)
251
276
 
252
277
  paths = if is_project
253
- recipe_paths = enabled_recipes
254
- .map { |recipe| ["recipes/#{stage}/#{recipe}.rb", "recipes/#{recipe}.rb"] }
255
- .select { |from, _| cookbook_path.join(from).exist? }
278
+ recipe_paths = enabled_recipes.map { |recipe| ["recipes/#{stage}/#{recipe}.rb", "recipes/#{recipe}.rb"] }
279
+ .select { |from, _| cookbook_path.join(from).exist? }
256
280
 
257
281
  common_project_paths = select_existing_paths.call(
258
282
  cookbook_path, [*common_paths,
@@ -279,7 +303,7 @@ module Dapp
279
303
  else
280
304
  [nil, *common_mdapp_paths]
281
305
  end
282
- elsif !is_mdapp
306
+ else
283
307
  [['.', '.']]
284
308
  end
285
309
 
@@ -328,41 +352,38 @@ module Dapp
328
352
  @stage_cookbooks_runlist[stage] ||= begin
329
353
  res = []
330
354
 
331
- does_entry_exist = proc do |cookbook, entrypoint|
355
+ does_entry_exist = lambda do |cookbook, entrypoint|
332
356
  stage_cookbooks_path(stage, cookbook, 'recipes', "#{entrypoint}.rb").exist?
333
357
  end
334
358
 
335
- format_entry = proc do |cookbook, entrypoint|
359
+ format_entry = lambda do |cookbook, entrypoint|
336
360
  entrypoint = 'void' if entrypoint.nil?
337
361
  "#{cookbook}::#{entrypoint}"
338
362
  end
339
363
 
340
- enabled_modules
341
- .map do |mod|
342
- cookbook = "mdapp-#{mod}"
343
- if does_entry_exist[cookbook, stage]
344
- [cookbook, stage]
345
- else
346
- [cookbook, nil]
347
- end
364
+ enabled_modules.map do |mod|
365
+ cookbook = "mdapp-#{mod}"
366
+ if does_entry_exist[cookbook, stage]
367
+ [cookbook, stage]
368
+ else
369
+ [cookbook, nil]
348
370
  end
349
- .tap { |entries| res.concat entries }
350
-
351
- enabled_recipes
352
- .map { |recipe| [project_name, recipe] }
353
- .select { |entry| does_entry_exist[*entry] }
354
- .tap do |entries|
355
- if entries.any?
356
- res.concat entries
357
- else
358
- res << [project_name, nil]
359
- end
371
+ end.tap { |entries| res.concat entries }
372
+
373
+ enabled_recipes.map { |recipe| [project_name, recipe] }
374
+ .select { |entry| does_entry_exist[*entry] }
375
+ .tap do |entries|
376
+ if entries.any?
377
+ res.concat entries
378
+ else
379
+ res << [project_name, nil]
360
380
  end
381
+ end
361
382
 
362
383
  if res.all? { |_, entrypoint| entrypoint.nil? }
363
384
  []
364
385
  else
365
- res.map &format_entry
386
+ res.map(&format_entry)
366
387
  end
367
388
  end
368
389
  end
@@ -377,7 +398,7 @@ module Dapp
377
398
  end
378
399
 
379
400
  def stage_cookbooks_path(stage, *path)
380
- _stage_cookbooks_path(stage).tap do |cookbooks_path|
401
+ _stage_cookbooks_path(stage).tap do |_cookbooks_path|
381
402
  @install_stage_cookbooks ||= {}
382
403
  @install_stage_cookbooks[stage] ||= true.tap { install_stage_cookbooks(stage) }
383
404
  end.join(*path)