dapp 0.7.7 → 0.7.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1ef27281b1af7bbf5ba8f3d263cea3e5a701a2ba
4
- data.tar.gz: 0303f66f712951a1d2f82033f9a2e368bacc9b72
3
+ metadata.gz: 709b971c2b888a73d2837821872216f036e2fa99
4
+ data.tar.gz: a18c53002d974242830a9b76450a56ba1f6c21f5
5
5
  SHA512:
6
- metadata.gz: 82d1dc965ca175d1ca89df7ed555dcadadd1f148ba00da307c5182f1519af42f6f894fe90c2383c86677a2c7bea417d63d6ede0d1adda446307c14d121b62e86
7
- data.tar.gz: 30416cab1cd47e0395b95d202bd764655ae54838e021ff4a64fefb5a393cc1f2b817eec6ab8c12ece56eed95790654002fd074a8453a730e0e979566681ebeb4
6
+ metadata.gz: b142d811cc38199046e90babe262c8f32b7a5dcccd543d0e5c4e41ff5041ef87543a6310f4fef15c19250ac7ba4c1a8c88e4160dcb58c3cc1a09bf91970e6a88
7
+ data.tar.gz: 580f2b3b2ec5fc28a2042ea635a7b325bfc035f4940477fa3d3e5224b985208252f55326ac6117b174b7a3dd79aeec37c1779240f7e7e3b624d0f44bd7a99a51
data/bin/dapp CHANGED
@@ -15,7 +15,7 @@ begin
15
15
  ::File.open(filename, 'w') do |dapp_stacktrace|
16
16
  dapp_stacktrace.write "#{e.backtrace.join("\n")}\n"
17
17
  end
18
- $stderr.puts "\033[1m\033[31mStacktrace dumped to #{filename}\033[0m"
18
+ $stderr.puts "\033[1m\033[90mStacktrace dumped to #{filename}\033[0m"
19
19
  end
20
20
 
21
21
  raise
@@ -52,6 +52,10 @@ en:
52
52
  chef:
53
53
  stage_path_overlap: "Cannot install '%{cookbook}' cookbook's path %{from} into %{to}: already exists"
54
54
  mdapp_dependency_in_metadata_forbidden: "Using mdapp as dependency in metadata.rb forbidden: detected '%{dependency}'"
55
+ cookbook_path_not_found: "Dapp cookbook directory not found at %{path}"
56
+ cookbook_berksfile_not_found: "Dapp cookbook Berksfile not found at %{path}"
57
+ cookbook_metadata_not_found: "Dapp cookbook metadata.rb file not found at %{path}"
58
+ cookbook_not_specified_in_berksfile: "Dapp cookbook '%{name}' not specified in Berksfile at %{path}"
55
59
  registry:
56
60
  incorrect_repo: 'Incorrect repository!'
57
61
  no_such_dimg: 'No such dimg in registry!'
@@ -146,7 +146,7 @@ require 'dapp/project/deps/base'
146
146
  require 'dapp/project/deps/gitartifact'
147
147
  require 'dapp/project/shellout/streaming'
148
148
  require 'dapp/project/shellout/base'
149
- require 'dapp/project/shellout/system'
149
+ require 'dapp/project/system_shellout'
150
150
  require 'dapp/project'
151
151
  require 'dapp/docker_registry'
152
152
  require 'dapp/docker_registry/mod/request'
@@ -79,27 +79,61 @@ module Dapp
79
79
  cookbook_metadata.name
80
80
  end
81
81
 
82
+ def cookbook_path(*path)
83
+ dimg.cookbook_path.tap do |cookbook_path|
84
+ unless cookbook_path.exist?
85
+ raise Error, code: :cookbook_path_not_found,
86
+ data: { path: cookbook_path }
87
+ end
88
+ end.join(*path)
89
+ end
90
+
82
91
  def berksfile_path
83
- dimg.chef_path('Berksfile')
92
+ cookbook_path('Berksfile')
84
93
  end
