buildizer 0.1.0 → 0.1.1

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
- NTFhMmM1N2Y4NzhjOWNkMWRlMWFhMTlmOGQ5YzU0M2FkYTg3NDc0Yg==
4
+ YzFkODNmNmQzNzllNmRkZTY3ZGE2YTQ1Mzk1MjRiYmEyYTljY2UxZg==
5
5
  data.tar.gz: !binary |-
6
- ZjQ5OTYxZGJiMWJkZGNiNjBjMzkwYjFiZTRkYzMxZWZiYmY5ODIwMw==
6
+ YThiNTliNTQ2MjRhZjY0OGZiZDE0ZjMzZDFmN2RiZGY0NTIxZjFiMw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MDZlNTZiNmFiOTBmZmFiYzczNWQ1NGI0MWVkODk4NDYwZjcwZmM1MDc5MDRk
10
- ZjU1MmNiMDU3MTRiMTYzOTM0YmQxMDM2NjE0MjM5YjZjODRiYzRmMTA5NGY0
11
- ZTg0ZDQ3MTFmMWVjNzYyNzY4ZjdlYzEzYzU4YjFiNWQ4MDU1YTI=
9
+ MDI5NzEzYWY2ZDZkNGFlZjRlMzEwMmFmYmVlM2RhOGE3MzEzMjc3ZjhmNjg3
10
+ YjFlNWY2MjBjMWZlZDI5OGYyNjNiZDRmOGNlNDdlNzQ3YjBlOGYzYTcxNzg1
11
+ YThiYTUzZDViOGJmOTgwMjM5Y2VmZmViNTVlZTFlOGM3NTQyMzM=
12
12
  data.tar.gz: !binary |-
13
- MGExOGQ3ZjViMDVmZGE0MDg2ZjE2NjU2MTI3ZTcwNjFhM2U0MmM5YjFiZjNk
14
- NDU2ZGNmNmVmMjcyNjczZjlhMTA0OTBmNDU5ZGZmYzQxNDg3YTdlZGY1YzI1
15
- NzA4NmJiYWVhMDFlOWUyZmQ0MjUzNzgyMjEyMDQwZTFiMTQ1OGY=
13
+ OGQ0MDA2NmJlZDFiYjIxZDI2MDcwZTk3ZDMxZWUxYTM3MzYyYTZlMTI0OWVm
14
+ ZjI1MjAyYmM3YmRmZGE1YjNhMzJkMTg5MmI1NmNmYWE3ODk0NjY2NWQ0MTY2
15
+ Y2I2ZWY2Y2IwNDI4ZDBlYjNmN2RjMzBlYzY2NTY2YTc2NTVhMTQ=
@@ -1,16 +1,16 @@
1
1
  GIT
2
2
  remote: https://github.com/flant/shellfold.git
3
- revision: 4704e2ffe717268e1316b66db34e5f9a1aafabee
3
+ revision: bd500ed78320ead4d5fbf46470e3b34582ead26c
4
4
  specs:
5
- shellfold (0.0.3)
5
+ shellfold (0.1.0)
6
6
  mixlib-shellout (>= 2.2.6, < 3.0)
7
7
 
8
8
  PATH
9
9
  remote: .
10
10
  specs:
11
- buildizer (0.1.0)
11
+ buildizer (0.1.1)
12
12
  colorize (>= 0.6.0, < 1.0)
13
- net_status (>= 0.0.1, < 1.0)
13
+ net_status (>= 0.1.0, < 1.0)
14
14
  overcommit (>= 0.33.0, < 1.0)
15
15
  package_cloud (>= 0.2, < 1.0)
16
16
  shellfold (>= 0.0.1, < 1.0)
@@ -26,16 +26,16 @@ GEM
26
26
  childprocess (0.5.9)
27
27
  ffi (~> 1.0, >= 1.0.11)
28
28
  coderay (1.1.1)
29
- colorize (0.6.0)
29
+ colorize (0.8.1)
30
30
  debug_inspector (0.0.2)
31
31
  diff-lcs (1.2.5)
32
- ethon (0.8.1)
32
+ ethon (0.9.1)
33
33
  ffi (>= 1.3.0)
34
34
  faraday (0.9.2)
35
35
  multipart-post (>= 1.2, < 3)
36
36
  faraday_middleware (0.10.0)
37
37
  faraday (>= 0.7.4, < 0.10)
38
- ffi (1.9.10)
38
+ ffi (1.9.14)
39
39
  gh (0.14.0)
40
40
  addressable
41
41
  backports
