cicd-builder 0.9.43 → 0.9.44
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/cicd/builder.rb +9 -2
- data/lib/cicd/builder/mixlib/environment.rb +21 -2
- data/lib/cicd/builder/mixlib/errors.rb +9 -0
- data/lib/cicd/builder/mixlib/repo.rb +21 -3
- data/lib/cicd/builder/mixlib/repo/S3.rb +375 -58
- data/lib/cicd/builder/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be47ca1bd0f4693e4b88daf215d83657cea3eab6
|
4
|
+
data.tar.gz: 90d1904eba2ecdaa0ae0c64ccf0ba6c83632fb91
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42fac91c4652e1e509eed4cc9de9b7f097cf86bf4e46327146b22938ccb2a010e696a8e77dbf4d5af43170bba493cdf7f07389e7b3e2c0006b5f3457bdeab24e
|
7
|
+
data.tar.gz: d4edf11d4058baf5d37a22fc09158139083936c0bf20991f773b222f074f2a54a2c3d9125a340f4464c670c6d141e82f5566e92939c2ada597005da986215b84
|
data/Gemfile.lock
CHANGED
data/lib/cicd/builder.rb
CHANGED
@@ -68,11 +68,18 @@ module CiCd
|
|
68
68
|
setup()
|
69
69
|
|
70
70
|
ret = 0
|
71
|
-
%w(checkEnvironment getVars
|
71
|
+
%w(checkEnvironment getVars).each do |step|
|
72
72
|
@logger.step "#{step}"
|
73
73
|
ret = send(step)
|
74
74
|
break unless ret == 0
|
75
|
-
|
75
|
+
end
|
76
|
+
if ret == 0
|
77
|
+
@vars[:actions].each do |step|
|
78
|
+
@logger.step "#{step}"
|
79
|
+
ret = send(step)
|
80
|
+
break unless ret == 0
|
81
|
+
end
|
82
|
+
end
|
76
83
|
|
77
84
|
@vars[:return_code]
|
78
85
|
end
|
@@ -38,7 +38,8 @@ module CiCd
|
|
38
38
|
@vars[:variant] = 'SNAPSHOT'
|
39
39
|
|
40
40
|
if ENV.has_key?('PROJECT_NAME')
|
41
|
-
|
41
|
+
@vars[:product] =
|
42
|
+
@vars[:project_name] = ENV['PROJECT_NAME']
|
42
43
|
end
|
43
44
|
|
44
45
|
if ENV.has_key?('RELEASE')
|
@@ -63,6 +64,10 @@ module CiCd
|
|
63
64
|
@vars[:build_store] = "#{ENV['BUILD_STORE']}"
|
64
65
|
end
|
65
66
|
|
67
|
+
if ENV.has_key?('BRANCH')
|
68
|
+
@vars[:branch] = "#{ENV['BRANCH']}"
|
69
|
+
end
|
70
|
+
|
66
71
|
if ENV.has_key?('VARIANT')
|
67
72
|
@vars[:variant] = "#{ENV['VARIANT']}"
|
68
73
|
end
|
@@ -71,7 +76,21 @@ module CiCd
|
|
71
76
|
@vars[:build_num] = "#{ENV['BUILD_NUMBER']}"
|
72
77
|
end
|
73
78
|
|
74
|
-
|
79
|
+
if ENV.has_key?('ACTIONS')
|
80
|
+
@vars[:actions] = ENV['ACTIONS'].split(%r'[, \t]+')
|
81
|
+
else
|
82
|
+
@vars[:actions] = %w(prepareBuild makeBuild saveBuild uploadBuildArtifacts)
|
83
|
+
end
|
84
|
+
|
85
|
+
if ENV.has_key?('TREE')
|
86
|
+
@vars[:tree] = ENV['TREE']
|
87
|
+
end
|
88
|
+
|
89
|
+
if ENV.has_key?('PRUNER')
|
90
|
+
@vars[:pruner] = ENV['PRUNER']
|
91
|
+
end
|
92
|
+
|
93
|
+
@vars[:return_code] = getLatest()
|
75
94
|
end
|
76
95
|
|
77
96
|
# ---------------------------------------------------------------------------------------------------------------
|
@@ -39,6 +39,15 @@ module CiCd
|
|
39
39
|
NO_PROJECT_NAMES = i+=1
|
40
40
|
NO_PROJECTS_PATH = i+=1
|
41
41
|
TEMP_FILE_MISSING = i+=1
|
42
|
+
PRUNE_BAD_REPO = i+=1
|
43
|
+
PRUNE_NO_TREE = i+=1
|
44
|
+
PRUNE_NO_VARIANT = i+=1
|
45
|
+
PRUNE_NO_PRUNER = i+=1
|
46
|
+
PRUNE_TOO_OLD = i+=1
|
47
|
+
PRUNE_VARIANT_MIA = i+=1
|
48
|
+
PRUNE_BAD_BRANCH = i+=1
|
49
|
+
PRUNE_BAD_VERSION = i+=1
|
50
|
+
PRUNE_BAD_PRUNER = i+=1
|
42
51
|
|
43
52
|
require 'awesome_print'
|
44
53
|
|
@@ -32,19 +32,37 @@ module CiCd
|
|
32
32
|
end
|
33
33
|
|
34
34
|
# ---------------------------------------------------------------------------------------------------------------
|
35
|
-
def
|
35
|
+
def performOnRepoInstance(verb)
|
36
36
|
@logger.step __method__.to_s
|
37
37
|
clazz = getRepoClass()
|
38
38
|
if clazz.is_a?(Class) and not clazz.nil?
|
39
39
|
@repo = clazz.new(self)
|
40
|
-
|
40
|
+
method = @repo.method(verb)
|
41
|
+
if method.owner == clazz
|
42
|
+
@vars[:return_code] = @repo.send(verb)
|
43
|
+
else
|
44
|
+
@logger.error "#{clazz.name.to_s} cannot do action #{verb}"
|
45
|
+
@vars[:return_code] = Errors::BUILDER_REPO_ACTION
|
46
|
+
end
|
41
47
|
else
|
42
|
-
@logger.error "
|
48
|
+
@logger.error "#{clazz.name.to_s} is not a valid repo class"
|
43
49
|
@vars[:return_code] = Errors::BUILDER_REPO_TYPE
|
44
50
|
end
|
45
51
|
@vars[:return_code]
|
46
52
|
end
|
47
53
|
|
54
|
+
# ---------------------------------------------------------------------------------------------------------------
|
55
|
+
def uploadBuildArtifacts()
|
56
|
+
@logger.step __method__.to_s
|
57
|
+
performOnRepoInstance(__method__.to_s)
|
58
|
+
end
|
59
|
+
|
60
|
+
# ---------------------------------------------------------------------------------------------------------------
|
61
|
+
def pruneRepo()
|
62
|
+
@logger.step __method__.to_s
|
63
|
+
performOnRepoInstance(__method__.to_s)
|
64
|
+
end
|
65
|
+
|
48
66
|
# ---------------------------------------------------------------------------------------------------------------
|
49
67
|
def manifestMetadata
|
50
68
|
manifest = @vars[:build_mdd].dup
|
@@ -125,55 +125,35 @@ EC2 Instance profile
|
|
125
125
|
nil
|
126
126
|
rescue Aws::S3::Errors::NoSuchKey
|
127
127
|
nil
|
128
|
+
rescue Aws::S3::Errors::Forbidden
|
129
|
+
nil
|
130
|
+
rescue Exception => e
|
131
|
+
nil
|
128
132
|
end
|
133
|
+
# noinspection RubyUnnecessaryReturnValue
|
129
134
|
s3_obj
|
130
135
|
end
|
131
136
|
|
132
137
|
# ---------------------------------------------------------------------------------------------------------------
|
133
|
-
def
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
h[value] = h.keys.size # No -1 because this is evaluated BEFORE we make the addition!
|
140
|
-
end
|
141
|
-
s = h.sort_by { |_, v| v }
|
142
|
-
s = s.map { |v| v[0] }
|
143
|
-
hash[key] = s
|
144
|
-
h[value]
|
138
|
+
def _update(hash, key, value)
|
139
|
+
h = {}
|
140
|
+
i = -1
|
141
|
+
hash[key].each { |v| h[v] = i+=1 }
|
142
|
+
unless h.has_key?(value)
|
143
|
+
h[value] = h.keys.size # No -1 because this is evaluated BEFORE we make the addition!
|
145
144
|
end
|
145
|
+
s = h.sort_by { |_, v| v }
|
146
|
+
s = s.map { |v| v[0] }
|
147
|
+
hash[key] = s
|
148
|
+
h[value]
|
149
|
+
end
|
146
150
|
|
147
|
-
|
148
|
-
|
149
|
-
json = nil
|
151
|
+
# ---------------------------------------------------------------------------------------------------------------
|
152
|
+
def takeInventory()
|
150
153
|
varianth = nil
|
151
|
-
|
152
|
-
key
|
153
|
-
|
154
|
-
# If the inventory has started then add to it else create a new one
|
155
|
-
if s3_obj.nil?
|
156
|
-
# Start a new inventory
|
157
|
-
over = true
|
158
|
-
else
|
159
|
-
resp = s3_obj.get()
|
160
|
-
body = resp.body
|
161
|
-
if body.is_a?(String)
|
162
|
-
json_s = resp.data
|
163
|
-
else
|
164
|
-
body.rewind
|
165
|
-
json_s = body.read()
|
166
|
-
end
|
167
|
-
json = Yajl::Parser.parse(json_s)
|
168
|
-
over = false
|
169
|
-
# Is the inventory format up to date ...
|
170
|
-
constraint = ::Semverse::Constraint.new "<= #{@options[:gen]}"
|
171
|
-
version = ::Semverse::Version.new(json['gen'])
|
172
|
-
# raise CiCd::Builder::Errors::InvalidVersion.new "The constraint failed: #{json['gen']} #{constraint}"
|
173
|
-
|
174
|
-
unless constraint.satisfies?(version)
|
175
|
-
raise CiCd::Builder::Errors::InvalidVersion.new "The inventory generation is newer than I can manage: #{version} <=> #{@options[:gen]}"
|
176
|
-
end
|
154
|
+
# Read and parse in JSON
|
155
|
+
key, json, over = pullInventory()
|
156
|
+
unless json.nil?
|
177
157
|
if json['container'] and json['container']['variants']
|
178
158
|
# but does not have our variant then add it
|
179
159
|
variants = json['container']['variants']
|
@@ -231,18 +211,7 @@ EC2 Instance profile
|
|
231
211
|
varianth['builds'] << filing
|
232
212
|
end
|
233
213
|
build_lst = (varianth['builds'].size-1)
|
234
|
-
build_rel = build_lst
|
235
|
-
i = -1
|
236
|
-
varianth['builds'].each{ |h|
|
237
|
-
i += 1
|
238
|
-
convert_build(h)
|
239
|
-
convert_build(varianth['builds'][build_rel])
|
240
|
-
if h['release'].to_i > varianth['builds'][build_rel]['release'].to_i
|
241
|
-
build_rel = i
|
242
|
-
elsif h['release'] == varianth['builds'][build_rel]['release']
|
243
|
-
build_rel = i if h['build_number'].to_i > varianth['builds'][build_rel]['build_number'].to_i
|
244
|
-
end
|
245
|
-
}
|
214
|
+
build_rel = _getLatestRelease(build_lst, varianth)
|
246
215
|
|
247
216
|
# Add new branch ...
|
248
217
|
build_bra = _update(varianth, 'branches', @vars[:build_bra])
|
@@ -259,14 +228,18 @@ EC2 Instance profile
|
|
259
228
|
json['gen'] = @options[:gen]
|
260
229
|
json_s = JSON.pretty_generate( json, { indent: "\t", space: ' '})
|
261
230
|
end
|
231
|
+
pushInventory(json_s, key)
|
232
|
+
end
|
233
|
+
|
234
|
+
def pushInventory(json_s, key)
|
262
235
|
begin
|
263
236
|
md5 = Digest::MD5.hexdigest(json_s)
|
264
237
|
# [:'x-amz-meta-digest'] = "md5=#{md5}"
|
265
|
-
resp = getS3.put_object(
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
238
|
+
resp = getS3.put_object(bucket: ENV['AWS_S3_BUCKET'],
|
239
|
+
key: key,
|
240
|
+
body: json_s,
|
241
|
+
# acl: 'authenticated-read',
|
242
|
+
metadata: {checksum: md5, digest: "md5=#{md5}"},
|
270
243
|
)
|
271
244
|
s3_obj = maybeS3Object(key)
|
272
245
|
# s3_obj.etag
|
@@ -278,6 +251,114 @@ EC2 Instance profile
|
|
278
251
|
end
|
279
252
|
end
|
280
253
|
|
254
|
+
# ---------------------------------------------------------------------------------------------------------------
|
255
|
+
def _getLatestRelease(build_lst, varianth)
|
256
|
+
build_rel = build_lst
|
257
|
+
i = -1
|
258
|
+
varianth['builds'].each { |h|
|
259
|
+
i += 1
|
260
|
+
convert_build(h)
|
261
|
+
convert_build(varianth['builds'][build_rel])
|
262
|
+
if h['release'].to_f > varianth['builds'][build_rel]['release'].to_f
|
263
|
+
build_rel = i
|
264
|
+
elsif h['release'] == varianth['builds'][build_rel]['release']
|
265
|
+
build_rel = i if h['build_number'].to_i > varianth['builds'][build_rel]['build_number'].to_i
|
266
|
+
end
|
267
|
+
}
|
268
|
+
build_rel
|
269
|
+
end
|
270
|
+
|
271
|
+
# ---------------------------------------------------------------------------------------------------------------
|
272
|
+
def _getLatestBranch(build_lst, varianth)
|
273
|
+
# noinspection RubyHashKeysTypesInspection
|
274
|
+
map = Hash[varianth['branches'].map.with_index.to_a]
|
275
|
+
build_bra = map[_getBranch(@vars, varianth['builds'][build_lst])]
|
276
|
+
|
277
|
+
i = -1
|
278
|
+
varianth['builds'].each { |h|
|
279
|
+
i += 1
|
280
|
+
convert_build(h)
|
281
|
+
brah = _getBranch(@vars, h)
|
282
|
+
bral = _getBranch(@vars, varianth['builds'][build_bra])
|
283
|
+
if map[brah] > map[bral]
|
284
|
+
build_bra = map[brah]
|
285
|
+
end
|
286
|
+
}
|
287
|
+
build_bra
|
288
|
+
end
|
289
|
+
|
290
|
+
# ---------------------------------------------------------------------------------------------------------------
|
291
|
+
def _getLatestVersion(build_lst, varianth)
|
292
|
+
# noinspection RubyHashKeysTypesInspection
|
293
|
+
map = Hash[varianth['versions'].map.with_index.to_a]
|
294
|
+
build_ver = map[_getVersion(@vars, varianth['builds'][build_lst])]
|
295
|
+
|
296
|
+
verl = _getVersion(@vars, varianth['builds'][build_ver])
|
297
|
+
gt = ::Semverse::Constraint.new "> #{verl}"
|
298
|
+
eq = ::Semverse::Constraint.new "= #{verl}"
|
299
|
+
|
300
|
+
i = -1
|
301
|
+
varianth['builds'].each { |h|
|
302
|
+
i += 1
|
303
|
+
convert_build(h)
|
304
|
+
verh = _getVersion(@vars, h)
|
305
|
+
version = ::Semverse::Version.new(verh)
|
306
|
+
if gt.satisfies?(version)
|
307
|
+
build_ver = map[verh]
|
308
|
+
build_lst = i
|
309
|
+
gt = ::Semverse::Constraint.new "> #{verh}"
|
310
|
+
eq = ::Semverse::Constraint.new "= #{verh}"
|
311
|
+
elsif eq.satisfies?(version)
|
312
|
+
if h['build_number'].to_i > varianth['builds'][build_lst]['build_number'].to_i
|
313
|
+
build_ver = map[verh]
|
314
|
+
build_lst = i
|
315
|
+
gt = ::Semverse::Constraint.new "> #{verh}"
|
316
|
+
eq = ::Semverse::Constraint.new "= #{verh}"
|
317
|
+
end
|
318
|
+
end
|
319
|
+
}
|
320
|
+
build_ver
|
321
|
+
end
|
322
|
+
|
323
|
+
# ---------------------------------------------------------------------------------------------------------------
|
324
|
+
def pullInventory()
|
325
|
+
json = nil
|
326
|
+
key, s3_obj = checkForInventory()
|
327
|
+
# If the inventory has started then add to it else create a new one
|
328
|
+
if s3_obj.nil?
|
329
|
+
# Start a new inventory
|
330
|
+
over = true
|
331
|
+
else
|
332
|
+
resp = s3_obj.get()
|
333
|
+
body = resp.body
|
334
|
+
if body.is_a?(String)
|
335
|
+
json_s = resp.data
|
336
|
+
else
|
337
|
+
body.rewind
|
338
|
+
json_s = body.read()
|
339
|
+
end
|
340
|
+
json = Yajl::Parser.parse(json_s)
|
341
|
+
over = false
|
342
|
+
# Is the inventory format up to date ...
|
343
|
+
constraint = ::Semverse::Constraint.new "<= #{@options[:gen]}"
|
344
|
+
version = ::Semverse::Version.new(json['gen'])
|
345
|
+
# raise CiCd::Builder::Errors::InvalidVersion.new "The constraint failed: #{json['gen']} #{constraint}"
|
346
|
+
|
347
|
+
unless constraint.satisfies?(version)
|
348
|
+
raise CiCd::Builder::Errors::InvalidVersion.new "The inventory generation is newer than I can manage: #{version} <=> #{@options[:gen]}"
|
349
|
+
end
|
350
|
+
end
|
351
|
+
return key, json, over
|
352
|
+
end
|
353
|
+
|
354
|
+
# ---------------------------------------------------------------------------------------------------------------
|
355
|
+
def checkForInventory
|
356
|
+
key = "#{@vars[:project_name]}/INVENTORY.json"
|
357
|
+
s3_obj = maybeS3Object(key)
|
358
|
+
return key, s3_obj
|
359
|
+
end
|
360
|
+
|
361
|
+
# ---------------------------------------------------------------------------------------------------------------
|
281
362
|
def convert_build(h)
|
282
363
|
if h.has_key?('number')
|
283
364
|
h['build_number'] = h['number']
|
@@ -354,6 +435,242 @@ EC2 Instance profile
|
|
354
435
|
@vars[:return_code]
|
355
436
|
end
|
356
437
|
|
438
|
+
# noinspection RubyHashKeysTypesInspection,RubyHashKeysTypesInspection
|
439
|
+
# @param Hash args
|
440
|
+
def _getMatches(args, name, match)
|
441
|
+
args = args.dup
|
442
|
+
args[:version] = '[0-9\.]+'
|
443
|
+
args[:release] = '[0-9\.]+'
|
444
|
+
args[:branch] = '[^-]+'
|
445
|
+
args[:build] = '\d+'
|
446
|
+
map = [ :product,:version,:branch,:build ]
|
447
|
+
matches = name.match(/^(#{args[:product]})-(#{args[:version]})-(#{args[:branch]})-build-(\d+)$/)
|
448
|
+
unless matches
|
449
|
+
map = [ :product,:version,:branch,:variant,:build ]
|
450
|
+
matches = name.match(/^(#{args[:product]})-(#{args[:version]})-(#{args[:branch]})-(#{args[:variant]})-build-(\d+)$/)
|
451
|
+
unless matches
|
452
|
+
map = [ :product,:version,:release,:branch,:variant,:build ]
|
453
|
+
matches = name.match(/^(#{args[:product]})-(#{args[:version]})-release-(#{args[:release]})-(#{args[:branch]})-(#{args[:variant]})-build-(\d+)$/)
|
454
|
+
unless matches
|
455
|
+
name = name.dup
|
456
|
+
map.each { |key|
|
457
|
+
if key == match
|
458
|
+
break
|
459
|
+
elsif key == :release
|
460
|
+
name.gsub!(/^release-/, '')
|
461
|
+
elsif key == :build
|
462
|
+
name.gsub!(/^build-/, '')
|
463
|
+
end
|
464
|
+
name.gsub!(/^#{args[key]}-/, '')
|
465
|
+
}
|
466
|
+
map.reverse.each { |key|
|
467
|
+
if key == match
|
468
|
+
break
|
469
|
+
end
|
470
|
+
name.gsub!(/-#{args[key]}$/, '')
|
471
|
+
if key == :release
|
472
|
+
name.gsub!(/-release$/, '')
|
473
|
+
elsif key == :build
|
474
|
+
name.gsub!(/-build$/, '')
|
475
|
+
end
|
476
|
+
}
|
477
|
+
return name
|
478
|
+
end
|
479
|
+
end
|
480
|
+
end
|
481
|
+
if matches
|
482
|
+
map = Hash[map.map.with_index.to_a]
|
483
|
+
if map.has_key? match
|
484
|
+
matches[map[match]+1] # 0 is the whole thing
|
485
|
+
else
|
486
|
+
nil
|
487
|
+
end
|
488
|
+
else
|
489
|
+
nil
|
490
|
+
end
|
491
|
+
end
|
492
|
+
|
493
|
+
def _getBuildNumber(args,drawer, naming = nil)
|
494
|
+
name = drawer['build_name'] rescue drawer['build']
|
495
|
+
drawer['build_number'] || _getMatches(args, name, :build)
|
496
|
+
end
|
497
|
+
|
498
|
+
def _getVersion(args,drawer, naming = nil)
|
499
|
+
name = drawer['build_name'] rescue drawer['build']
|
500
|
+
drawer['version'] || _getMatches(args, name, :version)
|
501
|
+
end
|
502
|
+
|
503
|
+
def _getRelease(args,drawer, naming = nil)
|
504
|
+
name = drawer['build_name'] rescue drawer['build']
|
505
|
+
drawer['release'] || _getMatches(args, name, :release)
|
506
|
+
end
|
507
|
+
|
508
|
+
def _getBranch(args,drawer, naming = nil)
|
509
|
+
name = drawer['build_name'] rescue drawer['build']
|
510
|
+
drawer['branch'] || _getMatches(args, name, :branch)
|
511
|
+
end
|
512
|
+
|
513
|
+
def first(builds, pruner)
|
514
|
+
raise "Bad syntax: #{__method__}{ #{pruner.join(' ')}" unless pruner.size == 1
|
515
|
+
count = pruner[0].to_i
|
516
|
+
count > 0 ? builds[0..(count-1)] : []
|
517
|
+
end
|
518
|
+
|
519
|
+
def last(builds, pruner)
|
520
|
+
raise "Bad syntax: #{__method__} #{pruner.join(' ')}" unless pruner.size == 1
|
521
|
+
count = pruner[0].to_i
|
522
|
+
count > 0 ? builds[(-1-count+1)..-1] : []
|
523
|
+
end
|
524
|
+
|
525
|
+
def keep(builds, pruner)
|
526
|
+
prune builds, pruner
|
527
|
+
end
|
528
|
+
|
529
|
+
def drop(builds, pruner)
|
530
|
+
raise "Bad syntax: drop #{pruner.join(' ')}" unless pruner.size == 2
|
531
|
+
case pruner[0]
|
532
|
+
when 'first'
|
533
|
+
prune builds, [ 'keep', 'last', pruner[-1] ]
|
534
|
+
when 'last'
|
535
|
+
prune builds, [ 'keep', 'first', builds.size-pruner[-1].to_i ]
|
536
|
+
when /\d+/
|
537
|
+
prune builds, [ 'keep', pruner[-2], pruner[-1] ]
|
538
|
+
else
|
539
|
+
raise "Bad syntax: drop #{pruner.join(' ')}"
|
540
|
+
end
|
541
|
+
end
|
542
|
+
|
543
|
+
# ---------------------------------------------------------------------------------------------------------------
|
544
|
+
def prune(builds, pruner)
|
545
|
+
if pruner.size > 0
|
546
|
+
blds = builds.dup
|
547
|
+
eval("blds = #{pruner[0]} blds, #{pruner[1..-1]}")
|
548
|
+
blds
|
549
|
+
else
|
550
|
+
builds
|
551
|
+
end
|
552
|
+
end
|
553
|
+
|
554
|
+
# ---------------------------------------------------------------------------------------------------------------
|
555
|
+
def pruneRepo()
|
556
|
+
@logger.step __method__.to_s
|
557
|
+
# Read and parse in JSON
|
558
|
+
key, json, over = pullInventory()
|
559
|
+
if json.nil?
|
560
|
+
@logger.error "Bad repo/inventory specified. s3://#{ENV['AWS_S3_BUCKET']}/#{key}"
|
561
|
+
@vars[:return_code] = Errors::PRUNE_BAD_REPO
|
562
|
+
else
|
563
|
+
if @vars[:variant]
|
564
|
+
if @vars[:tree]
|
565
|
+
if @vars[:pruner]
|
566
|
+
if json['container'] and json['container']['variants']
|
567
|
+
# but does not have our variant ...
|
568
|
+
variants = json['container']['variants']
|
569
|
+
if variants[@vars[:variant]]
|
570
|
+
varianth = variants[@vars[:variant]]
|
571
|
+
# If the inventory 'latest' format is up to date ...
|
572
|
+
if varianth['latest'] and varianth['latest'].is_a?(Hash)
|
573
|
+
builds = varianth['builds']
|
574
|
+
branches = varianth['branches']
|
575
|
+
versions = varianth['versions']
|
576
|
+
case @vars[:tree]
|
577
|
+
when %r'variants?'
|
578
|
+
variants.delete(@vars[:pruner])
|
579
|
+
when %r'versions?'
|
580
|
+
if varianth['versions'].include?(@vars[:pruner])
|
581
|
+
survivors = builds.select{ |drawer|
|
582
|
+
ver = _getVersion(@vars, drawer)
|
583
|
+
ver != @vars[:pruner]
|
584
|
+
}
|
585
|
+
varianth['builds'] = survivors
|
586
|
+
varianth['versions'] = varianth['versions'].select{|ver| ver != @vars[:pruner] }
|
587
|
+
else
|
588
|
+
@logger.error "Cannot prune the version '#{@vars[:pruner]}' from variant '#{@vars[:variant]}'"
|
589
|
+
@vars[:return_code] = Errors::PRUNE_BAD_VERSION
|
590
|
+
end
|
591
|
+
when %r'branch(|es)'
|
592
|
+
if varianth['branches'].include?(@vars[:pruner])
|
593
|
+
survivors = builds.select{ |drawer|
|
594
|
+
bra = _getBranch(@vars, drawer)
|
595
|
+
bra != @vars[:pruner]
|
596
|
+
}
|
597
|
+
varianth['builds'] = survivors
|
598
|
+
varianth['branches'] = varianth['branches'].select{|bra| bra != @vars[:pruner] }
|
599
|
+
else
|
600
|
+
@logger.error "Cannot prune the branch '#{@vars[:pruner]}' from variant '#{@vars[:variant]}'"
|
601
|
+
@vars[:return_code] = Errors::PRUNE_BAD_BRANCH
|
602
|
+
end
|
603
|
+
when %r'builds?'
|
604
|
+
# noinspection RubyHashKeysTypesInspection
|
605
|
+
begin
|
606
|
+
builds = prune(builds, @vars[:pruner].split(/\s+/))
|
607
|
+
varianth['builds'] = builds
|
608
|
+
branches = builds.map{ |bld|
|
609
|
+
_getBranch(@vars, bld)
|
610
|
+
}
|
611
|
+
varianth['branches'] = Hash[branches.map.with_index.to_a].keys
|
612
|
+
versions = builds.map{ |bld|
|
613
|
+
_getVersion(@vars, bld)
|
614
|
+
}
|
615
|
+
varianth['versions'] = Hash[versions.map.with_index.to_a].keys
|
616
|
+
rescue Exception => e
|
617
|
+
@logger.error "Cannot prune the builds '#{e.message}'"
|
618
|
+
@vars[:return_code] = Errors::PRUNE_BAD_PRUNER
|
619
|
+
end
|
620
|
+
else
|
621
|
+
@logger.error "Bad 'TREE' specified. Only 'branches', 'builds', 'versions' and 'variant' can be pruned"
|
622
|
+
@vars[:return_code] = Errors::PRUNE_NO_TREE
|
623
|
+
end
|
624
|
+
if 0 == @vars[:return_code]
|
625
|
+
build_lst = (varianth['builds'].size-1)
|
626
|
+
build_rel = _getLatestRelease(build_lst, varianth)
|
627
|
+
# Latest branch ...
|
628
|
+
build_bra = _getLatestBranch(build_lst, varianth)
|
629
|
+
# Latest version ...
|
630
|
+
build_ver = _getLatestVersion(build_lst, varianth)
|
631
|
+
|
632
|
+
# Set latest
|
633
|
+
varianth['latest'] = {
|
634
|
+
branch: build_bra,
|
635
|
+
version: build_ver,
|
636
|
+
build: build_lst,
|
637
|
+
release: build_rel,
|
638
|
+
}
|
639
|
+
json_s = JSON.pretty_generate( json, { indent: "\t", space: ' '})
|
640
|
+
pushInventory(json_s, key)
|
641
|
+
end
|
642
|
+
else
|
643
|
+
# Start over ... too old/ incompatible
|
644
|
+
@logger.error 'Repo too old or incompatible to prune. No [container][variants][VARIANT][latest].'
|
645
|
+
@vars[:return_code] = Errors::PRUNE_TOO_OLD
|
646
|
+
end
|
647
|
+
else
|
648
|
+
@logger.error "Variant '#{@vars[:variant]}' not present."
|
649
|
+
@vars[:return_code] = Errors::PRUNE_VARIANT_MIA
|
650
|
+
end
|
651
|
+
else
|
652
|
+
# Start over ... too old/ incompatible
|
653
|
+
@logger.error 'Repo too old or incompatible to prune. No [container][variants].'
|
654
|
+
@vars[:return_code] = Errors::PRUNE_TOO_OLD
|
655
|
+
end
|
656
|
+
else
|
657
|
+
@logger.error "No 'PRUNER' specified"
|
658
|
+
@vars[:return_code] = Errors::PRUNE_NO_PRUNER
|
659
|
+
end
|
660
|
+
else
|
661
|
+
@logger.error "No 'TREE' specified"
|
662
|
+
@vars[:return_code] = Errors::PRUNE_NO_TREE
|
663
|
+
end
|
664
|
+
else
|
665
|
+
@logger.error "No 'VARIANT' specified"
|
666
|
+
@vars[:return_code] = Errors::PRUNE_NO_VARIANT
|
667
|
+
end
|
668
|
+
end
|
669
|
+
@vars[:return_code]
|
670
|
+
end
|
671
|
+
|
672
|
+
private :_update, :checkForInventory, :pullInventory
|
673
|
+
|
357
674
|
end
|
358
675
|
end
|
359
676
|
end
|
data/lib/cicd/builder/version.rb
CHANGED
@@ -4,7 +4,7 @@ module CiCd
|
|
4
4
|
# file = File.expand_path("#{File.dirname(__FILE__)}/../../../VERSION")
|
5
5
|
# lines = File.readlines(file)
|
6
6
|
# version = lines[0]
|
7
|
-
version = '0.9.
|
7
|
+
version = '0.9.44'
|
8
8
|
VERSION = version unless const_defined?('VERSION')
|
9
9
|
major, minor, tiny = VERSION.split('.')
|
10
10
|
MAJOR = major unless const_defined?('MAJOR')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cicd-builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.44
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christo De Lange
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|