cicd-builder 0.9.43 → 0.9.44
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 +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
|