@@ -44,29 +44,31 @@ GEM
44
44
  net-http-persistent (>= 2.7)
45
45
  net-http-pipeline
46
46
  highline (1.6.20)
47
+ i18n (0.7.0)
47
48
  iniparse (1.4.2)
48
- json (1.8.3)
49
+ json (2.0.2)
49
50
  json_pure (1.8.1)
50
51
  launchy (2.4.3)
51
52
  addressable (~> 2.3)
52
53
  method_source (0.8.2)
53
54
  mime-types (1.25.1)
54
- mixlib-shellout (2.2.6)
55
- multi_json (1.11.2)
55
+ mixlib-shellout (2.2.7)
56
+ multi_json (1.12.1)
56
57
  multipart-post (2.0.0)
57
58
  net-http-persistent (2.9.4)
58
59
  net-http-pipeline (1.0.1)
59
- net_status (0.0.2)
60
- overcommit (0.33.0)
60
+ net_status (0.1.3)
61
+ i18n (~> 0.7)
62
+ overcommit (0.36.0)
61
63
  childprocess (~> 0.5.8)
62
64
  iniparse (~> 1.4)
63
- package_cloud (0.2.29)
64
- colorize (= 0.6.0)
65
+ package_cloud (0.2.36)
65
66
  highline (= 1.6.20)
66
67
  json_pure (= 1.8.1)
68
+ rainbow (= 2.1.0)
67
69
  rest-client (~> 1.6.7)
68
70
  thor (~> 0.18)
69
- pry (0.10.3)
71
+ pry (0.10.4)
70
72
  coderay (~> 1.1.0)
71
73
  method_source (~> 0.8.1)
72
74
  slop (~> 3.4)
@@ -76,22 +78,23 @@ GEM
76
78
  pusher-client (0.6.2)
77
79
  json
78
80
  websocket (~> 1.0)
81
+ rainbow (2.1.0)
79
82
  rake (10.5.0)
80
83
  rest-client (1.6.9)
81
84
  mime-types (~> 1.16)
82
- rspec (3.4.0)
83
- rspec-core (~> 3.4.0)
84
- rspec-expectations (~> 3.4.0)
85
- rspec-mocks (~> 3.4.0)
86
- rspec-core (3.4.4)
87
- rspec-support (~> 3.4.0)
88
- rspec-expectations (3.4.0)
85
+ rspec (3.5.0)
86
+ rspec-core (~> 3.5.0)
87
+ rspec-expectations (~> 3.5.0)
88
+ rspec-mocks (~> 3.5.0)
89
+ rspec-core (3.5.3)
90
+ rspec-support (~> 3.5.0)
91
+ rspec-expectations (3.5.0)
89
92
  diff-lcs (>= 1.2.0, < 2.0)
90
- rspec-support (~> 3.4.0)
91
- rspec-mocks (3.4.1)
93
+ rspec-support (~> 3.5.0)
94
+ rspec-mocks (3.5.0)
92
95
  diff-lcs (>= 1.2.0, < 2.0)
93
- rspec-support (~> 3.4.0)
94
- rspec-support (3.4.1)
96
+ rspec-support (~> 3.5.0)
97
+ rspec-support (3.5.0)
95
98
  slop (3.6.0)
96
99
  thor (0.19.1)
97
100
  travis (1.8.2)
@@ -119,3 +122,6 @@ DEPENDENCIES
119
122
  rspec (~> 3.4, >= 3.4.0)
120
123
  shellfold!
121
124
  travis (~> 1.8, >= 1.8.2)
125
+
126
+ BUNDLED WITH
127
+ 1.13.1
@@ -14,10 +14,10 @@ Gem::Specification.new do |spec|
14
14
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
15
15
  spec.executables = ["buildizer"]
16
16
 
17
- spec.required_ruby_version = ">= 2.2.1"
17
+ spec.required_ruby_version = ">= 2.1.0"
18
18
 
19
19
  spec.add_dependency "thor", ">= 0.19.1", "< 1.0"
20
- spec.add_dependency "net_status", ">= 0.0.1", "< 1.0"
20
+ spec.add_dependency "net_status", ">= 0.1.0", "< 1.0"
21
21
  spec.add_dependency "shellfold", ">= 0.0.1", "< 1.0"
22
22
  spec.add_dependency "package_cloud", ">= 0.2", "< 1.0"
23
23
  spec.add_dependency "overcommit", ">= 0.33.0", "< 1.0"
@@ -20,6 +20,7 @@ require 'buildizer/cli/option_mod'
20
20
  require 'buildizer/cli/base'
