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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: be47ca1bd0f4693e4b88daf215d83657cea3eab6
4
- data.tar.gz: 90d1904eba2ecdaa0ae0c64ccf0ba6c83632fb91
3
+ metadata.gz: a28fa64cc1ef1620743db69b649ac42b11d02b76
4
+ data.tar.gz: c7a37dde6bcdf58e4b1e297ef5160117783c2379
5
5
  SHA512:
6
- metadata.gz: 42fac91c4652e1e509eed4cc9de9b7f097cf86bf4e46327146b22938ccb2a010e696a8e77dbf4d5af43170bba493cdf7f07389e7b3e2c0006b5f3457bdeab24e
7
- data.tar.gz: d4edf11d4058baf5d37a22fc09158139083936c0bf20991f773b222f074f2a54a2c3d9125a340f4464c670c6d141e82f5566e92939c2ada597005da986215b84
6
+ metadata.gz: fa12f48f070a33513b1bf9c694c542921b9604103ad0930eea8f10001072d44377882c34e4627e641efad11bce44180ace14bc694ce1e9f13ed3501864bbe775
7
+ data.tar.gz: a08f78177b624e68301c894f2037ae037f0f09d7fc26d4523d88d029768b73e50a30ef1532fc8b836d4bf7c7ef812e3034c63a861212ed225f3e1ad86e88883e
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cicd-builder (0.9.44)
4
+ cicd-builder (0.9.45)
5
5
  artifactory (>= 2.2.1, < 2.3)
6
6
  awesome_print (>= 1.6, < 2.0)
7
7
  aws-sdk (>= 2.0, < 2.1)
@@ -48,6 +48,10 @@ module CiCd
48
48
  PRUNE_BAD_BRANCH = i+=1
49
49
  PRUNE_BAD_VERSION = i+=1
50
50
  PRUNE_BAD_PRUNER = i+=1
51
+ SYNC_BAD_REPO = i+=1
52
+ SYNC_BAD_PRODUCT = i+=1
53
+ SYNC_NO_VARIANT = i+=1
54
+ SYNC_NO_DRAWER = i+=1
51
55
 
52
56
  require 'awesome_print'
53
57
 
@@ -58,7 +58,25 @@ module CiCd
58
58
  end
59
59
 
60
60
  # ---------------------------------------------------------------------------------------------------------------
61
- def pruneRepo()
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
- 'drawer' => @vars[:build_nam],
196
- 'build_name' => @vars[:build_nmn],
197
- 'build_number' => @vars[:build_num],
198
- 'release' => @vars[:release],
199
- }
200
- if @vars.has_key?(:artifacts)
201
- filing['artifacts'] = @vars[:artifacts].map { |artifact| File.basename(artifact[:key]) }
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
- build_ver = map[_getVersion(@vars, varianth['builds'][build_lst])]
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 == match
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
- name.gsub!(/^#{args[key]}-/, '')
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 pruneRepo()
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
- variants.delete(@vars[:pruner])
704
+ @vars[:pruner].split(/,\s*/).each do |pruner|
705
+ variants.delete(pruner)
706
+ end
579
707
  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
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
- 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
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
- 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
- }
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
- private :_update, :checkForInventory, :pullInventory
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
@@ -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.44'
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.44
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-12 00:00:00.000000000 Z
11
+ date: 2015-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: awesome_print