85
94
 
86
95
  def berksfile_lock_path
87
- dimg.chef_path('Berksfile.lock')
96
+ cookbook_path('Berksfile.lock')
88
97
  end
89
98
 
90
99
  def berksfile
91
- @berksfile ||= Berksfile.new(dimg.chef_path, berksfile_path)
100
+ @berksfile ||= begin
101
+ unless berksfile_path.exist?
102
+ raise Error, code: :cookbook_berksfile_not_found,
103
+ data: { path: berksfile_path.to_s }
104
+ end
105
+
106
+ Berksfile.new(cookbook_path, berksfile_path).tap do |berksfile|
107
+ unless berksfile.local_cookbook? project_name
108
+ raise Error, code: :cookbook_not_specified_in_berksfile,
109
+ data: { name: project_name, path: berksfile_path.to_s }
110
+ end
111
+ end
112
+ end
92
113
  end
93
114
 
94
115
  def cookbook_metadata_path
95
- dimg.chef_path('metadata.rb')
116
+ cookbook_path('metadata.rb')
117
+ end
118
+
119
+ def check_cookbook_metadata_path_exist!
120
+ unless cookbook_metadata_path.exist?
121
+ raise Error, code: :cookbook_metadata_not_found,
122
+ data: { path: cookbook_metadata_path }
123
+ end
96
124
  end
97
125
 
98
126
  def cookbook_metadata
99
- @cookbook_metadata ||= CookbookMetadata.new(cookbook_metadata_path).tap do |metadata|
100
- metadata.depends.each do |dependency|
101
- raise Error, code: :mdapp_dependency_in_metadata_forbidden,
102
- data: { dependency: dependency } if dependency.start_with? 'mdapp-'
127
+ @cookbook_metadata ||= begin
128
+ check_cookbook_metadata_path_exist!
129
+
130
+ CookbookMetadata.new(cookbook_metadata_path).tap do |metadata|
131
+ metadata.depends.each do |dependency|
132
+ if dependency.start_with? 'mdapp-'
133
+ raise Error, code: :mdapp_dependency_in_metadata_forbidden,
134
+ data: { dependency: dependency }
135
+ end
136
+ end
103
137
  end
104
138
  end
105
139
  end
@@ -187,8 +221,17 @@ module Dapp
187
221
  end
188
222
  end
189
223
 
224
+ def _update_berksfile_lock_cmd
225
+ vendor_tmp = SecureRandom.uuid
226
+
227
+ ["berks vendor -b #{berksfile_path} /tmp/#{vendor_tmp}",
228
+ "rm -rf /tmp/#{vendor_tmp}"].join(' && ')
229
+ end
230
+
190
231
  # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
191
232
  def install_cookbooks(dest_path, chef_cookbooks_stage: false)
233
+ check_cookbook_metadata_path_exist!
234
+
192
235
  volumes_from = [dimg.project.base_container, chefdk_container]
193
236
  process_code = [
194
237
  'process',
@@ -200,7 +243,7 @@ module Dapp
200
243
  unless dimg.project.dev_mode? || chef_cookbooks_stage
201
244
  commands.push(
202
245
  ['if [ ! -f Berksfile.lock ] ; then ',
203
- 'echo "Berksfile.lock not found" 1>&2 ; ',
246
+ "echo \"Berksfile.lock not found, to create run '#{_update_berksfile_lock_cmd}'\" 1>&2 ; ",
204
247
  'exit 1 ; ',
205
248
  'fi'].join
206
249
  )
@@ -216,9 +259,11 @@ module Dapp
216
259
  )
217
260
  elsif !chef_cookbooks_stage