21
21
  require 'buildizer/cli/main'
22
22
  require 'buildizer/buildizer'
23
+ require 'buildizer/image'
23
24
  require 'buildizer/target'
24
25
  require 'buildizer/target/package_name_mod'
25
26
  require 'buildizer/target/base'
@@ -31,15 +32,15 @@ require 'buildizer/builder/base'
31
32
  require 'buildizer/builder/fpm'
32
33
  require 'buildizer/builder/native'
33
34
  require 'buildizer/builder/patch'
34
- require 'buildizer/image'
35
- require 'buildizer/image/base'
36
- require 'buildizer/image/centos'
37
- require 'buildizer/image/centos6'
38
- require 'buildizer/image/centos7'
39
- require 'buildizer/image/ubuntu'
40
- require 'buildizer/image/ubuntu1204'
41
- require 'buildizer/image/ubuntu1404'
42
- require 'buildizer/image/ubuntu1604'
35
+ require 'buildizer/os'
36
+ require 'buildizer/os/base'
37
+ require 'buildizer/os/centos'
38
+ require 'buildizer/os/centos6'
39
+ require 'buildizer/os/centos7'
40
+ require 'buildizer/os/ubuntu'
41
+ require 'buildizer/os/ubuntu1204'
42
+ require 'buildizer/os/ubuntu1404'
43
+ require 'buildizer/os/ubuntu1604'
43
44
  require 'buildizer/core_ext/string'
44
45
  require 'buildizer/core_ext/hash'
45
46
  require 'buildizer/core_ext/true_class'
@@ -28,13 +28,13 @@ module Buildizer
28
28
  def new_target(target_name)
29
29
  os_name, os_version, target_tag = target_name.split('/', 3)
30
30
 
31
- image = docker.new_image(os_name, os_version)
31
+ os = docker.new_os(os_name, os_version)
32
32
 
33
33
  params = initial_target_params
34
34
  buildizer.buildizer_conf.each do |match_key, match_params|
35
35
  match_os_name, match_os_version, match_target_tag = match_key.to_s.split('/', 3)
36
- if image.os_name.match_glob?(match_os_name) and
37
- ( match_os_version.nil? or image.os_version.match_glob?(match_os_version) ) and
36
+ if os.name.match_glob?(match_os_name) and
37
+ ( match_os_version.nil? or os.version.match_glob?(match_os_version) ) and
38
38
  ( match_target_tag.nil? or (not target_tag.nil? and
39
39
  target_tag.match_glob?(match_target_tag)) )
40
40
  params = merge_params(into: params, params: match_params)
@@ -43,24 +43,37 @@ module Buildizer
43
43
 
44
44
  check_params! params
45
45
 
46
- target_klass.new(self, image, name: target_name, **params).tap do |target|
47
- image.target = target
46
+ target_klass.new(self, os, name: target_name, **params)
47
+ end
48
+
49
+ def target_names
50
+ @target_names ||= begin
51
+ targets = Array(buildizer.buildizer_conf['target'])
52
+ restrict_targets = ENV['BUILDIZER_TARGET']
53
+ restrict_targets = restrict_targets.split(',').map(&:strip) if restrict_targets
54
+ targets = targets & restrict_targets if restrict_targets
55
+ targets
48
56
  end
49
57
  end
50
58
 
51
59
  def targets
52
- @targets ||= buildizer.targets.map {|target_name| new_target(target_name)}
60
+ @targets ||= target_names.map {|name| new_target(name)}
53
61
  end
54
62
 
55
63
  def initial_target_params
56
64
  {}.tap do |params|
57
- params[:package_name] = buildizer.package_name
58
- params[:package_version] = buildizer.package_version
65
+ params[:package_name] = buildizer.buildizer_conf['package_name']
66
+ params[:package_version] = buildizer.buildizer_conf['package_version']
59
67
  params[:package_cloud] = buildizer.package_cloud
60
- params[:prepare] = buildizer.prepare
61
- params[:build_dep] = buildizer.build_dep
62
- params[:before_build] = buildizer.before_build
63
- params[:maintainer] = buildizer.maintainer
68
+ params[:prepare] = Array(buildizer.buildizer_conf['prepare'])
69
+ params[:build_dep] = Array(buildizer.buildizer_conf['build_dep']).to_set
70
+ params[:before_build] = Array(buildizer.buildizer_conf['before_build'])
71
+ params[:maintainer] = buildizer.buildizer_conf['maintainer']
72
+
73
+ params[:test_options] = Hash(buildizer.buildizer_conf['test_options'])
74
+ params[:test_env] = buildizer.buildizer_conf['test_env'].to_h
75
+ params[:before_test] = Array(buildizer.buildizer_conf['before_test'])
76
+ params[:test] = Array(buildizer.buildizer_conf['test'])
64
77
  end
