dapp 0.2.6 → 0.2.7

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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MTIyNTY4OTdmNjMxOGJjYzE1NmI2ZmRhNGQ5ZmQ1YzAyNzQ1YWU3ZA==
4
+ NmY2NzQzN2JiYmQ0Y2M4ZmY0ZTEwMGMzYTI3ZmQ0ZDYyZjlkODJjMw==
5
5
  data.tar.gz: !binary |-
6
- YWViZjQ0NjA5ZWNlYzYwMGQ5MDU2MDZjOGE3NTc5MDczNDFjNGNiMg==
6
+ OTYwNTYyN2M5MWQyNjkxZTNjMGYxZmNlZTk3NTFiM2RhOTVlMjA5ZA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MDRiOTcwMDRiZDc1YzNhZTQ5NDM0NzFkNTRiMzZmM2YyNGQ2ZjdkMWUyMjc1
10
- OTY1ZDBjMGY2Y2VhMTkyMjhiOTIwMGRhYjE4YzU4YzgzYTlmODNhMzdkZWQ5
11
- MGIyYzQ2NDI4MmI3MGEyYzU5MThlNTM5OWNlZGY5NDk3NDA3YzI=
9
+ NzBkNjBhZjljMTEzNDc0MDdjM2FmN2MxNmQ2YmViMGM5NmEzZDI2OTdhM2E2
10
+ MWIyYzE4NzQwMGFlMzQ1YzZjMDI0MTE5MjU2MWI1MzAzMTUxNTdjODAzYTlm
11
+ Yzc4YjlkNTA2YWI0M2VkODY2ZTAxNDAxZTYwMzJhMjcyZDRmODA=
12
12
  data.tar.gz: !binary |-
13
- Njc0ZTllM2NjMjA1YjI0ZTY4NDU2Mjk1M2JlYWQzNjM3NWY1OTcxZTU5ODAz
14
- MmM2NTQwOWQwMjk2ZDAwODY0ODVmYTYxYmE5YWU2MWMzMmYwYWMzOTIyZjE3
15
- ZTg5YmM3NjgyYmYzOGU3NDJkOGNmNDIwYmQ4NmFlMGQxZmM0Y2Q=
13
+ NDU4ZWVjMmQyYWNmN2UyOGYxMjE1ODMzNDhlOWI2NDQ5ODljYjk4MmM1ODc5
14
+ OTFmZmM0ZWIzOWVmYzIyN2EzNTI3ZDg4Y2QwYWVkNjJjMzFlNTkwMzNiMzFj
15
+ ZjQ4YzM0ZWEyZDZlZjJlYjY5NTc1OTI2ZDQ0ZTBjNjlhODZjZmM=
data/lib/dapp.rb CHANGED
@@ -53,6 +53,7 @@ require 'dapp/build/stage/infra_install'
53
53
  require 'dapp/build/stage/infra_setup'
54
54
  require 'dapp/build/stage/app_install'
55
55
  require 'dapp/build/stage/app_setup'
56
+ require 'dapp/build/stage/chef_cookbooks'
56
57
  require 'dapp/build/stage/source_1_archive'
57
58
  require 'dapp/build/stage/source_1'
58
59
  require 'dapp/build/stage/source_2'
@@ -0,0 +1,23 @@
1
+ module Dapp
2
+ module Build
3
+ module Stage
4
+ # ChefCookbooks
5
+ class ChefCookbooks < Base
6
+ def initialize(application, next_stage)
7
+ @prev_stage = AppSetup.new(application, self)
8
+ super
9
+ end
10
+
11
+ def signature
12
+ hashsum [prev_stage.signature, *application.builder.chef_cookbooks_checksum]
13
+ end
14
+
15
+ def image
16
+ super do |image|
17
+ application.builder.chef_cookbooks(image)
18
+ end
19
+ end
20
+ end # ChefCookbooks
21
+ end # Stage
22
+ end # Build
23
+ end # Dapp
@@ -6,10 +6,14 @@ module Dapp
6
6
  MAX_PATCH_SIZE = 1024 * 1024
7
7
 
8
8
  def initialize(application, next_stage)
9
- @prev_stage = AppSetup.new(application, self)
9
+ @prev_stage = ChefCookbooks.new(application, self)
10
10
  super
11
11
  end
12
12
 
13
+ def prev_source_stage
14
+ prev_stage.prev_stage.prev_stage
15
+ end
16
+
13
17
  def next_source_stage
14
18
  next_stage
15
19
  end
@@ -12,11 +12,11 @@ module Dapp
12
12
  metadata.json
13
13
  recipes/%{stage}.rb