218
261
  commands.push(
219
- "export LOCKDIFF=$(#{dimg.project.diff_path} -u1 Berksfile.lock #{berksfile_lock_path})",
262
+ "export LOCKDIFF=$(#{dimg.project.diff_path} -u1 #{berksfile_lock_path} Berksfile.lock)",
220
263
  ['if [ "$LOCKDIFF" != "" ] ; then ',
221
- "echo -e \"Bad Berksfile.lock\n$LOCKDIFF\" 1>&2 ; ",
264
+ "echo -e \"",
265
+ "Bad Berksfile.lock, run '#{_update_berksfile_lock_cmd}' ",
266
+ "or manually apply change:\\n$LOCKDIFF\" 1>&2 ; ",
222
267
  'exit 1 ; ',
223
268
  'fi'].join
224
269
  )
@@ -234,7 +279,7 @@ module Dapp
234
279
  .values
235
280
  .map {|cookbook|
236
281
  ["#{dimg.project.rsync_path} --archive",
237
- *cookbook[:chefignore].map {|path| "--exclude #{path}"},
282
+ #*cookbook[:chefignore].map {|path| "--exclude #{path}"}, # FIXME
238
283
  "--relative #{cookbook[:path]} /tmp/local_cookbooks",
239
284
  ].join(' ')
240
285
  },