65
78
  end
66
79
 
@@ -80,6 +93,11 @@ module Buildizer
80
93
  res[:build_dep] = into[:build_dep] | Array(params['build_dep']).to_set
81
94
  res[:before_build] = into[:before_build] + Array(params['before_build'])
82
95
  res[:maintainer] = params['maintainer'] || into[:maintainer]
96
+
97
+ res[:test_options] = into[:test_options].merge params['test_options'].to_h
98
+ res[:test_env] = into[:test_env].merge(params['test_env'].to_h)
99
+ res[:before_test] = into[:before_test] + Array(params['before_test'])
100
+ res[:test] = into[:test] + Array(params['test'])
83
101
  end
84
102
  end
85
103
 
@@ -109,20 +127,20 @@ module Buildizer
109
127
 
110
128
  def prepare
111
129
  docker.with_cache do
112
- buildizer.before_prepare
113
- .each {|cmd| buildizer.command! cmd, desc: "Before prepare command: #{cmd}"}
130
+ Array(buildizer.buildizer_conf['before_prepare'])
131
+ .each {|cmd| buildizer.command! cmd, desc: "Before prepare command: #{cmd}"}
114
132
 
115
- targets.each {|target| prepare_target_image(target)}
133
+ targets.each {|target| prepare_target_build_image(target)}
116
134
 
117
- buildizer.after_prepare
118
- .each {|cmd| buildizer.command! cmd, desc: "After prepare command: #{cmd}"}
135
+ Array(buildizer.buildizer_conf['after_prepare'])
136
+ .each {|cmd| buildizer.command! cmd, desc: "After prepare command: #{cmd}"}
119
137
  end # with_cache
120
138
  end
121
139
 
122
- def prepare_target_image(target)
123
- target.prepare.each {|cmd| target.image.instruction(:RUN, "bash -lec \"#{cmd}\"")}
124
- target.image.build_dep(Array(build_dep(target)).to_set + target.build_dep)
125
- docker.build_image! target
140
+ def prepare_target_build_image(target)
141
+ target.prepare.each {|cmd| target.build_image.instruction(:RUN, "bash -lec \"#{cmd}\"")}
142
+ target.os.build_dep(target.build_image, Array(build_dep(target)).to_set + target.build_dep)
143
+ docker.make_build_image target
126
144
  end
127
145
 
128
146
  def build
@@ -148,8 +166,98 @@ module Buildizer
148
166
  *Array(build_instructions(target)),
149
167
  ]
150
168
 
151
- docker.run_in_image!(target: target, cmd: cmd,
152
- desc: "Run build in docker image '#{target.image.name}'")
169
+ docker.run_in_image! image: target.build_image,
170
+ cmd: cmd,
171
+ desc: "Run build in docker image '#{target.build_image.name}'"
172
+ end
173
+
174
+ def test
175
+ failures = targets
176
+ .map {|target| [target, Array(test_target(target))]}
177
+ .reduce([]) {|res, (target, results)|
178
+ res.push *results.map {|res|
179
+ {target: target,
180
+ result: res}
181
+ }
182
+ }
183
+ .select {|test| test[:result].net_status_error?}
184
+
185
+ if failures.any?
186
+ puts
187
+ puts "Buildizer test FAILED:"
188
+ failures.each do |failure|
189
+ puts "* #{failure[:target].name} env=#{failure[:result][:data][:env]}"
190
+ puts failure[:result][:message]
191
+ puts
192
+ end
193
+
194
+ raise Error, message: "test failed"
195
+ end
196
+ end
197
+
198
+ def test_target(target)
199
+ unless target.test.any? or buildizer.options[:shell]
200
+ buildizer.warn "No tests found for target '#{target.name}' (use directive 'test')"
201
+ return
202
+ end
203
+
204
+ target
205
+ .test_env
206
+ .map {|env| test_target_env(target, env)}
207
+ end
208
+
209
+ def install_test_package_instructions(target)
210
+ target.os.install_test_package_instructions(target)
211
+ end
212
+
213
+ def prepare_test_container_instructions(target)
214
+ target.os.prepare_test_container_instructions(target)
215
+ end
216
+
217
+ def test_target_env(target, env)
218
+ container_name = SecureRandom.uuid
219
+ docker_opts = (target.test_options['docker'] || {}).zymbolize_keys
220
+
221
+ docker.with_container(
222
+ name: container_name,
223
+ image: target.test_image,
224
+ env: env.merge(TERM: ENV['TERM']),
225
+ docker_opts: docker_opts,
226
+ desc: "Run test container '#{container_name}' " +
227
+ "target='#{target.name}' env=#{env}"
228
+ ) do |container|
229
+ before_test_cmd = [*Array(prepare_package_source_instructions(target)),
230
+ *Array(prepare_test_container_instructions(target)),
231
+ *Array(install_test_package_instructions(target)),
232
+ "cd #{docker.container_package_path}",
233
+ *target.before_test]
234
+
235
+ docker.run_in_container! container: container,
236
+ cmd: before_test_cmd,
237
+ docker_opts: {tty: true},
238
+ desc: "Run before_test stage in test container '#{container}'"
239
+
240
+ ret = {data: {env: env}}
241
+
242
+ if buildizer.options[:shell]
243
+ docker.shell_in_container container: container
244
+ else
245
+ test_cmd = ["cd #{docker.container_package_path}", *target.test]
246
+
247
+ res = docker.run_in_container container: container,
248
+ cmd: test_cmd,
249
+ cmd_opts: {live_log: true, log_failure: false},
250
+ docker_opts: {tty: true},
251
+ desc: "Run test stage in test container '#{container}'"
252
+
253
+ unless res.status.success?
254
+ ret[:error] = :error
255
+ ret[:message] = res.stdout + res.stderr
256
+ end
257
+ end
258
+
259
+ ret
260
+ end # with_container
153
261
  end
