manifest-builder 0.6.0 → 0.6.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +5 -6
- data/lib/cicd/builder/manifest.rb +2 -0
- data/lib/cicd/builder/manifest/mixlib/build.rb +55 -19
- data/lib/cicd/builder/manifest/mixlib/repo/artifactory.rb +110 -21
- data/lib/cicd/builder/manifest/version.rb +1 -1
- data/manifest-builder.gemspec +2 -2
- metadata +4 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b10b3d8ea6cfc58960b69110ceb02434f017b35
|
4
|
+
data.tar.gz: 1d2dc07ea272e2d8ffde9016586873cd5e834350
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f545e10d18b032a1c4f2de06f63f684cff93e2d1fd3d9ddea06e4c976a7f7192e73d6bce5be5b3ff76300f76ddda5a093308c55b472bbf1e287a43f5283781cd
|
7
|
+
data.tar.gz: 6e88d6c42454c00614ced3186896e6744682e451c8557e8f482b26c1b69f36664aa5c951cf75704873247dbb5ed67b69512c5594ab483f46cd285644a2ab8d1f
|
data/Gemfile.lock
CHANGED
@@ -1,24 +1,23 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
manifest-builder (0.6.
|
4
|
+
manifest-builder (0.6.2)
|
5
5
|
archive-tar-minitar (= 0.5.2)
|
6
|
-
chefrepo-builder (>= 0.9.
|
7
|
-
cicd-builder (>= 0.9.47, < 1.1)
|
6
|
+
chefrepo-builder (>= 0.9.32, < 1.1)
|
8
7
|
json (>= 1.8.1, < 1.9)
|
9
8
|
s3etag (>= 0.0.1, < 0.1.0)
|
10
9
|
|
11
10
|
PATH
|
12
11
|
remote: ../chefrepo-builder
|
13
12
|
specs:
|
14
|
-
chefrepo-builder (0.9.
|
13
|
+
chefrepo-builder (0.9.32)
|
15
14
|
cicd-builder (>= 0.9.47, < 1.1)
|
16
15
|
json (= 1.8.1)
|
17
16
|
|
18
17
|
PATH
|
19
18
|
remote: ../cicd-builder
|
20
19
|
specs:
|
21
|
-
cicd-builder (0.9.
|
20
|
+
cicd-builder (0.9.48)
|
22
21
|
artifactory (>= 2.2.1, < 2.3)
|
23
22
|
awesome_print (>= 1.6, < 2.0)
|
24
23
|
aws-sdk (>= 2.0, < 2.1)
|
@@ -84,7 +83,7 @@ GEM
|
|
84
83
|
json (>= 1.4.6)
|
85
84
|
git (1.2.9.1)
|
86
85
|
hashie (2.1.2)
|
87
|
-
highline (1.7.
|
86
|
+
highline (1.7.2)
|
88
87
|
inifile (3.0.0)
|
89
88
|
ipaddress (0.8.0)
|
90
89
|
jmespath (1.0.2)
|
@@ -88,6 +88,7 @@ module CiCd
|
|
88
88
|
|
89
89
|
# ---------------------------------------------------------------------------------------------------------------
|
90
90
|
def getVersionBuild(path,artifact,comp)
|
91
|
+
cname,cdata = comp
|
91
92
|
version,build = File.split(path)
|
92
93
|
if build.match(%r'^\d+$') and version.match(%r'/?\d+\.\d+\.?\d*$') # Hole in one!
|
93
94
|
version = File.basename(version)
|
@@ -96,10 +97,10 @@ module CiCd
|
|
96
97
|
version = build
|
97
98
|
build = ''
|
98
99
|
else
|
99
|
-
version =
|
100
|
+
version = cdata[:build].nil? ? '' : ( cdata[:build] > 0 ? build.to_s : '' )
|
100
101
|
end
|
101
102
|
unless version.match(VER_RGX)
|
102
|
-
version =
|
103
|
+
version = cdata[:version] || ''
|
103
104
|
end
|
104
105
|
ver,bld = getVersionBuildFromName(artifact)
|
105
106
|
if version.empty?
|
@@ -147,7 +148,7 @@ module CiCd
|
|
147
148
|
end
|
148
149
|
end
|
149
150
|
unless build.match(%r'^[1-9]\d*$')
|
150
|
-
build =
|
151
|
+
build = cdata[:build]
|
151
152
|
build = @vars[:build_num] if (build.nil? or build.empty? or build.to_i == 0)
|
152
153
|
end
|
153
154
|
end
|
@@ -221,21 +222,25 @@ module CiCd
|
|
221
222
|
# ---------------------------------------------------------------------------------------------------------------
|
222
223
|
def processComponent(comp, lines)
|
223
224
|
artifact, path, version, build = parseComponent(comp)
|
225
|
+
cname,cdata = comp
|
224
226
|
|
225
227
|
require 'uri'
|
228
|
+
require 'digest'
|
226
229
|
begin
|
227
230
|
key, name, objects = getObjects(artifact, path)
|
228
|
-
local_dir = File.join(@vars[:local_dirs]['artifacts'],
|
231
|
+
local_dir = File.join(@vars[:local_dirs]['artifacts'], cname, '')
|
229
232
|
Dir.mkdir(local_dir, 0700) unless File.directory?(local_dir)
|
230
233
|
artifacts = []
|
234
|
+
sha256 = {}
|
231
235
|
changed = false
|
232
236
|
# 1 or more objects on the key/ path
|
233
237
|
if objects.size > 0
|
234
|
-
lines << "#{
|
238
|
+
lines << "#{cname}:#{artifact} v#{version} b#{build} - #{path}"
|
235
239
|
# When we start pulling the artifacts then everything that is build 0 get this build number, in fact all artifacts get this build number!
|
236
240
|
objects.each do |object|
|
237
241
|
@logger.info "\tchecking #{object.key}"
|
238
|
-
|
242
|
+
base = File.basename(object.key)
|
243
|
+
local = File.join(local_dir, base)
|
239
244
|
etag = object.etag.gsub(%r/['"]/, '')
|
240
245
|
download = shouldDownload?(etag, local, object)
|
241
246
|
if download
|
@@ -243,12 +248,41 @@ module CiCd
|
|
243
248
|
else
|
244
249
|
@logger.info "\t\tunchanged"
|
245
250
|
end
|
251
|
+
sha256[base] = nil
|
252
|
+
if cdata[:sha256]
|
253
|
+
hd = Digest::SHA256.file(local).hexdigest
|
254
|
+
sha256[base] = hd == cdata[:sha256] ? true : hd
|
255
|
+
end
|
256
|
+
|
246
257
|
artifacts << local
|
247
258
|
end
|
248
259
|
# The local file will be 1 artifact or an archive of the local artifacts when artifacts.size > 1
|
249
260
|
if artifacts.size > 0
|
250
|
-
|
251
|
-
|
261
|
+
artifacts.each do |local|
|
262
|
+
base = File.basename(local)
|
263
|
+
if sha256[base].is_a?(String)
|
264
|
+
msg = "Artifact checksum is invalid or manifest is incorrect. Artifact: s3://#{name}/#{key}#{artifact}, SHA256: Manifest=#{cdata[:sha256]}, Actual=#{sha256[base]}"
|
265
|
+
if ENV['ENFORCE_CHECKSUMS'] and ENV['ENFORCE_CHECKSUMS'].downcase =~ %r/^(yes|on|set|1|enable|active|enforced?)$/
|
266
|
+
@logger.fatal msg
|
267
|
+
@vars[:return_code] = Errors::ARTIFACT_CHECKSUM_BAD
|
268
|
+
else
|
269
|
+
@logger.warn msg
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
273
|
+
if 0 == @vars[:return_code]
|
274
|
+
local = getLocalArtifact(artifacts, changed, comp, local_dir, version)
|
275
|
+
base = File.basename(local)
|
276
|
+
addArtifact(@vars[:artifacts], local, local_dir, {
|
277
|
+
component: cname,
|
278
|
+
module: cname,
|
279
|
+
name: cname,
|
280
|
+
build: build,
|
281
|
+
version: version,
|
282
|
+
file: local,
|
283
|
+
sha256: (sha256.keys.include?(base)) ? (sha256[base].is_a?(TrueClass) ? cdata[:sha256] : sha256[base]) : Digest::SHA256.file(local).hexdigest
|
284
|
+
})
|
285
|
+
end
|
252
286
|
end
|
253
287
|
else
|
254
288
|
@logger.fatal "Artifact not found: s3://#{name}/#{key}#{artifact}"
|
@@ -312,9 +346,10 @@ module CiCd
|
|
312
346
|
|
313
347
|
# ---------------------------------------------------------------------------------------------------------------
|
314
348
|
def getLocalArtifact(artifacts, changed, comp, local_dir, version)
|
349
|
+
cname,cdata = comp
|
315
350
|
if artifacts.size > 1
|
316
351
|
begin
|
317
|
-
file = File.join(local_dir, "#{
|
352
|
+
file = File.join(local_dir, "#{cname}-#{version}.zip")
|
318
353
|
if changed or not File.exists?(file)
|
319
354
|
zipped_files = artifacts.map { |f| f.gsub(%r'^#{local_dir}', '') }.join(' ')
|
320
355
|
Dir.chdir(local_dir) do
|
@@ -336,23 +371,24 @@ module CiCd
|
|
336
371
|
|
337
372
|
# ---------------------------------------------------------------------------------------------------------------
|
338
373
|
def parseComponent(comp)
|
339
|
-
|
340
|
-
|
374
|
+
cname,cdata = comp
|
375
|
+
if cdata[:url]
|
376
|
+
path, artifact = File.split(cdata[:url])
|
341
377
|
version, build = getVersionBuild(path, artifact, comp)
|
342
|
-
elsif
|
378
|
+
elsif cdata[:base_url]
|
343
379
|
artifact = ''
|
344
|
-
if
|
380
|
+
if cdata[:build].nil?
|
345
381
|
# noinspection RubyUnusedLocalVariable
|
346
|
-
version, build =
|
382
|
+
version, build = cdata[:version].split(%r'-')
|
347
383
|
# noinspection RubyUnusedLocalVariable
|
348
|
-
path = File.join(
|
384
|
+
path = File.join(cdata[:base_url], cdata[:version])
|
349
385
|
else
|
350
|
-
version, build = [
|
351
|
-
path = File.join(
|
386
|
+
version, build = [cdata[:version], cdata[:build]]
|
387
|
+
path = File.join(cdata[:base_url], cdata[:version], cdata[:build])
|
352
388
|
end
|
353
389
|
else
|
354
|
-
path
|
355
|
-
artifact
|
390
|
+
path = ''
|
391
|
+
artifact = ''
|
356
392
|
version, build = getVersionBuild(path, artifact, comp)
|
357
393
|
end
|
358
394
|
return artifact, path, version, build
|
@@ -57,36 +57,31 @@ module CiCd
|
|
57
57
|
def createProjectsFile
|
58
58
|
@logger.info __method__.to_s
|
59
59
|
projects = {}
|
60
|
-
project_names =
|
61
|
-
unless ENV['PROJECT_NAMES'].nil?
|
62
|
-
if File.exists?(ENV['PROJECT_NAMES'])
|
63
|
-
@logger.info "Load PROJECT_NAMES: #{ENV['PROJECT_NAMES']}"
|
64
|
-
project_names = JSON.load(IO.read(ENV['PROJECT_NAMES'])) || {}
|
65
|
-
else
|
66
|
-
@logger.error "The PROJECT_NAMES file (#{ENV['PROJECT_NAMES']}) does not exist!"
|
67
|
-
@vars[:return_code] = Errors::NO_PROJECT_NAMES
|
68
|
-
end
|
69
|
-
end
|
60
|
+
project_names = loadProjectNames()
|
70
61
|
exts = {}
|
71
62
|
exts = Hash[@vars[:artifacts].map { |a| [a[:data][:name], File.basename(a[:data][:file]).match(CiCd::Builder::Manifest::Build::EXT_RGX)[1]] }]
|
63
|
+
|
64
|
+
createClassesFile()
|
65
|
+
|
72
66
|
@vars[:artifacts].each do |art|
|
73
67
|
prod = art[:data][:name]
|
74
68
|
mod = art[:data][:module]
|
75
69
|
projects[prod] = {
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
70
|
+
name: project_names[prod] || prod,
|
71
|
+
module: mod,
|
72
|
+
ext: exts[prod],
|
73
|
+
class_filter: @vars[:filters][prod] || @vars[:filters][prod.gsub(/-manifest$/, '')],
|
74
|
+
}
|
81
75
|
end
|
82
76
|
|
83
77
|
require 'chef/mash'
|
84
78
|
require 'chef/mixin/deep_merge'
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
79
|
+
|
80
|
+
projects_hash = File.exists?(ENV['PROJECTS_FILE']) ? loadConfigFile(ENV['PROJECTS_FILE']) : {}
|
81
|
+
old_projects = ::Chef::Mash.new(projects_hash)
|
82
|
+
projects = ::Chef::Mash.new(projects)
|
83
|
+
projects = ::Chef::Mash.new(::Chef::Mixin::DeepMerge.deep_merge(projects, old_projects))
|
84
|
+
saveConfigFile(ENV['PROJECTS_FILE'], projects)
|
90
85
|
data = {
|
91
86
|
name: 'projects-file',
|
92
87
|
module: 'projects-file',
|
@@ -99,7 +94,100 @@ module CiCd
|
|
99
94
|
md5: Digest::MD5.file(ENV['PROJECTS_FILE']).hexdigest,
|
100
95
|
}
|
101
96
|
|
102
|
-
maybeUploadArtifactoryObject(
|
97
|
+
maybeUploadArtifactoryObject(
|
98
|
+
data: data,
|
99
|
+
artifact_module: data[:name],
|
100
|
+
artifact_version: data[:version] || @vars[:version],
|
101
|
+
file_name: '',
|
102
|
+
file_ext: (ENV['PROJECTS_FILE'] and ENV['PROJECTS_FILE'].downcase.match(/\.ya?ml$/)) ? 'yaml' : 'json'
|
103
|
+
)
|
104
|
+
end
|
105
|
+
|
106
|
+
# ---------------------------------------------------------------------------------------------------------------
|
107
|
+
# noinspection RubyHashKeysTypesInspection
|
108
|
+
def createClassesFile()
|
109
|
+
@logger.info __method__.to_s
|
110
|
+
project_names = loadProjectNames()
|
111
|
+
|
112
|
+
@vars[:classes] = YAML.load(IO.read(ENV['CLASSES_MANIFEST_FILE']))
|
113
|
+
# keys = Hash[classes.keys.map.with_index.to_a].keys.sort
|
114
|
+
|
115
|
+
@vars[:filters] = {}
|
116
|
+
filters = {}
|
117
|
+
@vars[:classes].each do |role,apps|
|
118
|
+
apps.map{ |app|
|
119
|
+
filters[app] ||= []
|
120
|
+
filters[app] << role
|
121
|
+
}
|
122
|
+
end
|
123
|
+
filters.each do |app,roles|
|
124
|
+
@vars[:filters][app] = Hash[roles.map.with_index.to_a].keys.join('|')
|
125
|
+
end
|
126
|
+
|
127
|
+
saveConfigFile(ENV['CLASSES_FILE'],@vars[:classes])
|
128
|
+
data = {
|
129
|
+
name: 'classes-file',
|
130
|
+
module: 'classes-file',
|
131
|
+
file: ENV['CLASSES_FILE'],
|
132
|
+
version: @vars[:build_ver],
|
133
|
+
build: @vars[:build_num],
|
134
|
+
properties: @properties_matrix,
|
135
|
+
temp: false,
|
136
|
+
sha1: Digest::SHA1.file(ENV['CLASSES_FILE']).hexdigest,
|
137
|
+
md5: Digest::MD5.file(ENV['CLASSES_FILE']).hexdigest,
|
138
|
+
}
|
139
|
+
|
140
|
+
maybeUploadArtifactoryObject(
|
141
|
+
data: data,
|
142
|
+
artifact_module: data[:name],
|
143
|
+
artifact_version: data[:version] || @vars[:version],
|
144
|
+
file_name: '',
|
145
|
+
file_ext: 'yaml'
|
146
|
+
)
|
147
|
+
end
|
148
|
+
|
149
|
+
def saveConfigFile(file, projects)
|
150
|
+
@logger.info "Save config file: #{file}"
|
151
|
+
ext = file.gsub(/\.(\w+)$/, '\1')
|
152
|
+
IO.write(file, case ext.downcase
|
153
|
+
when /ya?ml/
|
154
|
+
projects.to_hash.to_yaml line_width: 1024, indentation: 4, canonical: false
|
155
|
+
when /json|js/
|
156
|
+
JSON.pretty_generate(projects.to_hash, {indent: "\t", space: ' '})
|
157
|
+
else
|
158
|
+
raise "Unsupported extension: #{ext}"
|
159
|
+
end)
|
160
|
+
end
|
161
|
+
|
162
|
+
def loadConfigFile(file)
|
163
|
+
ext = file.gsub(/\.(\w+)$/, '\1')
|
164
|
+
hash = case ext.downcase
|
165
|
+
when /ya?ml/
|
166
|
+
YAML.load_file(ENV['PROJECTS_FILE'])
|
167
|
+
when /json|js/
|
168
|
+
JSON.load(IO.read(ENV['PROJECTS_FILE']))
|
169
|
+
else
|
170
|
+
raise "Unsupported extension: #{ext}"
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def loadProjectNames(fresh=false)
|
175
|
+
if fresh
|
176
|
+
@project_names = nil
|
177
|
+
end
|
178
|
+
unless @project_names
|
179
|
+
@project_names = {}
|
180
|
+
unless ENV['PROJECT_NAMES'].nil?
|
181
|
+
if File.exists?(ENV['PROJECT_NAMES'])
|
182
|
+
@logger.info "Load PROJECT_NAMES: #{ENV['PROJECT_NAMES']}"
|
183
|
+
@project_names = JSON.load(IO.read(ENV['PROJECT_NAMES'])) || {}
|
184
|
+
else
|
185
|
+
@logger.error "The PROJECT_NAMES file (#{ENV['PROJECT_NAMES']}) does not exist!"
|
186
|
+
@vars[:return_code] = Errors::NO_PROJECT_NAMES
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
@project_names
|
103
191
|
end
|
104
192
|
|
105
193
|
def createSuperManifest(manifest)
|
@@ -142,6 +230,7 @@ module CiCd
|
|
142
230
|
data = {
|
143
231
|
name: "#{mod}-manifest",
|
144
232
|
module: "#{mod}-manifest",
|
233
|
+
component: mod,
|
145
234
|
data: manifest_data,
|
146
235
|
version: @vars[:build_ver],
|
147
236
|
build: @vars[:build_num],
|
data/manifest-builder.gemspec
CHANGED
@@ -17,8 +17,8 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
18
|
gem.require_paths = ['lib']
|
19
19
|
|
20
|
-
gem.add_dependency 'cicd-builder', '>= 0.9.
|
21
|
-
gem.add_dependency 'chefrepo-builder', '>= 0.9.
|
20
|
+
# gem.add_dependency 'cicd-builder', '>= 0.9.48', '< 1.1'
|
21
|
+
gem.add_dependency 'chefrepo-builder', '>= 0.9.32', '< 1.1'
|
22
22
|
gem.add_dependency 'json', '>= 1.8.1', '< 1.9'
|
23
23
|
gem.add_dependency 's3etag', '>= 0.0.1', '< 0.1.0'
|
24
24
|
gem.add_dependency 'archive-tar-minitar', '= 0.5.2'
|
metadata
CHANGED
@@ -1,42 +1,22 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: manifest-builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.2
|
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-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: cicd-builder
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 0.9.47
|
20
|
-
- - "<"
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: '1.1'
|
23
|
-
type: :runtime
|
24
|
-
prerelease: false
|
25
|
-
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
requirements:
|
27
|
-
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 0.9.47
|
30
|
-
- - "<"
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '1.1'
|
33
13
|
- !ruby/object:Gem::Dependency
|
34
14
|
name: chefrepo-builder
|
35
15
|
requirement: !ruby/object:Gem::Requirement
|
36
16
|
requirements:
|
37
17
|
- - ">="
|
38
18
|
- !ruby/object:Gem::Version
|
39
|
-
version: 0.9.
|
19
|
+
version: 0.9.32
|
40
20
|
- - "<"
|
41
21
|
- !ruby/object:Gem::Version
|
42
22
|
version: '1.1'
|
@@ -46,7 +26,7 @@ dependencies:
|
|
46
26
|
requirements:
|
47
27
|
- - ">="
|
48
28
|
- !ruby/object:Gem::Version
|
49
|
-
version: 0.9.
|
29
|
+
version: 0.9.32
|
50
30
|
- - "<"
|
51
31
|
- !ruby/object:Gem::Version
|
52
32
|
version: '1.1'
|