cicd-builder 0.9.48 → 0.9.50
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 +12 -8
- data/cicd-builder.gemspec +2 -0
- data/lib/cicd/builder/mixlib/build.rb +5 -5
- data/lib/cicd/builder/mixlib/environment.rb +5 -4
- data/lib/cicd/builder/mixlib/errors.rb +8 -1
- data/lib/cicd/builder/mixlib/repo.rb +30 -17
- data/lib/cicd/builder/mixlib/repo/S3.rb +38 -29
- data/lib/cicd/builder/mixlib/repo/artifactory.rb +174 -15
- data/lib/cicd/builder/version.rb +1 -1
- metadata +42 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 812b59bab3245bb65e3da40f49e995d6d01faac3
|
|
4
|
+
data.tar.gz: c0067b69de71de70310fa48ca7e27dd03eb9f7c5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f04f159999011737a30a0202b145d5e60ed7dcc1bf163c1931c597d4c925b4897b75751e61fbb49a6c9c8c428b03741249b1a4c36f6e605e72ac3cdc56bf879e
|
|
7
|
+
data.tar.gz: adb4d7f0a922036ae3e8ea04de849d3a6727ac9b25e6b8aa94ddc4a34dc5aef0e7fbae3bb73d8ce55ec3fc55500463d0d9b43f1e55bcace29cb55919c82b15ae
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
cicd-builder (0.9.
|
|
4
|
+
cicd-builder (0.9.50)
|
|
5
5
|
artifactory (>= 2.2.1, < 2.3)
|
|
6
6
|
awesome_print (>= 1.6, < 2.0)
|
|
7
7
|
aws-sdk (>= 2.0, < 2.1)
|
|
@@ -10,6 +10,8 @@ PATH
|
|
|
10
10
|
inifile (>= 3.0.0, < 3.1)
|
|
11
11
|
json (>= 1.8.1, < 1.9)
|
|
12
12
|
logging (>= 1.8.2, < 1.9)
|
|
13
|
+
parallel (>= 1.4.1, < 1.5)
|
|
14
|
+
ruby-progressbar (>= 1.7.5, < 2)
|
|
13
15
|
semverse (>= 1.2.1, < 1.3)
|
|
14
16
|
yajl-ruby (>= 1.2.1, < 1.3)
|
|
15
17
|
|
|
@@ -18,14 +20,14 @@ GEM
|
|
|
18
20
|
specs:
|
|
19
21
|
artifactory (2.2.1)
|
|
20
22
|
awesome_print (1.6.1)
|
|
21
|
-
aws-sdk (2.0.
|
|
22
|
-
aws-sdk-resources (= 2.0.
|
|
23
|
-
aws-sdk-core (2.0.
|
|
23
|
+
aws-sdk (2.0.41)
|
|
24
|
+
aws-sdk-resources (= 2.0.41)
|
|
25
|
+
aws-sdk-core (2.0.41)
|
|
24
26
|
builder (~> 3.0)
|
|
25
27
|
jmespath (~> 1.0)
|
|
26
28
|
multi_json (~> 1.0)
|
|
27
|
-
aws-sdk-resources (2.0.
|
|
28
|
-
aws-sdk-core (= 2.0.
|
|
29
|
+
aws-sdk-resources (2.0.41)
|
|
30
|
+
aws-sdk-core (= 2.0.41)
|
|
29
31
|
builder (3.2.2)
|
|
30
32
|
chef (12.0.3)
|
|
31
33
|
chef-zero (~> 3.2)
|
|
@@ -78,7 +80,7 @@ GEM
|
|
|
78
80
|
little-plugger (>= 1.1.3)
|
|
79
81
|
multi_json (>= 1.8.4)
|
|
80
82
|
method_source (0.8.2)
|
|
81
|
-
mime-types (2.
|
|
83
|
+
mime-types (2.5)
|
|
82
84
|
mixlib-authentication (1.3.0)
|
|
83
85
|
mixlib-log
|
|
84
86
|
mixlib-cli (1.5.0)
|
|
@@ -92,7 +94,7 @@ GEM
|
|
|
92
94
|
net-ssh-multi (1.2.1)
|
|
93
95
|
net-ssh (>= 2.6.5)
|
|
94
96
|
net-ssh-gateway (>= 1.2.0)
|
|
95
|
-
ohai (8.
|
|
97
|
+
ohai (8.3.0)
|
|
96
98
|
ffi (~> 1.9)
|
|
97
99
|
ffi-yajl (>= 1.1, < 3.0)
|
|
98
100
|
ipaddress
|
|
@@ -104,6 +106,7 @@ GEM
|
|
|
104
106
|
rake (~> 10.1)
|
|
105
107
|
systemu (~> 2.6.4)
|
|
106
108
|
wmi-lite (~> 1.0)
|
|
109
|
+
parallel (1.4.1)
|
|
107
110
|
plist (3.1.0)
|
|
108
111
|
pry (0.10.1)
|
|
109
112
|
coderay (~> 1.1.0)
|
|
@@ -111,6 +114,7 @@ GEM
|
|
|
111
114
|
slop (~> 3.4)
|
|
112
115
|
rack (1.6.0)
|
|
113
116
|
rake (10.3.2)
|
|
117
|
+
ruby-progressbar (1.7.5)
|
|
114
118
|
rubygems-tasks (0.2.4)
|
|
115
119
|
semverse (1.2.1)
|
|
116
120
|
slop (3.6.0)
|
data/cicd-builder.gemspec
CHANGED
|
@@ -27,6 +27,8 @@ Gem::Specification.new do |gem|
|
|
|
27
27
|
gem.add_dependency 'git', '>= 1.2.7', '< 1.3'
|
|
28
28
|
gem.add_dependency 'semverse', '>= 1.2.1', '< 1.3'
|
|
29
29
|
gem.add_dependency 'artifactory', '>= 2.2.1', '< 2.3'
|
|
30
|
+
gem.add_dependency 'parallel', '>= 1.4.1', '< 1.5'
|
|
31
|
+
gem.add_dependency 'ruby-progressbar', '>= 1.7.5', '< 2'
|
|
30
32
|
|
|
31
33
|
gem.add_development_dependency 'bundler', '>= 1.7', '< 1.8'
|
|
32
34
|
gem.add_development_dependency 'rake', '>= 10.3', '< 11'
|
|
@@ -5,7 +5,7 @@ module CiCd
|
|
|
5
5
|
|
|
6
6
|
# ---------------------------------------------------------------------------------------------------------------
|
|
7
7
|
def cleanupBuild()
|
|
8
|
-
@logger.
|
|
8
|
+
@logger.info CLASS+'::'+__method__.to_s
|
|
9
9
|
[ :build_pkg, :build_chk, :build_mdf, :build_mff ].each do |fil|
|
|
10
10
|
if File.exists?(@vars[fil])
|
|
11
11
|
begin
|
|
@@ -31,7 +31,7 @@ module CiCd
|
|
|
31
31
|
|
|
32
32
|
# ---------------------------------------------------------------------------------------------------------------
|
|
33
33
|
def prepareBuild()
|
|
34
|
-
@logger.step __method__.to_s
|
|
34
|
+
@logger.step CLASS+'::'+__method__.to_s
|
|
35
35
|
meta = {}
|
|
36
36
|
@vars[:return_code] = 0
|
|
37
37
|
%w[ WORKSPACE PROJECT_NAME ].each do |e|
|
|
@@ -105,7 +105,7 @@ module CiCd
|
|
|
105
105
|
|
|
106
106
|
# ---------------------------------------------------------------------------------------------------------------
|
|
107
107
|
def makeBuild()
|
|
108
|
-
@logger.step __method__.to_s
|
|
108
|
+
@logger.step CLASS+'::'+__method__.to_s
|
|
109
109
|
if @vars.has_key?(:build_dir) and @vars.has_key?(:build_pkg)
|
|
110
110
|
begin
|
|
111
111
|
do_build = false
|
|
@@ -208,7 +208,7 @@ module CiCd
|
|
|
208
208
|
|
|
209
209
|
# ---------------------------------------------------------------------------------------------------------------
|
|
210
210
|
def packageBuild()
|
|
211
|
-
@logger.
|
|
211
|
+
@logger.info CLASS+'::'+__method__.to_s
|
|
212
212
|
excludes=%w(*.iml *.txt *.sh *.md .gitignore .editorconfig .jshintrc *.deprecated adminer doc)
|
|
213
213
|
excludes = excludes.map{ |e| "--exclude=#{@vars[:build_nam]}/#{e}" }.join(' ')
|
|
214
214
|
cmd = %(cd #{ENV['WORKSPACE']}; tar zcvf #{@vars[:build_pkg]} #{excludes} #{@vars[:build_nam]} 1>#{@vars[:build_pkg]}.manifest)
|
|
@@ -222,7 +222,7 @@ module CiCd
|
|
|
222
222
|
|
|
223
223
|
# ---------------------------------------------------------------------------------------------------------------
|
|
224
224
|
def createMetaData()
|
|
225
|
-
@logger.
|
|
225
|
+
@logger.info CLASS+'::'+__method__.to_s
|
|
226
226
|
@vars[:build_mdd].merge!({
|
|
227
227
|
:Generation => @options[:gen],
|
|
228
228
|
:Project => @vars[:project_name],
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
module CiCd
|
|
2
2
|
module Builder
|
|
3
3
|
require 'awesome_print'
|
|
4
|
+
CLASS = 'CiCd::Builder'
|
|
4
5
|
|
|
5
6
|
# ---------------------------------------------------------------------------------------------------------------
|
|
6
7
|
def checkEnvironment()
|
|
7
|
-
@logger.step __method__.to_s
|
|
8
|
+
@logger.step CLASS+'::'+__method__.to_s
|
|
8
9
|
# [2013-12-30 Christo] Detect CI ...
|
|
9
10
|
unless ENV.has_key?('JENKINS_HOME')
|
|
10
11
|
@logger.error "Sorry, your CI environment is not supported at this time (2013-12-30) ... Christo De Lange\n"+
|
|
@@ -31,7 +32,7 @@ module CiCd
|
|
|
31
32
|
|
|
32
33
|
# ---------------------------------------------------------------------------------------------------------------
|
|
33
34
|
def getVars()
|
|
34
|
-
@logger.step __method__.to_s
|
|
35
|
+
@logger.step CLASS+'::'+__method__.to_s
|
|
35
36
|
@vars ||= {}
|
|
36
37
|
@vars[:release] = 'latest'
|
|
37
38
|
@vars[:build_store] = '/tmp'
|
|
@@ -142,7 +143,7 @@ module CiCd
|
|
|
142
143
|
|
|
143
144
|
# ---------------------------------------------------------------------------------------------------------------
|
|
144
145
|
def saveEnvironment(ignored=ENV_IGNORED)
|
|
145
|
-
@logger.
|
|
146
|
+
@logger.info CLASS+'::'+__method__.to_s
|
|
146
147
|
@logger.info "Save environment to #{@vars[:vars_fil]}"
|
|
147
148
|
vstr = ['[global]']
|
|
148
149
|
ENV.to_hash.sort.each{|k,v|
|
|
@@ -155,7 +156,7 @@ module CiCd
|
|
|
155
156
|
|
|
156
157
|
# ---------------------------------------------------------------------------------------------------------------
|
|
157
158
|
def saveBuild()
|
|
158
|
-
@logger.step __method__.to_s
|
|
159
|
+
@logger.step CLASS+'::'+__method__.to_s
|
|
159
160
|
begin
|
|
160
161
|
raise 'ERROR: Checksum not read' unless @vars.has_key?(:latest_sha)
|
|
161
162
|
raise 'ERROR: Checksum not calculated' unless @vars.has_key?(:build_sha)
|
|
@@ -34,6 +34,7 @@ module CiCd
|
|
|
34
34
|
BAD_ARTIFACTS = i+=1
|
|
35
35
|
ARTIFACT_NOT_FOUND = i+=1
|
|
36
36
|
ARTIFACT_CHECKSUM_BAD = i+=1
|
|
37
|
+
ARTIFACT_MULTI_MATCH = i+=1
|
|
37
38
|
SAVE_LATEST_VARS = i+=1
|
|
38
39
|
SAVE_ENVIRONMENT_VARS = i+=1
|
|
39
40
|
NO_ARTIFACTS = i+=1
|
|
@@ -44,7 +45,7 @@ module CiCd
|
|
|
44
45
|
PRUNE_NO_TREE = i+=1
|
|
45
46
|
PRUNE_NO_VARIANT = i+=1
|
|
46
47
|
PRUNE_NO_PRUNER = i+=1
|
|
47
|
-
|
|
48
|
+
REPO_TOO_OLD = i+=1
|
|
48
49
|
PRUNE_VARIANT_MIA = i+=1
|
|
49
50
|
PRUNE_BAD_BRANCH = i+=1
|
|
50
51
|
PRUNE_BAD_VERSION = i+=1
|
|
@@ -53,6 +54,12 @@ module CiCd
|
|
|
53
54
|
SYNC_BAD_PRODUCT = i+=1
|
|
54
55
|
SYNC_NO_VARIANT = i+=1
|
|
55
56
|
SYNC_NO_DRAWER = i+=1
|
|
57
|
+
REPO_NO_VARIANT = i+=1
|
|
58
|
+
REPO_BAD_VERSION = i+=1
|
|
59
|
+
REPO_BAD_BRANCH = i+=1
|
|
60
|
+
REPO_NO_BUILD = i+=1
|
|
61
|
+
|
|
62
|
+
PRUNE_TOO_OLD = REPO_TOO_OLD
|
|
56
63
|
|
|
57
64
|
require 'awesome_print'
|
|
58
65
|
|
|
@@ -12,12 +12,9 @@ module CiCd
|
|
|
12
12
|
|
|
13
13
|
# ---------------------------------------------------------------------------------------------------------------
|
|
14
14
|
def getRepoClass(type = nil)
|
|
15
|
-
@logger.info __method__.to_s
|
|
15
|
+
@logger.info CLASS+'::'+__method__.to_s
|
|
16
16
|
if type.nil?
|
|
17
17
|
type ||= 'S3'
|
|
18
|
-
if ENV.has_key?('REPO_TYPE')
|
|
19
|
-
type = ENV['REPO_TYPE']
|
|
20
|
-
end
|
|
21
18
|
end
|
|
22
19
|
|
|
23
20
|
@logger.info "#{type} repo interface"
|
|
@@ -32,15 +29,33 @@ module CiCd
|
|
|
32
29
|
end
|
|
33
30
|
|
|
34
31
|
# ---------------------------------------------------------------------------------------------------------------
|
|
35
|
-
def
|
|
36
|
-
@logger.
|
|
37
|
-
|
|
32
|
+
def getRepoInstance(type = nil)
|
|
33
|
+
@logger.info CLASS+'::'+__method__.to_s
|
|
34
|
+
if type.nil?
|
|
35
|
+
type ||= 'S3'
|
|
36
|
+
if ENV.has_key?('REPO_TYPE')
|
|
37
|
+
type = ENV['REPO_TYPE']
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
clazz = getRepoClass(type)
|
|
38
41
|
if clazz.is_a?(Class) and not clazz.nil?
|
|
39
42
|
@repo = clazz.new(self)
|
|
43
|
+
else
|
|
44
|
+
@logger.error "#{clazz.name.to_s} is not a valid repo class"
|
|
45
|
+
@vars[:return_code] = Errors::BUILDER_REPO_TYPE
|
|
46
|
+
end
|
|
47
|
+
@vars[:return_code]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# ---------------------------------------------------------------------------------------------------------------
|
|
51
|
+
def performOnRepoInstance(verb)
|
|
52
|
+
@logger.info CLASS+'::'+__method__.to_s
|
|
53
|
+
getRepoInstance()
|
|
54
|
+
if 0 == @vars[:return_code]
|
|
40
55
|
method = @repo.method(verb)
|
|
41
56
|
if @repo.respond_to?(verb)
|
|
42
|
-
unless method.owner ==
|
|
43
|
-
@logger.warn "#{
|
|
57
|
+
unless method.owner == @repo.class
|
|
58
|
+
@logger.warn "#{@repo.class.name} does not override action #{verb}"
|
|
44
59
|
# else
|
|
45
60
|
# @logger.error "#{clazz.name.to_s} does not implement action #{verb}"
|
|
46
61
|
# @vars[:return_code] = Errors::BUILDER_REPO_ACTION
|
|
@@ -50,45 +65,43 @@ module CiCd
|
|
|
50
65
|
@logger.fatal "'#{verb}' not implemented!"
|
|
51
66
|
@vars[:return_code] = Errors::BUILDER_REPO_ACTION
|
|
52
67
|
end
|
|
53
|
-
else
|
|
54
|
-
@logger.error "#{clazz.name.to_s} is not a valid repo class"
|
|
55
|
-
@vars[:return_code] = Errors::BUILDER_REPO_TYPE
|
|
56
68
|
end
|
|
57
69
|
@vars[:return_code]
|
|
58
70
|
end
|
|
59
71
|
|
|
60
72
|
# ---------------------------------------------------------------------------------------------------------------
|
|
61
73
|
def uploadBuildArtifacts()
|
|
62
|
-
@logger.step __method__.to_s
|
|
74
|
+
@logger.step CLASS+'::'+__method__.to_s
|
|
63
75
|
performOnRepoInstance(__method__.to_s)
|
|
64
76
|
end
|
|
65
77
|
|
|
66
78
|
# ---------------------------------------------------------------------------------------------------------------
|
|
67
79
|
def analyzeInventory()
|
|
68
|
-
@logger.step __method__.to_s
|
|
80
|
+
@logger.step CLASS+'::'+__method__.to_s
|
|
69
81
|
performOnRepoInstance(__method__.to_s)
|
|
70
82
|
end
|
|
71
83
|
|
|
72
84
|
# ---------------------------------------------------------------------------------------------------------------
|
|
73
85
|
def pruneInventory()
|
|
74
|
-
@logger.step __method__.to_s
|
|
86
|
+
@logger.step CLASS+'::'+__method__.to_s
|
|
75
87
|
performOnRepoInstance(__method__.to_s)
|
|
76
88
|
end
|
|
77
89
|
|
|
78
90
|
# ---------------------------------------------------------------------------------------------------------------
|
|
79
91
|
def syncInventory()
|
|
80
|
-
@logger.step __method__.to_s
|
|
92
|
+
@logger.step CLASS+'::'+__method__.to_s
|
|
81
93
|
performOnRepoInstance(__method__.to_s)
|
|
82
94
|
end
|
|
83
95
|
|
|
84
96
|
# ---------------------------------------------------------------------------------------------------------------
|
|
85
97
|
def syncRepo()
|
|
86
|
-
@logger.step __method__.to_s
|
|
98
|
+
@logger.step CLASS+'::'+__method__.to_s
|
|
87
99
|
performOnRepoInstance(__method__.to_s)
|
|
88
100
|
end
|
|
89
101
|
|
|
90
102
|
# ---------------------------------------------------------------------------------------------------------------
|
|
91
103
|
def manifestMetadata
|
|
104
|
+
@logger.info CLASS+'::'+__method__.to_s
|
|
92
105
|
manifest = @vars[:build_mdd].dup
|
|
93
106
|
|
|
94
107
|
manifest[:manifest] = getBuilderVersion
|
|
@@ -339,9 +339,9 @@ EC2 Instance profile
|
|
|
339
339
|
end
|
|
340
340
|
|
|
341
341
|
# ---------------------------------------------------------------------------------------------------------------
|
|
342
|
-
def pullInventory()
|
|
342
|
+
def pullInventory(product=nil)
|
|
343
343
|
json = nil
|
|
344
|
-
key, s3_obj = checkForInventory()
|
|
344
|
+
key, s3_obj = checkForInventory(product)
|
|
345
345
|
# If the inventory has started then add to it else create a new one
|
|
346
346
|
if s3_obj.nil?
|
|
347
347
|
# Start a new inventory
|
|
@@ -370,8 +370,11 @@ EC2 Instance profile
|
|
|
370
370
|
end
|
|
371
371
|
|
|
372
372
|
# ---------------------------------------------------------------------------------------------------------------
|
|
373
|
-
def checkForInventory
|
|
374
|
-
|
|
373
|
+
def checkForInventory(product=nil)
|
|
374
|
+
if product.nil?
|
|
375
|
+
product = @vars[:project_name]
|
|
376
|
+
end
|
|
377
|
+
key = "#{product}/INVENTORY.json"
|
|
375
378
|
s3_obj = maybeS3Object(key)
|
|
376
379
|
return key, s3_obj
|
|
377
380
|
end
|
|
@@ -406,7 +409,7 @@ EC2 Instance profile
|
|
|
406
409
|
|
|
407
410
|
# ---------------------------------------------------------------------------------------------------------------
|
|
408
411
|
def uploadBuildArtifacts()
|
|
409
|
-
@logger.step __method__.to_s
|
|
412
|
+
@logger.step CLASS+'::'+__method__.to_s
|
|
410
413
|
if @vars.has_key?(:build_dir) and @vars.has_key?(:build_pkg)
|
|
411
414
|
artifacts = @vars[:artifacts] rescue []
|
|
412
415
|
|
|
@@ -623,29 +626,7 @@ EC2 Instance profile
|
|
|
623
626
|
puts "\t#{varianth['builds'].size} builds"
|
|
624
627
|
puts "\t#{varianth['branches'].size} branches:\n#{varianth['branches'].ai}"
|
|
625
628
|
# 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
|
|
629
|
+
bmax, bmin, releases, versions, versrels = getVariantVersionsAndReleases(varianth)
|
|
649
630
|
puts "\t#{versions.size} versions:\n#{versions.ai}"
|
|
650
631
|
puts "\t#{releases.size} releases:\n#{releases.ai}"
|
|
651
632
|
puts "\t#{versrels.size} version-releases:\n#{versrels.ai}"
|
|
@@ -677,6 +658,34 @@ EC2 Instance profile
|
|
|
677
658
|
@vars[:return_code]
|
|
678
659
|
end
|
|
679
660
|
|
|
661
|
+
# ---------------------------------------------------------------------------------------------------------------
|
|
662
|
+
def getVariantVersionsAndReleases(varianth)
|
|
663
|
+
versions = {}
|
|
664
|
+
releases = {}
|
|
665
|
+
versrels = {}
|
|
666
|
+
bmin = -1
|
|
667
|
+
bmax = -1
|
|
668
|
+
varianth['builds'].each do |bld|
|
|
669
|
+
releases[bld['release']] ||= 0
|
|
670
|
+
releases[bld['release']] += 1
|
|
671
|
+
unless bld['build_number'].nil?
|
|
672
|
+
bnum = bld['build_number'].to_i
|
|
673
|
+
if bmin < 0 or bnum < bmin
|
|
674
|
+
bmin = bnum
|
|
675
|
+
end
|
|
676
|
+
if bnum > bmax
|
|
677
|
+
bmax = bnum
|
|
678
|
+
end
|
|
679
|
+
end
|
|
680
|
+
ver = _getMatches(@vars, bld['build_name'], :version)
|
|
681
|
+
versions[ver] ||= 0
|
|
682
|
+
versions[ver] += 1
|
|
683
|
+
versrels["#{ver}-#{bld['release']}"] ||= 0
|
|
684
|
+
versrels["#{ver}-#{bld['release']}"] += 1
|
|
685
|
+
end
|
|
686
|
+
return bmax, bmin, releases, versions, versrels
|
|
687
|
+
end
|
|
688
|
+
|
|
680
689
|
# ---------------------------------------------------------------------------------------------------------------
|
|
681
690
|
def pruneInventory()
|
|
682
691
|
@logger.step __method__.to_s
|
|
@@ -1060,7 +1069,7 @@ EC2 Instance profile
|
|
|
1060
1069
|
varianth['branches'] = Hash[branches.map.with_index.to_a].keys
|
|
1061
1070
|
end
|
|
1062
1071
|
|
|
1063
|
-
|
|
1072
|
+
protected :_update, :_update, :_updateBranches, :_updateLatest, :_updateVersions
|
|
1064
1073
|
|
|
1065
1074
|
end
|
|
1066
1075
|
end
|
|
@@ -1,4 +1,61 @@
|
|
|
1
1
|
require 'artifactory'
|
|
2
|
+
require 'artifactory/version'
|
|
3
|
+
require 'parallel'
|
|
4
|
+
require 'ruby-progressbar'
|
|
5
|
+
|
|
6
|
+
raise "Need to check compatibility of monkey patch for Artifactory.VERSION == #{::Artifactory::VERSION}" unless ::Artifactory::VERSION == '2.2.1'
|
|
7
|
+
module Artifactory
|
|
8
|
+
module Defaults
|
|
9
|
+
class << self
|
|
10
|
+
#
|
|
11
|
+
# Reset all configuration options to their default values.
|
|
12
|
+
#
|
|
13
|
+
# @example Reset all settings
|
|
14
|
+
# Artifactory.reset!
|
|
15
|
+
#
|
|
16
|
+
# @return [self]
|
|
17
|
+
#
|
|
18
|
+
def reset!
|
|
19
|
+
@_options = nil
|
|
20
|
+
options
|
|
21
|
+
end
|
|
22
|
+
alias_method :setup, :reset!
|
|
23
|
+
#
|
|
24
|
+
# Number of seconds to wait for a response from Artifactory
|
|
25
|
+
#
|
|
26
|
+
# @return [Integer, nil]
|
|
27
|
+
#
|
|
28
|
+
def read_timeout
|
|
29
|
+
ENV['ARTIFACTORY_READ_TIMEOUT'].to_s.to_i || 120
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
module Artifactory
|
|
36
|
+
#
|
|
37
|
+
# A re-usable class containing configuration information for the {Client}. See
|
|
38
|
+
# {Defaults} for a list of default values.
|
|
39
|
+
#
|
|
40
|
+
module Configurable
|
|
41
|
+
#
|
|
42
|
+
# Reset all configuration options to their default values.
|
|
43
|
+
#
|
|
44
|
+
# @example Reset all settings
|
|
45
|
+
# Artifactory.reset!
|
|
46
|
+
#
|
|
47
|
+
# @return [self]
|
|
48
|
+
#
|
|
49
|
+
def reset!
|
|
50
|
+
Defaults.reset!
|
|
51
|
+
Artifactory::Configurable.keys.each do |key|
|
|
52
|
+
instance_variable_set(:"@#{key}", Defaults.options[key])
|
|
53
|
+
end
|
|
54
|
+
self
|
|
55
|
+
end
|
|
56
|
+
alias_method :setup, :reset!
|
|
57
|
+
end
|
|
58
|
+
end
|
|
2
59
|
|
|
3
60
|
module CiCd
|
|
4
61
|
module Builder
|
|
@@ -48,6 +105,16 @@ module CiCd
|
|
|
48
105
|
# # config.proxy_address = 'my.proxy.server'
|
|
49
106
|
# # config.proxy_port = '8080'
|
|
50
107
|
# end
|
|
108
|
+
if ENV['ARTIFACTORY_READ_TIMEOUT']
|
|
109
|
+
# [2015-04-29 Christo] Sometimes you just have to shake your head ...
|
|
110
|
+
# a) The Artifactory object does it's setup and read ENV variables during require phase ...
|
|
111
|
+
# b) They do not check if the passed value is valid ( in range or even a number at all ) and they don't convert it to an int
|
|
112
|
+
# c) ENV does not allow one to do this: ENV['ARTIFACTORY_READ_TIMEOUT'] = ENV['ARTIFACTORY_READ_TIMEOUT'].to_s.to_i
|
|
113
|
+
# d) ::Artifactory.setup and ::Artifactory.reset! does not reread those options!!!! OMG!
|
|
114
|
+
# Only resort: Open ::Artifactory class and override the method with the code it should have had ... %)
|
|
115
|
+
::Artifactory.setup
|
|
116
|
+
end
|
|
117
|
+
|
|
51
118
|
@client = ::Artifactory::Client.new()
|
|
52
119
|
end
|
|
53
120
|
|
|
@@ -86,7 +153,7 @@ module CiCd
|
|
|
86
153
|
else
|
|
87
154
|
raise 'Artifact does not have file or data?'
|
|
88
155
|
end
|
|
89
|
-
file_name, file_ext = get_artifact_file_name_ext(data)
|
|
156
|
+
file_name, file_ext = (data[:file_name] and data[:file_ext]) ? [data[:file_name], data[:file_ext]] : get_artifact_file_name_ext(data)
|
|
90
157
|
if file_name =~ %r'\.+'
|
|
91
158
|
raise "Unable to parse out file name in #{data[:file]}"
|
|
92
159
|
end
|
|
@@ -210,22 +277,61 @@ module CiCd
|
|
|
210
277
|
def maybeArtifactoryObject(artifact_name,artifact_version,wide=true)
|
|
211
278
|
begin
|
|
212
279
|
# Get a list of matching artifacts in this repository
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
280
|
+
@logger.info "Artifactory gavc_search g=#{artifactory_org_path()},a=#{artifact_name},v=#{artifact_version},r=#{artifactory_repo()}"
|
|
281
|
+
@arti_search_result = []
|
|
282
|
+
# results = ::Parallel.map([:search,:progress], preserve_results: true, in_threads: 2) { |task|
|
|
283
|
+
# if task == :search
|
|
284
|
+
# @logger.debug 'searching ... '
|
|
285
|
+
# @arti_search_result = @client.artifact_gavc_search(group: artifactory_org_path(), name: artifact_name, version: "#{artifact_version}", repos: [artifactory_repo()])
|
|
286
|
+
# @logger.debug 'searching complete!'
|
|
287
|
+
# raise ::Parallel::Kill
|
|
288
|
+
# # raise ::Parallel::Break # -> stops after all current items are finished
|
|
289
|
+
# else
|
|
290
|
+
# progressbar = ::ProgressBar.create(:title => 'artifact_gavc_search', progress_mark: '=', length: 30, remainder_mark: '.')
|
|
291
|
+
# 30.times { |i|
|
|
292
|
+
# @logger.debug i
|
|
293
|
+
# sleep 1
|
|
294
|
+
# progressbar.increment
|
|
295
|
+
# }
|
|
296
|
+
# raise ::Parallel::Kill
|
|
297
|
+
# end
|
|
298
|
+
# }
|
|
299
|
+
monitor(30, 'artifact_gavc_search'){
|
|
300
|
+
@arti_search_result = @client.artifact_gavc_search(group: artifactory_org_path(), name: artifact_name, version: "#{artifact_version}", repos: [artifactory_repo()])
|
|
301
|
+
}
|
|
302
|
+
# noinspection RubyScope
|
|
303
|
+
if @arti_search_result.size > 0
|
|
304
|
+
@logger.info "\tresult: #{@arti_search_result}"
|
|
217
305
|
elsif wide
|
|
218
306
|
@logger.warn 'GAVC search came up empty!'
|
|
219
|
-
|
|
220
|
-
@logger.info "Artifactory search match a=#{artifact_name},r=#{artifactory_repo()}: #{
|
|
307
|
+
@arti_search_result = @client.artifact_search(name: artifact_name, repos: [artifactory_repo()])
|
|
308
|
+
@logger.info "Artifactory search match a=#{artifact_name},r=#{artifactory_repo()}: #{@arti_search_result}"
|
|
221
309
|
end
|
|
222
|
-
|
|
310
|
+
@arti_search_result
|
|
223
311
|
rescue Exception => e
|
|
224
312
|
@logger.error "Artifactory error: #{e.class.name} #{e.message}"
|
|
225
313
|
raise e
|
|
226
314
|
end
|
|
227
315
|
end
|
|
228
316
|
|
|
317
|
+
def monitor(limit,title='Progress')
|
|
318
|
+
raise 'Must have a block' unless block_given?
|
|
319
|
+
thread = Thread.new(){
|
|
320
|
+
yield
|
|
321
|
+
}
|
|
322
|
+
progressbar = ::ProgressBar.create({title: title, progress_mark: '=', starting_at: 0, total: limit, remainder_mark: '.', throttle_rate: 0.5})
|
|
323
|
+
limit.times do
|
|
324
|
+
res = thread.join(1)
|
|
325
|
+
progressbar.increment
|
|
326
|
+
progressbar.total = limit
|
|
327
|
+
unless thread.alive? #or thread.stop?
|
|
328
|
+
puts ''
|
|
329
|
+
break
|
|
330
|
+
end
|
|
331
|
+
end
|
|
332
|
+
thread.kill if thread.alive? or thread.stop?
|
|
333
|
+
end
|
|
334
|
+
|
|
229
335
|
def uploadArtifact(artifact_module, artifact_version, artifact_path, data)
|
|
230
336
|
data[:size] = File.size(data[:file])
|
|
231
337
|
artifact = ::Artifactory::Resource::Artifact.new(local_path: data[:file], client: @client)
|
|
@@ -236,10 +342,38 @@ module CiCd
|
|
|
236
342
|
}
|
|
237
343
|
artifact.size = data[:size]
|
|
238
344
|
@logger.info "[#{Time.now.strftime('%Y-%m-%d %H:%M:%S %z')}] Start upload #{artifact_path} = #{data[:size]} bytes"
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
345
|
+
monitor(30, 'upload') {
|
|
346
|
+
@arti_upload_result = artifact.upload(artifactory_repo(), "#{artifact_path}", data[:properties] || {})
|
|
347
|
+
}
|
|
348
|
+
@logger.info "[#{Time.now.strftime('%Y-%m-%d %H:%M:%S %z')}] Uploaded: #{@arti_upload_result.attributes.select { |k, _| k != :client }.ai}"
|
|
349
|
+
3.times{
|
|
350
|
+
@arti_upload_checksum = false
|
|
351
|
+
monitor(30, 'upload_checksum') {
|
|
352
|
+
begin
|
|
353
|
+
artifact.upload_checksum(artifactory_repo(), "#{artifact_path}", :sha1, data[:sha1])
|
|
354
|
+
@arti_upload_checksum = true
|
|
355
|
+
rescue Exception => e
|
|
356
|
+
@logger.fatal "Failed to upload #{artifact_path}: #{e.class.name} #{e.message}"
|
|
357
|
+
raise e
|
|
358
|
+
end
|
|
359
|
+
}
|
|
360
|
+
break if @arti_upload_checksum
|
|
361
|
+
}
|
|
362
|
+
raise "Failed to upload SHA1 for #{artifact_path}" unless @arti_upload_checksum
|
|
363
|
+
3.times{
|
|
364
|
+
@arti_upload_checksum = false
|
|
365
|
+
monitor(30, 'upload_checksum') {
|
|
366
|
+
begin
|
|
367
|
+
artifact.upload_checksum(artifactory_repo(), "#{artifact_path}", :md5, data[:md5])
|
|
368
|
+
@arti_upload_checksum = true
|
|
369
|
+
rescue Exception => e
|
|
370
|
+
@logger.fatal "Failed to upload #{artifact_path}: #{e.class.name} #{e.message}"
|
|
371
|
+
raise e
|
|
372
|
+
end
|
|
373
|
+
}
|
|
374
|
+
break if @arti_upload_checksum
|
|
375
|
+
}
|
|
376
|
+
raise "Failed to upload MD5 for #{artifact_path}" unless @arti_upload_checksum
|
|
243
377
|
attempt = 0
|
|
244
378
|
objects = []
|
|
245
379
|
while attempt < 3
|
|
@@ -258,8 +392,17 @@ module CiCd
|
|
|
258
392
|
@logger.info "Not copying (identical artifact): #{artifact_path}"
|
|
259
393
|
else
|
|
260
394
|
@logger.info "[#{Time.now.strftime('%Y-%m-%d %H:%M:%S %z')}] Start copy #{artifact_path} = #{artifact.attributes[:size]} bytes"
|
|
261
|
-
|
|
262
|
-
|
|
395
|
+
copied = false
|
|
396
|
+
3.times{
|
|
397
|
+
copied = false
|
|
398
|
+
monitor(30){
|
|
399
|
+
result = artifact.copy("#{artifactory_repo()}/#{artifact_path}")
|
|
400
|
+
@logger.info "[#{Time.now.strftime('%Y-%m-%d %H:%M:%S %z')}] Copied: #{result.ai}"
|
|
401
|
+
copied = true
|
|
402
|
+
}
|
|
403
|
+
break if copied
|
|
404
|
+
}
|
|
405
|
+
raise "Failed to copy #{artifact_path}" unless copied
|
|
263
406
|
end
|
|
264
407
|
objects = maybeArtifactoryObject(artifact_module, artifact_version, false)
|
|
265
408
|
unless objects.size > 0
|
|
@@ -276,7 +419,7 @@ module CiCd
|
|
|
276
419
|
|
|
277
420
|
# ---------------------------------------------------------------------------------------------------------------
|
|
278
421
|
def uploadBuildArtifacts()
|
|
279
|
-
@logger.step __method__.to_s
|
|
422
|
+
@logger.step CLASS+'::'+__method__.to_s
|
|
280
423
|
if @vars.has_key?(:build_dir) and @vars.has_key?(:build_pkg)
|
|
281
424
|
begin
|
|
282
425
|
artifacts = @vars[:artifacts] rescue []
|
|
@@ -314,6 +457,22 @@ module CiCd
|
|
|
314
457
|
@vars[:return_code]
|
|
315
458
|
end
|
|
316
459
|
|
|
460
|
+
# ---------------------------------------------------------------------------------------------------------------
|
|
461
|
+
def cleanupTempFiles
|
|
462
|
+
@vars[:artifacts].each do |art|
|
|
463
|
+
if art[:data][:temp].is_a?(FalseClass)
|
|
464
|
+
if File.exists?(art[:data][:file])
|
|
465
|
+
File.unlink(art[:data][:file]) if File.exists?(art[:data][:file])
|
|
466
|
+
art[:data].delete(:file)
|
|
467
|
+
art[:data].delete(:temp)
|
|
468
|
+
else
|
|
469
|
+
@logger.warn "Temporary file disappeared: #{data.ai}"
|
|
470
|
+
@vars[:return_code] = Errors::TEMP_FILE_MISSING
|
|
471
|
+
end
|
|
472
|
+
end
|
|
473
|
+
end
|
|
474
|
+
end
|
|
475
|
+
|
|
317
476
|
end
|
|
318
477
|
end
|
|
319
478
|
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.50'
|
|
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.50
|
|
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-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: awesome_print
|
|
@@ -210,6 +210,46 @@ dependencies:
|
|
|
210
210
|
- - "<"
|
|
211
211
|
- !ruby/object:Gem::Version
|
|
212
212
|
version: '2.3'
|
|
213
|
+
- !ruby/object:Gem::Dependency
|
|
214
|
+
name: parallel
|
|
215
|
+
requirement: !ruby/object:Gem::Requirement
|
|
216
|
+
requirements:
|
|
217
|
+
- - ">="
|
|
218
|
+
- !ruby/object:Gem::Version
|
|
219
|
+
version: 1.4.1
|
|
220
|
+
- - "<"
|
|
221
|
+
- !ruby/object:Gem::Version
|
|
222
|
+
version: '1.5'
|
|
223
|
+
type: :runtime
|
|
224
|
+
prerelease: false
|
|
225
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
226
|
+
requirements:
|
|
227
|
+
- - ">="
|
|
228
|
+
- !ruby/object:Gem::Version
|
|
229
|
+
version: 1.4.1
|
|
230
|
+
- - "<"
|
|
231
|
+
- !ruby/object:Gem::Version
|
|
232
|
+
version: '1.5'
|
|
233
|
+
- !ruby/object:Gem::Dependency
|
|
234
|
+
name: ruby-progressbar
|
|
235
|
+
requirement: !ruby/object:Gem::Requirement
|
|
236
|
+
requirements:
|
|
237
|
+
- - ">="
|
|
238
|
+
- !ruby/object:Gem::Version
|
|
239
|
+
version: 1.7.5
|
|
240
|
+
- - "<"
|
|
241
|
+
- !ruby/object:Gem::Version
|
|
242
|
+
version: '2'
|
|
243
|
+
type: :runtime
|
|
244
|
+
prerelease: false
|
|
245
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
246
|
+
requirements:
|
|
247
|
+
- - ">="
|
|
248
|
+
- !ruby/object:Gem::Version
|
|
249
|
+
version: 1.7.5
|
|
250
|
+
- - "<"
|
|
251
|
+
- !ruby/object:Gem::Version
|
|
252
|
+
version: '2'
|
|
213
253
|
- !ruby/object:Gem::Dependency
|
|
214
254
|
name: bundler
|
|
215
255
|
requirement: !ruby/object:Gem::Requirement
|