154
262
 
155
263
  def deploy
@@ -184,7 +292,7 @@ module Buildizer
184
292
  end
185
293
 
186
294
  def deploy_target(target)
187
- cmd = Dir[target.image_build_path.join("*.#{target.image.fpm_output_type}")]
295
+ cmd = Dir[target.image_build_path.join("*.#{target.os.fpm_output_type}")]
188
296
  .map {|p| Pathname.new(p)}.map {|package_path|
189
297
  package = package_path.basename
190
298
  target.package_cloud.map do |desc|
@@ -84,12 +84,12 @@ module Buildizer
84
84
  ["fpm -s dir",
85
85
  "--force",
86
86
  "-p #{docker.container_build_path}",
87
- "-t #{target.image.fpm_output_type}",
87
+ "-t #{target.os.fpm_output_type}",
88
88
  "-n #{target.package_name}",
89
89
  "--version=#{version}",
90
90
  "--iteration=#{release}",
91
91
  *fpm_script.values.map {|desc| "#{desc[:fpm_option]}=#{desc[:container_file]}"},
92
- *Array(target.image.fpm_extra_params),
92
+ *Array(target.os.fpm_extra_params),
93
93
  (target.maintainer ? "--maintainer=\"#{target.maintainer}\"" : nil),
94
94
  (target.fpm_description ? "--description=\"#{target.fpm_description}\"" : nil),
95
95
  (target.fpm_url ? "--url=\"#{target.fpm_url}\"" : nil),
@@ -15,7 +15,7 @@ module Buildizer
15
15
  end
16
16
 
17
17
  def build_instructions(target)
18
- target.image.native_build_instructions(self, target)
18
+ target.os.native_build_instructions(target)
19
19
  end
20
20
  end # Native
21
21
  end # Builder
@@ -29,11 +29,11 @@ module Buildizer
29
29
  end
30
30
 
31
31
  def build_instructions(target)
32
- target.image.patch_build_instructions(self, target)
32
+ target.os.patch_build_instructions(target)
33
33
  end
34
34
 
35
35
  def build_dep(target)
36
- target.image.patch_build_dep(self, target)
36
+ target.os.patch_build_dep(target)
37
37
  end
38
38
  end # Patch
39
39
  end # Builder
@@ -48,19 +48,27 @@ module Buildizer
48
48
  end
49
49
  end
50
50
 
51
- def prepare!
51
+ def prepare
52
52
  builder.prepare
53
53
  end
54
54
 
55
- def build!
55
+ def build
56
56
  builder.build
57
57
  end
58
58
 
59
- def deploy!
59
+ def test
60
+ raise(
61
+ Error, message: "cannot run test shell in non interactive mode"
62
+ ) if options[:shell] and not interactive?
63
+
64
+ builder.test
65
+ end
66
+
67
+ def deploy
60
68
  builder.deploy
61
69
  end
62
70
 
63
- def verify!
71
+ def verify
64
72
  builder.verify
65
73
  end
66
74