cicd-builder 0.9.44 → 0.9.45

Sign up to get free protection for your applications and to get access to all the features.
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