buildizer 0.1.0 → 0.1.1

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
- 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