dapp 0.2.6 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
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