14
14
  recipes/*_%{stage}.rb
15
- files/%{stage}/*
16
- templates/%{stage}/*
15
+ files/default/%{stage}/*
16
+ templates/default/%{stage}/*
17
17
  ).freeze
18
18
 
19
- DEFAULT_CHEFDK_IMAGE = 'dappdeps/chefdk:0.15.16-3'.freeze # TODO: config, DSL, DEFAULT_CHEFDK_IMAGE
19
+ DEFAULT_CHEFDK_IMAGE = 'dappdeps/chefdk:0.17.3-1'.freeze # TODO: config, DSL, DEFAULT_CHEFDK_IMAGE
20
20
 
21
21
  [:infra_install, :infra_setup, :app_install, :app_setup].each do |stage|
22
22
  define_method(:"#{stage}_checksum") { stage_cookbooks_checksum(stage) }
@@ -37,6 +37,17 @@ module Dapp
37
37
  end
38
38
  end
39
39
 
40
+ def chef_cookbooks_checksum
41
+ stage_cookbooks_checksum(:chef_cookbooks)
42
+ end
43
+
44
+ def chef_cookbooks(image)
45
+ image.add_commands(
46
+ "mkdir -p /usr/share/dapp/chef_repo",
47
+ "cp -a #{container_cookbooks_vendor_path} /usr/share/dapp/chef_repo/cookbooks"
48
+ )
49
+ end
50
+
40
51
  private
41
52
 
42
53
  def project_name
@@ -47,6 +58,10 @@ module Dapp
47
58
  application.home_path('Berksfile')
48
59
  end
49
60
 
61
+ def berksfile_lock_path
62
+ application.home_path('Berksfile.lock')
63
+ end
64
+
50
65
  def berksfile
51
66
  @berksfile ||= Berksfile.new(application.home_path, berksfile_path)
52
67
  end
@@ -60,8 +75,7 @@ module Dapp
60
75
  end
61
76
 
62
77
  def berksfile_lock_checksum
63
- path = application.home_path('Berksfile.lock')
64
- application.hashsum path.read if path.exist?
78
+ application.hashsum berksfile_lock_path.read if berksfile_lock_path.exist?
65
79
  end
66
80
 
67
81
  # rubocop:disable Metrics/AbcSize
@@ -78,9 +92,11 @@ module Dapp
78
92
  to_runlist_entrypoint[name, stage]
79
93
  end.compact)
80
94
 
81
- res.concat(application.config._app_runlist.map(&:_name).map do |name|
82
- subname_parts = name.split(project_name, 2)[1].split('-')
83
- to_runlist_entrypoint[project_name, [*subname_parts, stage].join('_')]
95
+ project_main_entry = to_runlist_entrypoint[project_name, stage]
96
+ res << project_main_entry if project_main_entry
97
+
98
+ res.concat(application.config._app_runlist.map do |app_component|
99
+ to_runlist_entrypoint[project_name, [app_component, stage].join('_')]
84
100
  end.compact)
85
101
  end
86
102
  end
@@ -123,11 +139,18 @@ module Dapp
123
139
  else
124
140
  install_cookbooks
125
141
 
126
- application.hashsum([_paths_checksum(stage_cookbooks_vendored_paths(stage, with_files: true)),
127
- *application.config._chef._modules,
128
- stage == :infra_install ? chefdk_image : nil].compact).tap do |checksum|
129
- stage_cookbooks_checksum_path(stage).write "#{checksum}\n"
142
+ if stage == :chef_cookbooks
143
+ checksum = cookbooks_checksum
144
+ else
145
+ checksum = application.hashsum [
146
+ _paths_checksum(stage_cookbooks_vendored_paths(stage, with_files: true)),
147
+ *application.config._chef._modules,
148
+ stage == :infra_install ? chefdk_image : nil
149
+ ].compact
130
150
  end
151
+
152
+ stage_cookbooks_checksum_path(stage).write "#{checksum}\n"
153
+ checksum
131
154
  end
132
155
  end
133
156
 
@@ -172,24 +195,34 @@ module Dapp
172
195
  ssh_auth_socket_path = nil
173
196
  ssh_auth_socket_path = Pathname.new(ENV['SSH_AUTH_SOCK']).expand_path if ENV['SSH_AUTH_SOCK'] && File.exist?(ENV['SSH_AUTH_SOCK'])
174
197
 
198
+ vendor_commands = [
199
+ 'mkdir -p ~/.ssh',
200
+ 'echo "Host *" >> ~/.ssh/config',
201
+ 'echo " StrictHostKeyChecking no" >> ~/.ssh/config',
202
+ 'if [ ! -f Berksfile.lock ] ; then echo "Berksfile.lock not found" 1>&2 ; exit 1 ; fi',
203
+ 'cp -a Berksfile.lock /tmp/Berksfile.lock.orig',
204
+ '/.dapp/deps/chefdk/bin/berks vendor /tmp/vendored_cookbooks',
205
+ 'export LOCKDIFF=$(diff -u0 Berksfile.lock /tmp/Berksfile.lock.orig)',
206
+ ['if [ "$LOCKDIFF" != "" ] ; then ',
207
+ 'cp -a /tmp/Berksfile.lock.orig Berksfile.lock ; ',
208
+ 'echo -e "Bad Berksfile.lock\n$LOCKDIFF" 1>&2 ; exit 1 ; fi'].join,
209
+ ["find /tmp/vendored_cookbooks -type f -exec bash -ec '",
210
+ "install -D -o #{Process.uid} -g #{Process.gid} --mode $(stat -c %a {}) {} ",
211
+ "#{cookbooks_vendor_path}/$(echo {} | sed -e \"s/\\/tmp\\/vendored_cookbooks\\///g\")' \\;"].join,
212
+ "chown -R #{Process.uid}:#{Process.gid} #{berksfile_lock_path}",
213
+ ]
214
+
175
215
  application.shellout!(
176
216
  ['docker run --rm',
177
- '--volume /etc:/etc:ro',
178
- '--volume /usr:/usr:ro',
179
- '--volume /lib:/lib:ro',
180
- '--volume /home:/home',
181
- '--volume /tmp:/tmp',
182
- ("--volume #{ssh_auth_socket_path.dirname}:#{ssh_auth_socket_path.dirname}" if ssh_auth_socket_path),
217
+ ("--volume #{ssh_auth_socket_path}:#{ssh_auth_socket_path}" if ssh_auth_socket_path),
183
218
  "--volume #{cookbooks_vendor_path.tap(&:mkpath)}:#{cookbooks_vendor_path}",
184
219
  *berksfile.local_cookbooks
185
220
  .values
186
221
  .map { |cookbook| "--volume #{cookbook[:path]}:#{cookbook[:path]}" },
187
222
  "--volumes-from #{volumes_from}",
188
- "--user #{Process.uid}:#{Process.gid}",
189
223
  "--workdir #{berksfile_path.parent}",
190
- '--env BERKSHELF_PATH=/tmp/berkshelf',
191
224
  ("--env SSH_AUTH_SOCK=#{ssh_auth_socket_path}" if ssh_auth_socket_path),
192
- "dappdeps/berksdeps:0.1.0 /.dapp/deps/chefdk/bin/berks vendor #{cookbooks_vendor_path}"].compact.join(' '),
225
+ "dappdeps/berksdeps:0.1.0 #{application.shellout_pack(vendor_commands.join(' && '))}"].compact.join(' '),
193
226
  log_verbose: application.log_verbose?
194
227
  )
195
228
 
@@ -223,6 +256,10 @@ module Dapp
223
256
  application.build_path('chef', 'vendored_cookbooks').join(*path)
224
257
  end
225
258
 
259
+ def container_cookbooks_vendor_path(*path)
260
+ application.container_build_path('chef', 'vendored_cookbooks').join(*path)
261
+ end
262
+
226
263
  def stage_build_path(stage, *path)
227
264
  application.build_path(application.config._name, stage).join(*path)
228
265
  end
@@ -11,6 +11,13 @@ module Dapp
11
11
  image.add_commands(*application.config._shell.public_send("_#{m}"))
12
12
  end
13
13
  end
14
+
15
+ def chef_cookbooks_checksum
16
+ []
17
+ end
18
+
19
+ def chef_cookbooks(_image)
20
+ end
14
21
  end
15
22
  end
16
23
  end
@@ -61,12 +61,21 @@ module Dapp
61
61
  @_apps.empty? ? [self] : @_apps.flatten
62
62
  end
63
63
 
64
+ def _app_chain
65
+ @_app_chain ||= (_parent ? _parent._app_chain : []) + [self]
66
+ end
67
+
64
68
  def _app_runlist
65
- @_app_runlist ||= (_parent ? _parent._app_runlist : []) + [self]
69
+ _app_chain.map(&:_name).map do |name|
70
+ if subname = name.split("#{_root_app._name}-", 2)[1]
71
+ subname_parts = subname.split('-')
72
+ subname_parts.join('_') if subname_parts.any?
73
+ end
74
+ end.compact
66
75
  end
67
76
 
68
77
  def _root_app
69
- _app_runlist.first
78
+ _app_chain.first
70
79
  end
71
80
 
72
81
  private
@@ -2,7 +2,7 @@ module Dapp
2
2
  module Config
3
3
  # Docker
4
4
  class Docker
5
- attr_reader :_volume, :_expose, :_env, :_label, :_cmd, :_onbuild, :_workdir, :_user
5
+ attr_reader :_volume, :_expose, :_env, :_label, :_cmd, :_onbuild, :_workdir, :_user, :_entrypoint
6
6
  attr_reader :_from_cache_version
7
7
 
8
8
  def initialize
@@ -27,12 +27,12 @@ module Dapp
27
27
  @_expose.concat(args)
28
28
  end
29
29
 
30
- def env(**options)
31
- @_env.concat(options_to_args(options))
30
+ def env(*args)
31
+ @_env.concat(args)
32
32
  end
33
33
 
34
- def label(**options)
35
- @_label.concat(options_to_args(options))
34
+ def label(*args)
35
+ @_label.concat(args)
36
36
  end
37
37
 
38
38
  def cmd(*args)
@@ -51,6 +51,10 @@ module Dapp
51
51
  @_user = val
52
52
  end
53
53
 
54
+ def entrypoint(*cmd_with_args)
55
+ @_entrypoint = cmd_with_args.flatten
56
+ end
57
+
54
58
  def _from
55
59
  @_from || raise(Error::Config, code: :docker_from_not_defined)
56
60
  end
@@ -64,19 +68,14 @@ module Dapp
64
68
  cmd: _cmd,
65
69
  onbuild: _onbuild,
66
70
  workdir: _workdir,
67
- user: _user
71
+ user: _user,
72
+ entrypoint: _entrypoint
68
73
  }
69
74
  end
70
75
 
71
76
  def clone
72
77
  Marshal.load(Marshal.dump(self))
73
78
  end
74
-
75
- private
76
-
77
- def options_to_args(options)
78
- options.map {|key, value| "#{key.upcase}=#{value}" }
79
- end
80
79
  end
81
80
  end
82
81
  end
@@ -30,7 +30,11 @@ module Dapp
30
30
  shellout(*args, **kwargs).tap(&:error!)
31
31
  rescue ::Mixlib::ShellOut::ShellCommandFailed => e
32
32
  raise Error::Shellout, code: Trivia.class_to_lowercase(e.class),
33
- data: { stream: stream.inspect }
33
+ data: { stream: stream.show }
34
+ end
35
+
36
+ def shellout_pack(command)
37
+ "bash -ec 'eval $(echo #{Base64.strict_encode64(command)} | base64 --decode)'"
34
38
  end
35
39
 
36
40
  def self.included(base)
@@ -12,8 +12,8 @@ module Dapp
12
12
  buffer << string
13
13
  end
14
14
 
15
- def inspect
16
- buffer.join
15
+ def show
16
+ buffer.join.strip
17
17
  end
18
18
  end
19
19
 
@@ -40,7 +40,7 @@ module Dapp
40
40
  # Error
41
41
  class Error < Base
42
42
  def format_string(str)
43
- Paint.paint_string(super, :warning)
43
+ "#{Paint.paint_string(super.strip, :warning)}\n"
44
44
  end
45
45
  end
46
46
  end
@@ -38,6 +38,10 @@ module Dapp
38
38
  add_change_option(:workdir, value)
39
39
  end
40
40
 
41
+ def add_change_entrypoint(value)
42
+ add_change_option(:entrypoint, value)
43
+ end
44
+
41
45
  def add_change_user(value)
42
46
  add_change_option(:user, value)
43
47
  end
@@ -129,7 +133,7 @@ module Dapp
129
133
 
130
134
  def prepared_change
131
135
  prepared_options_default(change_options) do |k, vals|
132
- if k == :cmd
136
+ if [:cmd, :entrypoint].include? k
133
137
  %(-c '#{k.to_s.upcase} #{Array(vals)}')
134
138
  else
135
139
  Array(vals).map { |v| %(-c "#{k.to_s.upcase} #{v}") }.join(' ')
@@ -142,7 +146,11 @@ module Dapp
142
146
  end
143
147
 
144
148
  def prepared_bash_command
145
- "bash -ec 'eval $(echo #{Base64.strict_encode64(prepared_commands.join(' && '))} | base64 --decode)'"
149
+ if bash_commands.empty?
150
+ 'true'
151
+ else
152
+ shellout_pack prepared_commands.join(' && ')
153
+ end
146
154
  end
147
155
 
148
156
  def prepared_commands
data/lib/dapp/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # Version
2
2
  module Dapp
3
- VERSION = '0.2.6'.freeze
3
+ VERSION = '0.2.7'.freeze
4
4
  BUILD_CACHE_VERSION = 1
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dapp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Stolyarov
@@ -334,6 +334,7 @@ files:
334
334
  - lib/dapp/build/stage/app_install.rb
335
335
  - lib/dapp/build/stage/app_setup.rb
336
336
  - lib/dapp/build/stage/base.rb
337
+ - lib/dapp/build/stage/chef_cookbooks.rb
337
338
  - lib/dapp/build/stage/from.rb
338
339
  - lib/dapp/build/stage/infra_install.rb
339
340
  - lib/dapp/build/stage/infra_setup.rb