@@ -254,9 +299,10 @@ module Dapp
254
299
  dimg.project.shellout!(
255
300
  ['docker run --rm',
256
301
  volumes_from.map { |container| "--volumes-from #{container}" }.join(' '),
257
- *berksfile.local_cookbooks
258
- .values
259
- .map { |cookbook| "--volume #{cookbook[:path]}:#{cookbook[:path]}" },
302
+ *berksfile
303
+ .local_cookbooks
304
+ .values
305
+ .map { |desc| "--volume #{desc[:path]}:#{desc[:path]}" },
260
306
  ("--volume #{dimg.project.ssh_auth_sock}:/tmp/dapp-ssh-agent" if dimg.project.ssh_auth_sock),
261
307
  "--volume #{dest_path.tap(&:mkpath)}:#{dest_path}",
262
308
  ('--env SSH_AUTH_SOCK=/tmp/dapp-ssh-agent' if dimg.project.ssh_auth_sock),
@@ -308,8 +354,7 @@ module Dapp
308
354
  cookbook_name = File.basename cookbook_path
309
355
  is_project = (cookbook_name == project_name)
310
356
  is_mdapp = cookbook_name.start_with? 'mdapp-'
311
- mdapp_name = (is_mdapp ? cookbook_name.split('mdapp-')[1] : nil)
312
- mdapp_enabled = is_mdapp && enabled_modules.include?(mdapp_name)
357
+ mdapp_enabled = is_mdapp && enabled_modules.include?(cookbook_name)
313
358
 
314
359
  paths = if is_project
315
360
  common_dapp_paths = select_existing_paths.call(cookbook_path, [
@@ -404,8 +449,7 @@ module Dapp
404
449
  "#{cookbook}::#{entrypoint}"
405
450
  end
406
451
 
407
- enabled_modules.map do |mod|
408
- cookbook = "mdapp-#{mod}"
452
+ enabled_modules.map do |cookbook|
409
453
  if does_entry_exist[cookbook, stage]
410
454
  [cookbook, stage]
411
455
  else
@@ -9,7 +9,7 @@ module Dapp
9
9
 
10
10
  option :build_dir,
11
11
  long: '--build-dir PATH',
12
- description: 'Directory where build cache stored (DIR/.dapp-build by default)'
12
+ description: 'Directory where build cache stored (DIR/.dapp_build by default)'
13
13
 
14
14
  option :log_quiet,
15
15
  short: '-q',
@@ -171,6 +171,7 @@ module Dapp
171
171
  when Directive::Base, GitArtifact then variable.send(clone_method)
172
172
  when Symbol then variable
173
173
  when Array then variable.dup
174
+ when TrueClass, FalseClass then variable
174
175
  else
175
176
  raise
176
177
  end
@@ -180,7 +181,9 @@ module Dapp
180
181
  end
181
182
 
182
183
  def passed_directives
183
- [:@_chef, :@_shell, :@_docker, :@_git_artifact, :@_mount, :@_artifact, :@_builder, :@_dev_mode]
184
+ [:@_chef, :@_shell, :@_docker,
185
+ :@_git_artifact, :@_mount,
186
+ :@_artifact, :@_builder, :@_dev_mode]
184
187
  end
185
188
  end
186
189
  end
@@ -40,6 +40,10 @@ module Dapp
40
40
  pass_to_default(dimg)
41
41
  end
42
42
 
43
+ def before_dimg_group_eval(dimg_group)
44
+ pass_to_default(dimg_group)
45
+ end
46
+
43
47
  def check_dimg_directive_order(directive)
44
48
  project.log_config_warning(desc: { code: 'wrong_using_base_directive',
45
49
  data: { directive: directive },
@@ -24,7 +24,11 @@ module Dapp
24
24
  end
25
25
 
26
26
  def dimg_group(&blk)
27
- Config::DimgGroup.new(project: project, &blk).tap { |dimg_group| @_dimg_group << dimg_group }
27
+ Config::DimgGroup.new(project: project).tap do |dimg_group|
28
+ before_dimg_group_eval(dimg_group)
29
+ dimg_group.instance_eval(&blk) if block_given?
30
+ @_dimg_group << dimg_group
31
+ end
28
32
  end
29
33
 
30
34
  def _dimg
@@ -34,7 +38,15 @@ module Dapp
34
38
  protected
35
39
 
36
40
  def before_dimg_eval(dimg)
37
- dimg.instance_variable_set(:@_dev_mode, @_dev_mode)
41
+ pass_to_default(dimg)
42
+ end
43
+
44
+ def before_dimg_group_eval(dimg_group)
45
+ pass_to_default(dimg_group)
46
+ end
47
+
48
+ def pass_to_default(obj)
49
+ obj.instance_variable_set(:@_dev_mode, @_dev_mode)
38
50
  end
39
51
  end
40
52
  end
@@ -2,12 +2,12 @@ module Dapp
2
2
  module Config
3
3
  # DimgGroupMain
4
4
  class DimgGroupMain < DimgGroupBase
5
- def dimg(name = nil)
6
- with_dimg_validation { super }
5
+ def dimg(name = nil, &blk)
6
+ with_dimg_validation { super(name, &blk) }
7
7
  end
8
8
 
9
- def dimg_group
10
- with_dimg_validation { super }
9
+ def dimg_group(&blk)
10
+ with_dimg_validation { super(&blk) }
11
11
  end
12
12
 
13
13
  protected
@@ -7,7 +7,7 @@ module Dapp
7
7
  make_path(project.path, *path).expand_path
8
8
  end
9
9
 
10
- def chef_path(*path)
10
+ def cookbook_path(*path)
11
11
  home_path('.dapp_chef', *path)
12
12
  end
13
13
 
@@ -35,7 +35,7 @@ module Dapp
35
35
  include Deps::Base
36
36
 
37
37
  include Shellout::Base
38
- include Shellout::System
38
+ include SystemShellout
39
39
 
40
40
  attr_reader :cli_options
41
41
  attr_reader :dimgs_patterns
@@ -6,7 +6,7 @@ module Dapp
6
6
  class << self
7
7
  def included(_base)
8
8
  ::Dapp::Project::Shellout::Base.default_env_keys << 'SSH_AUTH_SOCK'
9
- ::Dapp::Project::Shellout::System.default_env_keys << 'SSH_AUTH_SOCK'
9
+ ::Dapp::Project::SystemShellout.default_env_keys << 'SSH_AUTH_SOCK'
10
10
  end
11
11
  end # << self
12
12
 
@@ -0,0 +1,98 @@
1
+ module Dapp
2
+ # Project
3
+ class Project
4
+ module SystemShellout
5
+ SYSTEM_SHELLOUT_IMAGE = 'ubuntu:14.04'.freeze
6
+ SYSTEM_SHELLOUT_VERSION = 3
7
+
8
+ def system_shellout_container_name
9
+ "dapp_system_shellout_#{hashsum [SYSTEM_SHELLOUT_VERSION,
10
+ SYSTEM_SHELLOUT_IMAGE,
11
+ Deps::Base::BASE_VERSION,
12
+ Deps::Gitartifact::GITARTIFACT_VERSION]}"
13
+ end
14
+
15
+ def system_shellout_container
16
+ do_livecheck = false
17
+
18
+ @system_shellout_container ||= begin
19
+ lock(system_shellout_container_name) do
20
+ cmd = shellout("docker inspect -f {{.State.Running}} #{system_shellout_container_name}")
21
+ if cmd.exitstatus.nonzero?
22
+ start_container = true
23
+ elsif cmd.stdout.strip == 'false'
24
+ shellout!("docker rm -f #{system_shellout_container_name}")
25
+ start_container = true
26
+ else
27
+ start_container = false
28
+ end
29
+
30
+ if start_container
31
+ volumes_from = [base_container, gitartifact_container]
32
+ log_secondary_process(t(code: 'process.system_shellout_container_loading'), short: true) do
33
+ shellout! ['docker run --detach --privileged',
34
+ "--name #{system_shellout_container_name}",
35
+ *volumes_from.map { |container| "--volumes-from #{container}" },
36
+ '--volume /:/.system_shellout_root',
37
+ "#{SYSTEM_SHELLOUT_IMAGE} #{bash_path} -ec 'while true ; do sleep 1 ; done'"].join(' ')
38
+
39
+ shellout! ["docker exec #{system_shellout_container_name}",
40
+ "bash -ec '#{[
41
+ 'mkdir -p /.system_shellout_root/.dapp',
42
+ 'mount --rbind /.dapp /.system_shellout_root/.dapp'
43
+ ].join(' && ')}'"].join(' ')
44
+ end
45
+ end
46
+ end
47
+
48
+ do_livecheck = true
49
+ system_shellout_container_name
50
+ end
51
+
52
+ system_shellout_livecheck! if do_livecheck
53
+
54
+ @system_shellout_container
55
+ end
56
+
57
+ def system_shellout(command, raise_error: false, **kwargs)
58
+ if raise_error
59
+ shellout! _to_system_shellout_command(command), **kwargs
60
+ else
61
+ shellout _to_system_shellout_command(command), **kwargs
62
+ end
63
+ end
64
+
65
+ def system_shellout!(command, **kwargs)
66
+ system_shellout(command, raise_error: true, **kwargs)
67
+ end
68
+
69
+ private
70
+
71
+ def system_shellout_livecheck!
72
+ # This is stupid container "live check" for now
73
+ system_shellout! 'true'
74
+ rescue Error::Shellout
75
+ $stderr.puts "\033[1m\033[31mSystem shellout container failure, " \
76
+ 'try to remove if error persists: ' \
77
+ "docker rm -f #{system_shellout_container_name}\033[0m"
78
+ raise
79
+ end
80
+
81
+ def _to_system_shellout_command(command)
82
+ cmd = shellout_pack ["cd #{Dir.pwd}", command].join(' && ')
83
+ "docker exec #{system_shellout_container} chroot /.system_shellout_root #{bash_path} -ec '#{[
84
+ *SystemShellout.default_env_keys.map do |env_key|
85
+ env_key = env_key.to_s.upcase
86
+ "export #{env_key}=#{ENV[env_key]}"
87
+ end, cmd
88
+ ].join(' && ')}'"
89
+ end
90
+
91
+ class << self
92
+ def default_env_keys
93
+ @default_env_keys ||= []
94
+ end
95
+ end # << self
96
+ end # SystemShellout
97
+ end # Project
98
+ end # Dapp
@@ -1,5 +1,5 @@
1
1
  # Version
2
2
  module Dapp
3
- VERSION = '0.7.7'.freeze
3
+ VERSION = '0.7.8'.freeze
4
4
  BUILD_CACHE_VERSION = 6
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dapp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.7
4
+ version: 0.7.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Stolyarov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-16 00:00:00.000000000 Z
11
+ date: 2016-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mixlib-shellout
@@ -495,8 +495,8 @@ files:
495
495
  - lib/dapp/project/logging/process.rb
496
496
  - lib/dapp/project/shellout/base.rb
497
497
  - lib/dapp/project/shellout/streaming.rb
498
- - lib/dapp/project/shellout/system.rb
499
498
  - lib/dapp/project/ssh_agent.rb
499
+ - lib/dapp/project/system_shellout.rb
500
500
  - lib/dapp/version.rb
501
501
  homepage: https://github.com/flant/dapp
502
502
  licenses:
@@ -1,101 +0,0 @@
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 = 3
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
- do_livecheck = false
19
-
20
- @system_shellout_container ||= begin
21
- lock(system_shellout_container_name) do
22
- cmd = shellout("docker inspect -f {{.State.Running}} #{system_shellout_container_name}")
23
- if cmd.exitstatus.nonzero?
24
- start_container = true
25
- elsif cmd.stdout.strip == 'false'
26
- shellout!("docker rm -f #{system_shellout_container_name}")
27
- start_container = true
28
- else
29
- start_container = false
30
- end
31
-
32
- if start_container
33
- volumes_from = [base_container, gitartifact_container]
34
- log_secondary_process(t(code: 'process.system_shellout_container_loading'), short: true) do
35
- shellout! ['docker run --detach --privileged',
36
- "--name #{system_shellout_container_name}",
37
- *volumes_from.map { |container| "--volumes-from #{container}" },
38
- '--volume /:/.system_shellout_root',
39
- "#{SYSTEM_SHELLOUT_IMAGE} #{bash_path} -ec 'while true ; do sleep 1 ; done'"].join(' ')
40
-
41
- shellout! ["docker exec #{system_shellout_container_name}",
42
- "bash -ec '#{[
43
- 'mkdir -p /.system_shellout_root/.dapp',
44
- 'mount --rbind /.dapp /.system_shellout_root/.dapp'
45
- ].join(' && ')}'"].join(' ')
46
- end
47
- end
48
- end
49
-
50
- do_livecheck = true
51
- system_shellout_container_name
52
- end
53
-
54
- system_shellout_livecheck! if do_livecheck
55
-
56
- @system_shellout_container
57
- end
58
-
59
- def system_shellout(command, raise_error: false, **kwargs)
60
- if raise_error
61
- shellout! _to_system_shellout_command(command), **kwargs
62
- else
63
- shellout _to_system_shellout_command(command), **kwargs
64
- end
65
- end
66
-
67
- def system_shellout!(command, **kwargs)
68
- system_shellout(command, raise_error: true, **kwargs)
69
- end
70
-
71
- private
72
-
73
- def system_shellout_livecheck!
74
- # This is stupid container "live check" for now
75
- system_shellout! 'true'
76
- rescue Error::Shellout
77
- $stderr.puts "\033[1m\033[31mSystem shellout container failure, " \
78
- 'try to remove if error persists: ' \
79
- "docker rm -f #{system_shellout_container_name}\033[0m"
80
- raise
81
- end
82
-
83
- def _to_system_shellout_command(command)
84
- cmd = shellout_pack ["cd #{Dir.pwd}", command].join(' && ')
85
- "docker exec #{system_shellout_container} chroot /.system_shellout_root #{bash_path} -ec '#{[
86
- *System.default_env_keys.map do |env_key|
87
- env_key = env_key.to_s.upcase
88
- "export #{env_key}=#{ENV[env_key]}"
89
- end, cmd
90
- ].join(' && ')}'"
91
- end
92
-
93
- class << self
94
- def default_env_keys
95
- @default_env_keys ||= []
96
- end
97
- end # << self
98
- end # System
99
- end
100
- end # Project
101
- end # Dapp