cicd-builder 0.9.44 → 0.9.45
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/mixlib/errors.rb +4 -0
- data/lib/cicd/builder/mixlib/repo.rb +19 -1
- data/lib/cicd/builder/mixlib/repo/S3.rb +463 -72
- 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: a28fa64cc1ef1620743db69b649ac42b11d02b76
|
4
|
+
data.tar.gz: c7a37dde6bcdf58e4b1e297ef5160117783c2379
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa12f48f070a33513b1bf9c694c542921b9604103ad0930eea8f10001072d44377882c34e4627e641efad11bce44180ace14bc694ce1e9f13ed3501864bbe775
|
7
|
+
data.tar.gz: a08f78177b624e68301c894f2037ae037f0f09d7fc26d4523d88d029768b73e50a30ef1532fc8b836d4bf7c7ef812e3034c63a861212ed225f3e1ad86e88883e
|
data/Gemfile.lock
CHANGED
@@ -58,7 +58,25 @@ module CiCd
|
|
58
58
|
end
|
59
59
|
|
60
60
|
# ---------------------------------------------------------------------------------------------------------------
|
61
|
-
def
|
61
|
+
def analyzeInventory()
|
62
|
+
@logger.step __method__.to_s
|
63
|
+
performOnRepoInstance(__method__.to_s)
|
64
|
+
end
|
65
|
+
|
66
|
+
# ---------------------------------------------------------------------------------------------------------------
|
67
|
+
def pruneInventory()
|
68
|
+
@logger.step __method__.to_s
|
69
|
+
performOnRepoInstance(__method__.to_s)
|
70
|
+
end
|
71
|
+
|
72
|
+
# ---------------------------------------------------------------------------------------------------------------
|
73
|
+
def syncInventory()
|
74
|
+
@logger.step __method__.to_s
|
75
|
+
performOnRepoInstance(__method__.to_s)
|
76
|
+
end
|
77
|
+
|
78
|
+
# ---------------------------------------------------------------------------------------------------------------
|
79
|
+
def syncRepo()
|
62
80
|
@logger.step __method__.to_s
|
63
81
|
performOnRepoInstance(__method__.to_s)
|
64
82
|
end
|
@@ -190,24 +190,15 @@ EC2 Instance profile
|
|
190
190
|
raise CiCd::Builder::Errors::Internal.new sprintf('Internal logic error! %s::%d', __FILE__,__LINE__) if varianth.nil?
|
191
191
|
# Add the new build if we don't have it
|
192
192
|
unless varianth['builds'].map { |b| b['build_name'] }.include?(@vars[:build_nmn])
|
193
|
-
#noinspection RubyStringKeysInHashInspection
|
194
|
-
filing = {
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
end
|
203
|
-
assembly = json['container']['assembly'] or raise("Expected an 'assembly'")
|
204
|
-
if assembly['extension'] != !vars[:build_ext]
|
205
|
-
# noinspection RubyStringKeysInHashInspection
|
206
|
-
filing['assembly'] = {
|
207
|
-
'extension' => @vars[:build_ext],
|
208
|
-
'type' => 'tarbzip2'
|
209
|
-
}
|
210
|
-
end
|
193
|
+
# noinspection RubyStringKeysInHashInspection
|
194
|
+
filing = _createFiling(json, {
|
195
|
+
'drawer' => @vars[:build_nam],
|
196
|
+
'build_name' => @vars[:build_nmn],
|
197
|
+
'build_number' => @vars[:build_num],
|
198
|
+
'release' => @vars[:release],
|
199
|
+
'artifacts' => @vars[:artifacts],
|
200
|
+
'build_ext' => @vars[:build_ext],
|
201
|
+
} )
|
211
202
|
varianth['builds'] << filing
|
212
203
|
end
|
213
204
|
build_lst = (varianth['builds'].size-1)
|
@@ -231,6 +222,28 @@ EC2 Instance profile
|
|
231
222
|
pushInventory(json_s, key)
|
232
223
|
end
|
233
224
|
|
225
|
+
# ---------------------------------------------------------------------------------------------------------------
|
226
|
+
# noinspection RubyStringKeysInHashInspection
|
227
|
+
def _createFiling(json, args)
|
228
|
+
filing = {
|
229
|
+
'drawer' => args['drawer'],
|
230
|
+
'build_name' => args['build_name'],
|
231
|
+
'build_number' => args['build_number'],
|
232
|
+
'release' => args['release'],
|
233
|
+
}
|
234
|
+
if args['artifacts']
|
235
|
+
filing['artifacts'] = args['artifacts'].map { |artifact| File.basename(artifact[:key]) }
|
236
|
+
end
|
237
|
+
assembly = json['container']['assembly'] or raise("Expected an 'assembly'")
|
238
|
+
if assembly['extension'] != args['build_ext']
|
239
|
+
filing['assembly'] = {
|
240
|
+
'extension' => args['build_ext'],
|
241
|
+
'type' => 'tarbzip2'
|
242
|
+
}
|
243
|
+
end
|
244
|
+
filing
|
245
|
+
end
|
246
|
+
|
234
247
|
def pushInventory(json_s, key)
|
235
248
|
begin
|
236
249
|
md5 = Digest::MD5.hexdigest(json_s)
|
@@ -272,7 +285,7 @@ EC2 Instance profile
|
|
272
285
|
def _getLatestBranch(build_lst, varianth)
|
273
286
|
# noinspection RubyHashKeysTypesInspection
|
274
287
|
map = Hash[varianth['branches'].map.with_index.to_a]
|
275
|
-
build_bra = map[_getBranch(@vars, varianth['builds'][build_lst])]
|
288
|
+
build_bra = (varianth['builds'].size > 0) ? map[_getBranch(@vars, varianth['builds'][build_lst])] : -1
|
276
289
|
|
277
290
|
i = -1
|
278
291
|
varianth['builds'].each { |h|
|
@@ -291,9 +304,14 @@ EC2 Instance profile
|
|
291
304
|
def _getLatestVersion(build_lst, varianth)
|
292
305
|
# noinspection RubyHashKeysTypesInspection
|
293
306
|
map = Hash[varianth['versions'].map.with_index.to_a]
|
294
|
-
|
307
|
+
if varianth['builds'].size > 0
|
308
|
+
build_ver = map[_getVersion(@vars, varianth['builds'][build_lst])]
|
309
|
+
verl = _getVersion(@vars, varianth['builds'][build_ver])
|
310
|
+
else
|
311
|
+
build_ver = -1
|
312
|
+
verl = '0.0.0'
|
313
|
+
end
|
295
314
|
|
296
|
-
verl = _getVersion(@vars, varianth['builds'][build_ver])
|
297
315
|
gt = ::Semverse::Constraint.new "> #{verl}"
|
298
316
|
eq = ::Semverse::Constraint.new "= #{verl}"
|
299
317
|
|
@@ -441,7 +459,6 @@ EC2 Instance profile
|
|
441
459
|
args = args.dup
|
442
460
|
args[:version] = '[0-9\.]+'
|
443
461
|
args[:release] = '[0-9\.]+'
|
444
|
-
args[:branch] = '[^-]+'
|
445
462
|
args[:build] = '\d+'
|
446
463
|
map = [ :product,:version,:branch,:build ]
|
447
464
|
matches = name.match(/^(#{args[:product]})-(#{args[:version]})-(#{args[:branch]})-build-(\d+)$/)
|
@@ -452,22 +469,27 @@ EC2 Instance profile
|
|
452
469
|
map = [ :product,:version,:release,:branch,:variant,:build ]
|
453
470
|
matches = name.match(/^(#{args[:product]})-(#{args[:version]})-release-(#{args[:release]})-(#{args[:branch]})-(#{args[:variant]})-build-(\d+)$/)
|
454
471
|
unless matches
|
472
|
+
args[:branch] = '[^-]+'
|
473
|
+
args[:variant] = '[^-]+'
|
455
474
|
name = name.dup
|
456
475
|
map.each { |key|
|
457
|
-
if key ==
|
458
|
-
break
|
459
|
-
elsif key == :release
|
476
|
+
if key == :release
|
460
477
|
name.gsub!(/^release-/, '')
|
461
478
|
elsif key == :build
|
462
479
|
name.gsub!(/^build-/, '')
|
463
480
|
end
|
464
|
-
|
481
|
+
if key == match
|
482
|
+
break
|
483
|
+
end
|
484
|
+
# name.gsub!(/^#{args[key]}-/, '')
|
485
|
+
name.gsub!(/^[^\-]+-/, '')
|
465
486
|
}
|
466
487
|
map.reverse.each { |key|
|
467
488
|
if key == match
|
468
489
|
break
|
469
490
|
end
|
470
|
-
name.gsub!(/-#{args[key]}$/, '')
|
491
|
+
#name.gsub!(/-#{args[key]}$/, '')
|
492
|
+
name.gsub!(/-[^\-]+$/, '')
|
471
493
|
if key == :release
|
472
494
|
name.gsub!(/-release$/, '')
|
473
495
|
elsif key == :build
|
@@ -510,6 +532,34 @@ EC2 Instance profile
|
|
510
532
|
drawer['branch'] || _getMatches(args, name, :branch)
|
511
533
|
end
|
512
534
|
|
535
|
+
def release(builds, pruner)
|
536
|
+
rel = pruner.shift
|
537
|
+
raise "Bad syntax: #{__method__}{ #{pruner.join(' ')}" unless (pruner.size >= 3)
|
538
|
+
others = builds.select { |bld|
|
539
|
+
bld['release'] != rel
|
540
|
+
}
|
541
|
+
ours = builds.select { |bld|
|
542
|
+
bld['release'] == rel
|
543
|
+
}
|
544
|
+
ours = prune ours, pruner
|
545
|
+
[ others, ours ].flatten.sort_by{ |b| b['build_number'] }
|
546
|
+
end
|
547
|
+
|
548
|
+
def version(builds, pruner)
|
549
|
+
rel = pruner.shift
|
550
|
+
raise "Bad syntax: #{__method__}{ #{pruner.join(' ')}" unless (pruner.size >= 3)
|
551
|
+
others = builds.select { |bld|
|
552
|
+
ver = _getMatches(@vars, bld['build_name'], :version)
|
553
|
+
ver != rel
|
554
|
+
}
|
555
|
+
ours = builds.select { |bld|
|
556
|
+
ver = _getMatches(@vars, bld['build_name'], :version)
|
557
|
+
ver == rel
|
558
|
+
}
|
559
|
+
ours = prune ours, pruner
|
560
|
+
[ others, ours ].flatten.sort_by{ |b| b['build_number'] }
|
561
|
+
end
|
562
|
+
|
513
563
|
def first(builds, pruner)
|
514
564
|
raise "Bad syntax: #{__method__}{ #{pruner.join(' ')}" unless pruner.size == 1
|
515
565
|
count = pruner[0].to_i
|
@@ -552,7 +602,83 @@ EC2 Instance profile
|
|
552
602
|
end
|
553
603
|
|
554
604
|
# ---------------------------------------------------------------------------------------------------------------
|
555
|
-
def
|
605
|
+
def analyzeInventory()
|
606
|
+
@logger.step __method__.to_s
|
607
|
+
# Read and parse in JSON
|
608
|
+
key, json, over = pullInventory()
|
609
|
+
if json.nil?
|
610
|
+
@logger.error "Bad repo/inventory specified. s3://#{ENV['AWS_S3_BUCKET']}/#{key}"
|
611
|
+
@vars[:return_code] = Errors::PRUNE_BAD_REPO
|
612
|
+
else
|
613
|
+
if @vars[:variant]
|
614
|
+
if @vars[:tree]
|
615
|
+
if @vars[:pruner]
|
616
|
+
if json['container'] and json['container']['variants']
|
617
|
+
# but does not have our variant ...
|
618
|
+
variants = json['container']['variants']
|
619
|
+
variants.each do |variant,varianth|
|
620
|
+
# If the inventory 'latest' format is up to date ...
|
621
|
+
if varianth['latest'] and varianth['latest'].is_a?(Hash)
|
622
|
+
puts "Variant: #{variant}"
|
623
|
+
puts "\t#{varianth['builds'].size} builds"
|
624
|
+
puts "\t#{varianth['branches'].size} branches:\n#{varianth['branches'].ai}"
|
625
|
+
# puts "\t#{varianth['versions'].size} versions:\n#{varianth['versions'].ai}"
|
626
|
+
versions = {}
|
627
|
+
releases = {}
|
628
|
+
versrels = {}
|
629
|
+
bmin = -1
|
630
|
+
bmax = -1
|
631
|
+
varianth['builds'].each do |bld|
|
632
|
+
releases[bld['release']] ||= 0
|
633
|
+
releases[bld['release']] += 1
|
634
|
+
unless bld['build_number'].nil?
|
635
|
+
bnum = bld['build_number'].to_i
|
636
|
+
if bmin < 0 or bnum < bmin
|
637
|
+
bmin = bnum
|
638
|
+
end
|
639
|
+
if bnum > bmax
|
640
|
+
bmax = bnum
|
641
|
+
end
|
642
|
+
end
|
643
|
+
ver = _getMatches(@vars, bld['build_name'], :version)
|
644
|
+
versions[ver] ||= 0
|
645
|
+
versions[ver] += 1
|
646
|
+
versrels["#{ver}-#{bld['release']}"] ||= 0
|
647
|
+
versrels["#{ver}-#{bld['release']}"] += 1
|
648
|
+
end
|
649
|
+
puts "\t#{versions.size} versions:\n#{versions.ai}"
|
650
|
+
puts "\t#{releases.size} releases:\n#{releases.ai}"
|
651
|
+
puts "\t#{versrels.size} version-releases:\n#{versrels.ai}"
|
652
|
+
puts "\tBuilds: Min: #{bmin}, Max: #{bmax}"
|
653
|
+
else
|
654
|
+
# Start over ... too old/ incompatible
|
655
|
+
@logger.error 'Repo too old or incompatible to prune. No [container][variants][VARIANT][latest].'
|
656
|
+
@vars[:return_code] = Errors::PRUNE_TOO_OLD
|
657
|
+
end
|
658
|
+
end
|
659
|
+
else
|
660
|
+
# Start over ... too old/ incompatible
|
661
|
+
@logger.error 'Repo too old or incompatible to prune. No [container][variants].'
|
662
|
+
@vars[:return_code] = Errors::PRUNE_TOO_OLD
|
663
|
+
end
|
664
|
+
else
|
665
|
+
@logger.error "No 'PRUNER' specified"
|
666
|
+
@vars[:return_code] = Errors::PRUNE_NO_PRUNER
|
667
|
+
end
|
668
|
+
else
|
669
|
+
@logger.error "No 'TREE' specified"
|
670
|
+
@vars[:return_code] = Errors::PRUNE_NO_TREE
|
671
|
+
end
|
672
|
+
else
|
673
|
+
@logger.error "No 'VARIANT' specified"
|
674
|
+
@vars[:return_code] = Errors::PRUNE_NO_VARIANT
|
675
|
+
end
|
676
|
+
end
|
677
|
+
@vars[:return_code]
|
678
|
+
end
|
679
|
+
|
680
|
+
# ---------------------------------------------------------------------------------------------------------------
|
681
|
+
def pruneInventory()
|
556
682
|
@logger.step __method__.to_s
|
557
683
|
# Read and parse in JSON
|
558
684
|
key, json, over = pullInventory()
|
@@ -575,44 +701,41 @@ EC2 Instance profile
|
|
575
701
|
versions = varianth['versions']
|
576
702
|
case @vars[:tree]
|
577
703
|
when %r'variants?'
|
578
|
-
|
704
|
+
@vars[:pruner].split(/,\s*/).each do |pruner|
|
705
|
+
variants.delete(pruner)
|
706
|
+
end
|
579
707
|
when %r'versions?'
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
708
|
+
@vars[:pruner].split(/,\s*/).each do |pruner|
|
709
|
+
if varianth['versions'].include?(pruner)
|
710
|
+
survivors = varianth['builds'].select{ |drawer|
|
711
|
+
ver = _getVersion(@vars, drawer)
|
712
|
+
ver != pruner
|
713
|
+
}
|
714
|
+
varianth['builds'] = survivors
|
715
|
+
varianth['versions'] = varianth['versions'].select{|ver| ver != pruner }
|
716
|
+
else
|
717
|
+
@logger.error "Cannot prune the version '#{pruner}' from variant '#{@vars[:variant]}'"
|
718
|
+
@vars[:return_code] = Errors::PRUNE_BAD_VERSION
|
719
|
+
end
|
590
720
|
end
|
591
721
|
when %r'branch(|es)'
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
722
|
+
@vars[:pruner].split(/,\s*/).each do |pruner|
|
723
|
+
if varianth['branches'].include?(pruner)
|
724
|
+
survivors = varianth['builds'].select{ |drawer|
|
725
|
+
bra = _getBranch(@vars, drawer)
|
726
|
+
bra != pruner
|
727
|
+
}
|
728
|
+
varianth['builds'] = survivors
|
729
|
+
else
|
730
|
+
@logger.error "Cannot prune the branch '#{pruner}' from variant '#{@vars[:variant]}'"
|
731
|
+
@vars[:return_code] = Errors::PRUNE_BAD_BRANCH
|
732
|
+
end
|
602
733
|
end
|
603
734
|
when %r'builds?'
|
604
735
|
# noinspection RubyHashKeysTypesInspection
|
605
736
|
begin
|
606
737
|
builds = prune(builds, @vars[:pruner].split(/\s+/))
|
607
738
|
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
739
|
rescue Exception => e
|
617
740
|
@logger.error "Cannot prune the builds '#{e.message}'"
|
618
741
|
@vars[:return_code] = Errors::PRUNE_BAD_PRUNER
|
@@ -622,20 +745,9 @@ EC2 Instance profile
|
|
622
745
|
@vars[:return_code] = Errors::PRUNE_NO_TREE
|
623
746
|
end
|
624
747
|
if 0 == @vars[:return_code]
|
625
|
-
|
626
|
-
|
627
|
-
|
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
|
-
}
|
748
|
+
_updateBranches(varianth['builds'], varianth)
|
749
|
+
_updateVersions(varianth['builds'], varianth)
|
750
|
+
_updateLatest(varianth)
|
639
751
|
json_s = JSON.pretty_generate( json, { indent: "\t", space: ' '})
|
640
752
|
pushInventory(json_s, key)
|
641
753
|
end
|
@@ -669,7 +781,286 @@ EC2 Instance profile
|
|
669
781
|
@vars[:return_code]
|
670
782
|
end
|
671
783
|
|
672
|
-
|
784
|
+
# ---------------------------------------------------------------------------------------------------------------
|
785
|
+
def syncRepo()
|
786
|
+
@logger.step __method__.to_s
|
787
|
+
# Read and parse in JSON
|
788
|
+
key, json, over = pullInventory()
|
789
|
+
# Starting fresh ?
|
790
|
+
if over or json.nil?
|
791
|
+
# json_s = initInventory()
|
792
|
+
@logger.error "Bad repo/inventory found (s3://#{ENV['AWS_S3_BUCKET']}/#{key}). Inventory may need to be initialized."
|
793
|
+
@vars[:return_code] = Errors::SYNC_BAD_REPO
|
794
|
+
else
|
795
|
+
if json['container'] and json['container']['variants']
|
796
|
+
variants = json['container']['variants']
|
797
|
+
list = pullRepo()
|
798
|
+
s3 = getS3()
|
799
|
+
|
800
|
+
list.each do |obj|
|
801
|
+
@logger.debug "Inspect #{obj[:key]}"
|
802
|
+
delete = false
|
803
|
+
unless obj[:key].match(%r'#{key}$')
|
804
|
+
item = obj[:key].dup
|
805
|
+
if item.match(%r'^#{@vars[:product]}')
|
806
|
+
item.gsub!(%r'^#{@vars[:product]}/', '')
|
807
|
+
matches = item.match(%r'^([^/]+)/')
|
808
|
+
if matches
|
809
|
+
variant = matches[1]
|
810
|
+
if variants.has_key?(variant)
|
811
|
+
varianth = variants[variant]
|
812
|
+
item.gsub!(%r'^#{variant}/', '')
|
813
|
+
matches = item.match(%r'^([^/]+)/')
|
814
|
+
if matches
|
815
|
+
drawer = matches[1]
|
816
|
+
builds = varianth['builds'].select{ |bld|
|
817
|
+
bld['drawer'].eql?(drawer)
|
818
|
+
}
|
819
|
+
if builds.size > 0
|
820
|
+
item.gsub!(%r'^#{drawer}/', '')
|
821
|
+
|
822
|
+
if item.match(%r'^#{drawer}')
|
823
|
+
name = item.gsub(%r'\.(MANIFEST\.json|tar\.[bg]z2?|tgz|tbz2?|checksum)$', '')
|
824
|
+
ver = _getMatches(@vars, name, :version)
|
825
|
+
rel = _getMatches(@vars, name, :release)
|
826
|
+
bra = _getMatches(@vars, name, :branch)
|
827
|
+
var = _getMatches(@vars, name, :variant)
|
828
|
+
num = _getMatches(@vars, name, :build)
|
829
|
+
# num = num.to_i unless num.nil?
|
830
|
+
#@logger.debug "Variant: #{var}, Version: #{ver}, Branch: #{bra}"
|
831
|
+
unless varianth['versions'].include?(ver) and varianth['branches'].include?(bra) and var.eql?(variant)
|
832
|
+
delete = true
|
833
|
+
else
|
834
|
+
builds = varianth['builds'].select{ |bld|
|
835
|
+
bld['build_name'].eql?(name)
|
836
|
+
}
|
837
|
+
if builds.size > 0
|
838
|
+
builds = varianth['builds'].select{ |bld|
|
839
|
+
bld['release'].eql?(rel)
|
840
|
+
}
|
841
|
+
if builds.size > 0
|
842
|
+
builds = varianth['builds'].select{ |bld|
|
843
|
+
bld['build_number'] == num
|
844
|
+
}
|
845
|
+
unless builds.size > 0
|
846
|
+
delete = true
|
847
|
+
end
|
848
|
+
else
|
849
|
+
delete = true
|
850
|
+
end
|
851
|
+
else
|
852
|
+
delete = true
|
853
|
+
end
|
854
|
+
end
|
855
|
+
end
|
856
|
+
else
|
857
|
+
delete = true
|
858
|
+
end
|
859
|
+
else
|
860
|
+
@logger.warn "Item #{item} drawer cannot be identified!"
|
861
|
+
@vars[:return_code] = Errors::SYNC_NO_DRAWER
|
862
|
+
break
|
863
|
+
end
|
864
|
+
else
|
865
|
+
delete = true
|
866
|
+
end
|
867
|
+
else
|
868
|
+
@logger.warn "Item #{item} variant cannot be identified!"
|
869
|
+
@vars[:return_code] = Errors::SYNC_NO_VARIANT
|
870
|
+
break
|
871
|
+
end
|
872
|
+
else
|
873
|
+
@logger.warn "Item #{item} is not our product(#{@vars[:product]})"
|
874
|
+
@vars[:return_code] = Errors::SYNC_BAD_PRODUCT
|
875
|
+
break
|
876
|
+
end
|
877
|
+
if delete
|
878
|
+
@logger.info "S3 Delete #{ENV['AWS_S3_BUCKET']}, #{obj[:key]}"
|
879
|
+
resp = s3.delete_object(bucket: ENV['AWS_S3_BUCKET'], key: obj[:key])
|
880
|
+
if resp
|
881
|
+
@logger.info "Version: #{resp[:version_id]}" if resp[:version_id]
|
882
|
+
end
|
883
|
+
end
|
884
|
+
end
|
885
|
+
end
|
886
|
+
else
|
887
|
+
@logger.error "Bad repo/inventory found (s3://#{ENV['AWS_S3_BUCKET']}/#{key}). Inventory may need to be initialized."
|
888
|
+
@vars[:return_code] = Errors::SYNC_BAD_REPO
|
889
|
+
end
|
890
|
+
end
|
891
|
+
@vars[:return_code]
|
892
|
+
end
|
893
|
+
|
894
|
+
# ---------------------------------------------------------------------------------------------------------------
|
895
|
+
def syncInventory()
|
896
|
+
@logger.step __method__.to_s
|
897
|
+
# Read and parse in JSON
|
898
|
+
key, json, over = pullInventory()
|
899
|
+
# Starting fresh ?
|
900
|
+
if over or json.nil?
|
901
|
+
# json_s = initInventory()
|
902
|
+
@logger.error "Bad repo/inventory found (s3://#{ENV['AWS_S3_BUCKET']}/#{key}). Inventory may need to be initialized."
|
903
|
+
@vars[:return_code] = Errors::SYNC_BAD_REPO
|
904
|
+
else
|
905
|
+
list = pullRepo()
|
906
|
+
|
907
|
+
fileroom = {}
|
908
|
+
list.each do |obj|
|
909
|
+
unless obj[:key].match(%r'#{key}$')
|
910
|
+
item = obj[:key].dup
|
911
|
+
if item.match(%r'^#{@vars[:product]}')
|
912
|
+
item.gsub!(%r'^#{@vars[:product]}/', '')
|
913
|
+
matches = item.match(%r'^([^/]+)/')
|
914
|
+
if matches
|
915
|
+
variant = matches[1]
|
916
|
+
fileroom[variant] ||= {}
|
917
|
+
cabinet = fileroom[variant]
|
918
|
+
item.gsub!(%r'^#{variant}/', '')
|
919
|
+
matches = item.match(%r'^([^/]+)/')
|
920
|
+
if matches
|
921
|
+
drawer = matches[1]
|
922
|
+
item.gsub!(%r'^#{drawer}/', '')
|
923
|
+
cabinet[drawer] ||= {}
|
924
|
+
tray = cabinet[drawer]
|
925
|
+
# tray['builds'] ||= {}
|
926
|
+
|
927
|
+
if item.match(%r'^#{drawer}')
|
928
|
+
name = item.gsub(%r'\.(MANIFEST\.json|tar\.[bg]z2?|tgz|tbz2?|checksum)$', '')
|
929
|
+
ext = item.gsub(%r'\.(tar\.[bg]z2?)$', '$1')
|
930
|
+
ext = 'tar.bz2' if ext == item
|
931
|
+
ver = _getMatches(@vars, name, :version)
|
932
|
+
rel = _getMatches(@vars, name, :release)
|
933
|
+
bra = _getMatches(@vars, name, :branch)
|
934
|
+
var = _getMatches(@vars, name, :variant)
|
935
|
+
bld = _getMatches(@vars, name, :build)
|
936
|
+
tray[name] ||= {}
|
937
|
+
filing = tray[name]
|
938
|
+
|
939
|
+
unless filing.size > 0
|
940
|
+
# noinspection RubyStringKeysInHashInspection
|
941
|
+
filing = _createFiling(json, {
|
942
|
+
'drawer' => drawer,
|
943
|
+
'build_name' => name,
|
944
|
+
'build_number' => bld,
|
945
|
+
'release' => rel,
|
946
|
+
'artifacts' => [obj],
|
947
|
+
'build_ext' => ext,
|
948
|
+
} )
|
949
|
+
tray[name] = filing
|
950
|
+
@logger.debug "Filing: #{filing.ai}"
|
951
|
+
else
|
952
|
+
filing['artifacts'] << item # File.basename(obj[:key])
|
953
|
+
end
|
954
|
+
else
|
955
|
+
# Add the artifact to all filings in this drawer :)
|
956
|
+
tray.each do |name,filing|
|
957
|
+
unless filing['drawer'] == drawer
|
958
|
+
@logger.error "#{obj[:key]} belongs in drawer '#{drawer}' which does not match the filings drawer '#{filing['drawer']}'"
|
959
|
+
@vars[:return_code] = Errors::SYNC_NO_DRAWER
|
960
|
+
return @vars[:return_code]
|
961
|
+
end
|
962
|
+
filing['artifacts'] << item # File.basename(obj[:key])
|
963
|
+
end
|
964
|
+
end
|
965
|
+
else
|
966
|
+
@logger.warn "Item #{item} drawer cannot be identified!"
|
967
|
+
@vars[:return_code] = Errors::SYNC_NO_DRAWER
|
968
|
+
break
|
969
|
+
end
|
970
|
+
else
|
971
|
+
@logger.warn "Item #{item} variant cannot be identified!"
|
972
|
+
@vars[:return_code] = Errors::SYNC_NO_VARIANT
|
973
|
+
break
|
974
|
+
end
|
975
|
+
else
|
976
|
+
@logger.warn "Item #{item} is not our product(#{@vars[:product]})"
|
977
|
+
@vars[:return_code] = Errors::SYNC_BAD_PRODUCT
|
978
|
+
break
|
979
|
+
end
|
980
|
+
end
|
981
|
+
end
|
982
|
+
variants = {}
|
983
|
+
fileroom.each do |variant,cabinet|
|
984
|
+
variants[variant] ||= {}
|
985
|
+
varianth = variants[variant]
|
986
|
+
varianth['builds'] ||= []
|
987
|
+
varianth['branches'] ||= []
|
988
|
+
varianth['versions'] ||= []
|
989
|
+
cabinet.each do |drawer,tray|
|
990
|
+
varianth['builds'] << tray.values.sort_by{ |bld| bld['build_number'].to_i }
|
991
|
+
varianth['builds'] = varianth['builds'].flatten
|
992
|
+
_updateBranches(varianth['builds'], varianth)
|
993
|
+
_updateVersions(varianth['builds'], varianth)
|
994
|
+
_updateLatest(varianth)
|
995
|
+
end
|
996
|
+
end
|
997
|
+
if json['container'] and json['container']['variants']
|
998
|
+
json['container']['variants'] = variants
|
999
|
+
json_s = JSON.pretty_generate( json, { indent: "\t", space: ' '})
|
1000
|
+
pushInventory(json_s, key)
|
1001
|
+
end
|
1002
|
+
end
|
1003
|
+
@vars[:return_code]
|
1004
|
+
end
|
1005
|
+
|
1006
|
+
# ---------------------------------------------------------------------------------------------------------------
|
1007
|
+
def pullRepo()
|
1008
|
+
list = []
|
1009
|
+
s3from = getS3()
|
1010
|
+
resp = s3from.list_objects(bucket: ENV['AWS_S3_BUCKET'], prefix: @vars[:project_name],)
|
1011
|
+
if resp and (not resp[:contents].nil?) and resp[:contents].is_a?(Array) and resp[:contents].size > 0
|
1012
|
+
list << resp[:contents]
|
1013
|
+
@logger.info "Prefix #{@vars[:project_name]} List size: #{list.flatten.size}"
|
1014
|
+
if resp[:is_truncated]
|
1015
|
+
while resp and (not resp[:contents].nil?) and resp[:contents].is_a?(Array) and resp[:contents].size > 0
|
1016
|
+
resp = s3from.list_objects(bucket: ENV['AWS_S3_BUCKET'], prefix: @vars[:project_name], marker: resp[:contents][-1][:key])
|
1017
|
+
list << resp[:contents] if resp and resp[:contents]
|
1018
|
+
@logger.info "Prefix #{@vars[:project_name]} List size: #{list.flatten.size}"
|
1019
|
+
end
|
1020
|
+
end
|
1021
|
+
list.flatten!
|
1022
|
+
end
|
1023
|
+
@logger.info "Repo size: #{list.size}"
|
1024
|
+
list
|
1025
|
+
end
|
1026
|
+
|
1027
|
+
# ---------------------------------------------------------------------------------------------------------------
|
1028
|
+
def _updateLatest(varianth)
|
1029
|
+
build_lst = (varianth['builds'].size-1)
|
1030
|
+
build_rel = _getLatestRelease(build_lst, varianth)
|
1031
|
+
# Latest branch ...
|
1032
|
+
build_bra = _getLatestBranch(build_lst, varianth)
|
1033
|
+
# Latest version ...
|
1034
|
+
build_ver = _getLatestVersion(build_lst, varianth)
|
1035
|
+
|
1036
|
+
# Set latest
|
1037
|
+
varianth['latest'] = {
|
1038
|
+
branch: build_bra,
|
1039
|
+
version: build_ver,
|
1040
|
+
build: build_lst,
|
1041
|
+
release: build_rel,
|
1042
|
+
}
|
1043
|
+
end
|
1044
|
+
|
1045
|
+
# ---------------------------------------------------------------------------------------------------------------
|
1046
|
+
def _updateVersions(builds, varianth)
|
1047
|
+
versions = builds.map { |bld|
|
1048
|
+
_getVersion(@vars, bld)
|
1049
|
+
}
|
1050
|
+
# noinspection RubyHashKeysTypesInspection
|
1051
|
+
varianth['versions'] = Hash[versions.map.with_index.to_a].keys
|
1052
|
+
end
|
1053
|
+
|
1054
|
+
# ---------------------------------------------------------------------------------------------------------------
|
1055
|
+
def _updateBranches(builds, varianth)
|
1056
|
+
branches = builds.map { |bld|
|
1057
|
+
_getBranch(@vars, bld)
|
1058
|
+
}
|
1059
|
+
# noinspection RubyHashKeysTypesInspection
|
1060
|
+
varianth['branches'] = Hash[branches.map.with_index.to_a].keys
|
1061
|
+
end
|
1062
|
+
|
1063
|
+
private :_update, :checkForInventory, :pullInventory, :_update, :_updateBranches, :_updateLatest, :_updateVersions
|
673
1064
|
|
674
1065
|
end
|
675
1066
|
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.45'
|
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.45
|
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-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|