omnibus 5.2.0 → 5.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE.md +26 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +6 -0
- data/.travis.yml +7 -1
- data/CHANGELOG.md +24 -0
- data/MAINTAINERS.md +5 -5
- data/README.md +2 -2
- data/appveyor.yml +2 -0
- data/features/commands/build.feature +40 -6
- data/features/commands/clean.feature +2 -2
- data/features/commands/manifest.feature +131 -0
- data/features/step_definitions/generator_steps.rb +23 -7
- data/lib/omnibus.rb +3 -0
- data/lib/omnibus/cli.rb +20 -0
- data/lib/omnibus/download_helpers.rb +137 -0
- data/lib/omnibus/fetchers/git_fetcher.rb +8 -1
- data/lib/omnibus/fetchers/net_fetcher.rb +8 -81
- data/lib/omnibus/health_check.rb +54 -1
- data/lib/omnibus/licensing.rb +172 -4
- data/lib/omnibus/packager.rb +1 -0
- data/lib/omnibus/packagers/bff.rb +8 -2
- data/lib/omnibus/packagers/deb.rb +2 -24
- data/lib/omnibus/packagers/rpm.rb +1 -1
- data/lib/omnibus/project.rb +7 -0
- data/lib/omnibus/software.rb +72 -21
- data/lib/omnibus/version.rb +1 -1
- data/omnibus.gemspec +2 -1
- data/spec/functional/licensing_spec.rb +109 -13
- data/spec/unit/health_check_spec.rb +4 -2
- data/spec/unit/packagers/deb_spec.rb +26 -85
- data/spec/unit/packagers/rpm_spec.rb +12 -2
- data/spec/unit/software_spec.rb +154 -15
- metadata +24 -5
@@ -105,7 +105,7 @@ module Omnibus
|
|
105
105
|
#
|
106
106
|
def license(val = NULL)
|
107
107
|
if null?(val)
|
108
|
-
@license ||
|
108
|
+
@license || project.license
|
109
109
|
else
|
110
110
|
unless val.is_a?(String)
|
111
111
|
raise InvalidValue.new(:license, 'be a String')
|
@@ -397,29 +397,7 @@ module Omnibus
|
|
397
397
|
# @return [String]
|
398
398
|
#
|
399
399
|
def safe_architecture
|
400
|
-
|
401
|
-
when 'x86_64'
|
402
|
-
'amd64'
|
403
|
-
when 'i686'
|
404
|
-
'i386'
|
405
|
-
when /armv\dl/
|
406
|
-
if Ohai['platform'] == 'raspbian' || Ohai['platform'] == 'ubuntu'
|
407
|
-
'armhf'
|
408
|
-
else
|
409
|
-
Ohai['kernel']['machine']
|
410
|
-
end
|
411
|
-
when 'aarch64'
|
412
|
-
# Debian prefers amd64 on ARMv8/AArch64 (64bit ARM) platforms
|
413
|
-
# see https://wiki.debian.org/Arm64Port
|
414
|
-
'arm64'
|
415
|
-
when 'ppc64le'
|
416
|
-
# Debian prefers to use ppc64el for little endian architecture name
|
417
|
-
# where as others like gnutools/rhel use ppc64le( note the last 2 chars)
|
418
|
-
# see http://linux.debian.ports.powerpc.narkive.com/8eeWSBtZ/switching-ppc64el-port-name-to-ppc64le
|
419
|
-
'ppc64el' #dpkg --print-architecture = ppc64el
|
420
|
-
else
|
421
|
-
Ohai['kernel']['machine']
|
422
|
-
end
|
400
|
+
@safe_architecture ||= shellout!("dpkg --print-architecture").stdout.split("\n").first || "noarch"
|
423
401
|
end
|
424
402
|
end
|
425
403
|
end
|
data/lib/omnibus/project.rb
CHANGED
data/lib/omnibus/software.rb
CHANGED
@@ -52,6 +52,13 @@ module Omnibus
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
+
#
|
56
|
+
# Reset cached software information.
|
57
|
+
#
|
58
|
+
def reset!
|
59
|
+
@loaded_softwares = nil
|
60
|
+
end
|
61
|
+
|
55
62
|
private
|
56
63
|
|
57
64
|
#
|
@@ -237,6 +244,8 @@ module Omnibus
|
|
237
244
|
#
|
238
245
|
# @option val [String] :git (nil)
|
239
246
|
# a git URL
|
247
|
+
# @option val [String] :github (nil)
|
248
|
+
# a github ORG/REPO pair (e.g. chef/chef) that will be transformed to https://github.com/ORG/REPO.git
|
240
249
|
# @option val [String] :url (nil)
|
241
250
|
# general URL
|
242
251
|
# @option val [String] :path (nil)
|
@@ -280,6 +289,8 @@ module Omnibus
|
|
280
289
|
"be a kind of `Hash', but was `#{val.class.inspect}'")
|
281
290
|
end
|
282
291
|
|
292
|
+
val = canonicalize_source(val)
|
293
|
+
|
283
294
|
extra_keys = val.keys - [
|
284
295
|
:git, :path, :url, # fetcher types
|
285
296
|
:md5, :sha1, :sha256, :sha512, # hash type - common to all fetchers
|
@@ -302,7 +313,8 @@ module Omnibus
|
|
302
313
|
@source.merge!(val)
|
303
314
|
end
|
304
315
|
|
305
|
-
|
316
|
+
override = canonicalize_source(overrides[:source])
|
317
|
+
apply_overrides(:source, override)
|
306
318
|
end
|
307
319
|
expose :source
|
308
320
|
|
@@ -589,18 +601,34 @@ module Omnibus
|
|
589
601
|
"CFLAGS" => "-I#{install_dir}/embedded/include -O2",
|
590
602
|
}
|
591
603
|
when "solaris2"
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
604
|
+
if platform_version.satisfies?('<= 5.10')
|
605
|
+
solaris_flags = {
|
606
|
+
# this override is due to a bug in libtool documented here:
|
607
|
+
# http://lists.gnu.org/archive/html/bug-libtool/2005-10/msg00004.html
|
608
|
+
"CC" => "gcc -static-libgcc",
|
609
|
+
"LDFLAGS" => "-R#{install_dir}/embedded/lib -L#{install_dir}/embedded/lib -static-libgcc",
|
610
|
+
"CFLAGS" => "-I#{install_dir}/embedded/include",
|
611
|
+
}
|
612
|
+
elsif platform_version.satisfies?('>= 5.11')
|
613
|
+
solaris_flags = {
|
614
|
+
"CC" => "gcc -m64 -static-libgcc",
|
615
|
+
"LDFLAGS" => "-Wl,-rpath,#{install_dir}/embedded/lib -L#{install_dir}/embedded/lib -static-libgcc",
|
616
|
+
"CFLAGS" => "-I#{install_dir}/embedded/include -O2",
|
617
|
+
}
|
618
|
+
end
|
619
|
+
solaris_flags
|
599
620
|
when "freebsd"
|
600
621
|
freebsd_flags = {
|
601
622
|
"LDFLAGS" => "-L#{install_dir}/embedded/lib",
|
602
623
|
"CFLAGS" => "-I#{install_dir}/embedded/include -O2",
|
603
624
|
}
|
625
|
+
# Enable gcc version 4.9 if it is available
|
626
|
+
if (Ohai['os_version'].to_i <= 903000) && which('gcc49')
|
627
|
+
freebsd_flags.merge!(
|
628
|
+
"CC" => "gcc49",
|
629
|
+
"CXX" => "g++49",
|
630
|
+
)
|
631
|
+
end
|
604
632
|
# Clang became the default compiler in FreeBSD 10+
|
605
633
|
if Ohai['os_version'].to_i >= 1000024
|
606
634
|
freebsd_flags.merge!(
|
@@ -614,8 +642,16 @@ module Omnibus
|
|
614
642
|
opt_flag = windows_arch_i386? ? "-march=i686" : "-march=x86-64"
|
615
643
|
{
|
616
644
|
"LDFLAGS" => "-L#{install_dir}/embedded/lib #{arch_flag}",
|
617
|
-
#
|
618
|
-
|
645
|
+
# We do not wish to enable SSE even though we target i686 because
|
646
|
+
# of a stack alignment issue with some libraries. We have not
|
647
|
+
# exactly ascertained the cause but some compiled library/binary
|
648
|
+
# violates gcc's assumption that the stack is going to be 16-byte
|
649
|
+
# aligned which is just fine as long as one is pushing 32-bit
|
650
|
+
# values from general purpose registers but stuff hits the fan as
|
651
|
+
# soon as gcc emits aligned SSE xmm register spills which generate
|
652
|
+
# GPEs and terminate the application very rudely with very little
|
653
|
+
# to debug with.
|
654
|
+
"CFLAGS" => "-I#{install_dir}/embedded/include #{arch_flag} -O3 #{opt_flag}"
|
619
655
|
}
|
620
656
|
else
|
621
657
|
{
|
@@ -648,14 +684,17 @@ module Omnibus
|
|
648
684
|
}
|
649
685
|
|
650
686
|
if solaris2?
|
651
|
-
# in order to provide compatibility for earlier versions of libc on solaris 10,
|
652
|
-
# we need to specify a mapfile that restricts the version of system libraries
|
653
|
-
# used. See http://docs.oracle.com/cd/E23824_01/html/819-0690/chapter5-1.html
|
654
|
-
# for more information
|
655
|
-
# use the mapfile if it exists, otherwise ignore it
|
656
687
|
ld_options = "-R#{install_dir}/embedded/lib"
|
657
|
-
|
658
|
-
|
688
|
+
|
689
|
+
if platform_version.satisfies?('<= 5.10')
|
690
|
+
# in order to provide compatibility for earlier versions of libc on solaris 10,
|
691
|
+
# we need to specify a mapfile that restricts the version of system libraries
|
692
|
+
# used. See http://docs.oracle.com/cd/E23824_01/html/819-0690/chapter5-1.html
|
693
|
+
# for more information
|
694
|
+
# use the mapfile if it exists, otherwise ignore it
|
695
|
+
mapfile_path = File.expand_path(Config.solaris_linker_mapfile, Config.project_root)
|
696
|
+
ld_options << " -M #{mapfile_path}" if File.exist?(mapfile_path)
|
697
|
+
end
|
659
698
|
|
660
699
|
# solaris linker can also use LD_OPTIONS, so we throw the kitchen sink against
|
661
700
|
# the linker, to find every way to make it use our rpath. This is also required
|
@@ -1069,15 +1108,27 @@ module Omnibus
|
|
1069
1108
|
# Apply overrides in the @overrides hash that mask instance variables
|
1070
1109
|
# that are set by parsing the DSL
|
1071
1110
|
#
|
1072
|
-
def apply_overrides(attr)
|
1111
|
+
def apply_overrides(attr, override=overrides[attr])
|
1073
1112
|
val = instance_variable_get(:"@#{attr}")
|
1074
|
-
if val.is_a?(Hash) ||
|
1113
|
+
if val.is_a?(Hash) || override.is_a?(Hash)
|
1075
1114
|
val ||= {}
|
1076
|
-
override
|
1115
|
+
override ||= {}
|
1077
1116
|
val.merge(override)
|
1078
1117
|
else
|
1079
|
-
|
1118
|
+
override || val
|
1119
|
+
end
|
1120
|
+
end
|
1121
|
+
|
1122
|
+
#
|
1123
|
+
# Transform github -> git in source
|
1124
|
+
#
|
1125
|
+
def canonicalize_source(source)
|
1126
|
+
if source.is_a?(Hash) && source[:github]
|
1127
|
+
source = source.dup
|
1128
|
+
source[:git] = "https://github.com/#{source[:github]}.git"
|
1129
|
+
source.delete(:github)
|
1080
1130
|
end
|
1131
|
+
source
|
1081
1132
|
end
|
1082
1133
|
|
1083
1134
|
#
|
data/lib/omnibus/version.rb
CHANGED
data/omnibus.gemspec
CHANGED
@@ -36,10 +36,11 @@ Gem::Specification.new do |gem|
|
|
36
36
|
gem.add_development_dependency 'bundler'
|
37
37
|
gem.add_development_dependency 'artifactory', '~> 2.0'
|
38
38
|
gem.add_development_dependency 'aruba', '~> 0.5'
|
39
|
-
gem.add_development_dependency 'fauxhai', '~> 2
|
39
|
+
gem.add_development_dependency 'fauxhai', '~> 3.2'
|
40
40
|
gem.add_development_dependency 'rspec', '~> 3.0'
|
41
41
|
gem.add_development_dependency 'rspec-its'
|
42
42
|
gem.add_development_dependency 'webmock'
|
43
43
|
gem.add_development_dependency 'rake'
|
44
44
|
gem.add_development_dependency 'appbundler'
|
45
|
+
gem.add_development_dependency 'pry'
|
45
46
|
end
|
@@ -9,11 +9,16 @@ module Omnibus
|
|
9
9
|
let(:install_dir) { File.join(tmp_path, "install_dir")}
|
10
10
|
let(:software_project_dir) { File.join(tmp_path, "software_project_dir")}
|
11
11
|
|
12
|
+
let(:expected_project_license_path) { "LICENSE" }
|
13
|
+
let(:expected_project_license) { "Unspecified" }
|
14
|
+
let(:expected_project_license_content) { "" }
|
15
|
+
|
12
16
|
before do
|
13
17
|
FileUtils.mkdir_p(install_dir)
|
14
18
|
FileUtils.mkdir_p(software_project_dir)
|
19
|
+
|
15
20
|
allow_any_instance_of(Software).to receive(:project_dir).and_return(software_project_dir)
|
16
|
-
%w{
|
21
|
+
%w{LICENSE NOTICE}.each do |file|
|
17
22
|
File.open(File.join(software_project_dir, file), "w+") do |f|
|
18
23
|
f.puts "This file is #{file}."
|
19
24
|
end
|
@@ -22,6 +27,7 @@ module Omnibus
|
|
22
27
|
|
23
28
|
shared_examples "correctly created licenses" do
|
24
29
|
it "creates the main license file for the project correctly" do
|
30
|
+
create_licenses
|
25
31
|
project_license = File.join(install_dir, expected_project_license_path)
|
26
32
|
expect(File.exist?(project_license)).to be(true)
|
27
33
|
project_license = File.read(project_license)
|
@@ -31,20 +37,36 @@ module Omnibus
|
|
31
37
|
expect(project_license).to match /This product bundles snoopy 1.0.0,\nwhich is available under a "GPL v2"/
|
32
38
|
expect(project_license).to match /This product bundles zlib 1.7.2,\nwhich is available under a "Zlib"/
|
33
39
|
expect(project_license).not_to match /preparation/
|
34
|
-
expect(project_license).to match /LICENSES\/snoopy-
|
40
|
+
expect(project_license).to match /LICENSES\/snoopy-artistic.html/
|
35
41
|
expect(project_license).to match /LICENSES\/snoopy-NOTICE/
|
36
42
|
expect(project_license).to match /LICENSES\/zlib-LICENSE/
|
37
43
|
end
|
38
44
|
|
39
45
|
it "creates the license files of software components correctly" do
|
46
|
+
create_licenses
|
40
47
|
license_dir = File.join(install_dir, "LICENSES")
|
41
48
|
expect(Dir.glob("#{license_dir}/**/*").length).to be(3)
|
42
49
|
|
43
|
-
%w{snoopy-NOTICE
|
50
|
+
%w{snoopy-NOTICE zlib-LICENSE}.each do |software_license|
|
44
51
|
license_path = File.join(license_dir, software_license)
|
45
52
|
expect(File.exist?(license_path)).to be(true)
|
46
53
|
expect(File.read(license_path)).to match /#{software_license.split("-").last}/
|
47
54
|
end
|
55
|
+
|
56
|
+
remote_license_file = File.join(license_dir, "snoopy-artistic.html")
|
57
|
+
remote_license_file_contents = File.read(remote_license_file)
|
58
|
+
expect(File.exist?(remote_license_file)).to be(true)
|
59
|
+
expect(remote_license_file_contents).to match /The "Artistic License" - dev.perl.org/
|
60
|
+
end
|
61
|
+
|
62
|
+
it "warns for non-standard software license info" do
|
63
|
+
output = capture_logging { create_licenses }
|
64
|
+
expect(output).to include("Software 'snoopy' uses license 'GPL v2' which is not one of the standard licenses")
|
65
|
+
end
|
66
|
+
|
67
|
+
it "warns for missing software license info" do
|
68
|
+
output = capture_logging { create_licenses }
|
69
|
+
expect(output).to include("Software 'private_code' does not contain licensing information.")
|
48
70
|
end
|
49
71
|
end
|
50
72
|
|
@@ -80,7 +102,7 @@ module Omnibus
|
|
80
102
|
name 'snoopy'
|
81
103
|
default_version '1.0.0'
|
82
104
|
license "GPL v2"
|
83
|
-
license_file "
|
105
|
+
license_file "http://dev.perl.org/licenses/artistic.html"
|
84
106
|
license_file "NOTICE"
|
85
107
|
end
|
86
108
|
end
|
@@ -93,25 +115,25 @@ module Omnibus
|
|
93
115
|
end
|
94
116
|
end
|
95
117
|
|
118
|
+
let(:software_with_warnings) { nil }
|
119
|
+
|
96
120
|
def create_licenses
|
97
121
|
project.library.component_added(preparation)
|
98
122
|
project.library.component_added(snoopy)
|
99
123
|
project.library.component_added(zlib)
|
100
124
|
project.library.component_added(private_code)
|
125
|
+
project.library.component_added(software_with_warnings) if software_with_warnings
|
101
126
|
|
102
127
|
Licensing.create!(project)
|
103
128
|
end
|
104
129
|
|
105
130
|
describe "without license definitions in the project" do
|
106
|
-
|
107
|
-
let(:expected_project_license) { "Unspecified" }
|
108
|
-
let(:expected_project_license_content) { "" }
|
131
|
+
it_behaves_like "correctly created licenses"
|
109
132
|
|
110
|
-
|
111
|
-
create_licenses
|
133
|
+
it "warns for missing project license" do
|
134
|
+
output = capture_logging { create_licenses }
|
135
|
+
expect(output).to include("Project 'test-project' does not contain licensing information.")
|
112
136
|
end
|
113
|
-
|
114
|
-
it_behaves_like "correctly created licenses"
|
115
137
|
end
|
116
138
|
|
117
139
|
describe "with license definitions in the project" do
|
@@ -127,8 +149,6 @@ module Omnibus
|
|
127
149
|
File.open(File.join(Config.project_root, license_file), "w+") do |f|
|
128
150
|
f.puts "Chef Custom License is awesome."
|
129
151
|
end
|
130
|
-
|
131
|
-
create_licenses
|
132
152
|
end
|
133
153
|
|
134
154
|
after do
|
@@ -136,6 +156,82 @@ module Omnibus
|
|
136
156
|
end
|
137
157
|
|
138
158
|
it_behaves_like "correctly created licenses"
|
159
|
+
|
160
|
+
it "warns for non-standard project license" do
|
161
|
+
output = capture_logging { create_licenses }
|
162
|
+
expect(output).to include("Project 'test-project' is using 'Custom Chef' which is not one of the standard licenses")
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
describe "with a local license file that does not exist" do
|
167
|
+
let(:software_with_warnings) do
|
168
|
+
Software.new(project, 'problematic.rb').evaluate do
|
169
|
+
name 'problematic'
|
170
|
+
default_version '0.10.2'
|
171
|
+
license_file "NOT_EXISTS"
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
it_behaves_like "correctly created licenses"
|
176
|
+
|
177
|
+
it "should log a warning for the missing file" do
|
178
|
+
output = capture_logging { create_licenses }
|
179
|
+
expect(output).to match /License file (.*)NOT_EXISTS' does not exist for software 'problematic'./
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
describe "with a remote license file that does not exist" do
|
184
|
+
before do
|
185
|
+
Omnibus::Config.fetcher_retries(1)
|
186
|
+
end
|
187
|
+
|
188
|
+
let(:software_with_warnings) do
|
189
|
+
Software.new(project, 'problematic.rb').evaluate do
|
190
|
+
name 'problematic'
|
191
|
+
default_version '0.10.2'
|
192
|
+
license_file "https://downloads.chef.io/LICENSE"
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
it_behaves_like "correctly created licenses"
|
197
|
+
|
198
|
+
it "should log a warning for the missing file" do
|
199
|
+
output = capture_logging { create_licenses }
|
200
|
+
expect(output).to match(/Retrying failed download/)
|
201
|
+
expect(output).to match(/Can not download license file 'https:\/\/downloads.chef.io\/LICENSE' for software 'problematic'./)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
describe "with a software with no license files" do
|
206
|
+
let(:software_with_warnings) do
|
207
|
+
Software.new(project, 'problematic.rb').evaluate do
|
208
|
+
name 'problematic'
|
209
|
+
default_version '0.10.2'
|
210
|
+
license "Zlib"
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
it_behaves_like "correctly created licenses"
|
215
|
+
|
216
|
+
it "should log a warning for the missing file pointers" do
|
217
|
+
output = capture_logging { create_licenses }
|
218
|
+
expect(output).to include("Software 'problematic' does not point to any license files.")
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
describe "with a project with no license files" do
|
223
|
+
let(:license) { "Zlib" }
|
224
|
+
|
225
|
+
let(:expected_project_license_path) { "LICENSE" }
|
226
|
+
let(:expected_project_license) { license }
|
227
|
+
let(:expected_project_license_content) { "" }
|
228
|
+
|
229
|
+
it_behaves_like "correctly created licenses"
|
230
|
+
|
231
|
+
it "warns for missing license files" do
|
232
|
+
output = capture_logging { create_licenses }
|
233
|
+
expect(output).to include("Project 'test-project' does not point to a license file.")
|
234
|
+
end
|
139
235
|
end
|
140
236
|
end
|
141
237
|
end
|
@@ -139,9 +139,11 @@ module Omnibus
|
|
139
139
|
)
|
140
140
|
end
|
141
141
|
|
142
|
+
let(:regexp) {".*(\\.[ch]|\\.e*rb|\\.gemspec|\\.gitignore|\\.h*h|\\.java|\\.js|\\.json|\\.lock|\\.log|\\.lua|\\.md|\\.mkd|\\.out|\\.pl|\\.pm|\\.png|\\.py[oc]*|\\.r*html|\\.rdoc|\\.ri|\\.sh|\\.sql|\\.toml|\\.ttf|\\.txt|\\.xml|\\.yml|Gemfile|LICENSE|README|Rakefile|VERSION)$|.*\\/share\\/doc\\/.*|.*\\/share\\/postgresql\\/.*|.*\\/share\\/terminfo\\/.*|.*\\/terminfo\\/.*"}
|
143
|
+
|
142
144
|
it 'raises an exception when there are external dependencies' do
|
143
145
|
allow(subject).to receive(:shellout)
|
144
|
-
.with("find #{project.install_dir}/ -type f | xargs ldd")
|
146
|
+
.with("find #{project.install_dir}/ -type f -regextype posix-extended ! -regex '#{regexp}' | xargs ldd")
|
145
147
|
.and_return(bad_healthcheck)
|
146
148
|
|
147
149
|
expect { subject.run! }.to raise_error(HealthCheckFailed)
|
@@ -149,7 +151,7 @@ module Omnibus
|
|
149
151
|
|
150
152
|
it 'does not raise an exception when the healthcheck passes' do
|
151
153
|
allow(subject).to receive(:shellout)
|
152
|
-
.with("find #{project.install_dir}/ -type f | xargs ldd")
|
154
|
+
.with("find #{project.install_dir}/ -type f -regextype posix-extended ! -regex '#{regexp}' | xargs ldd")
|
153
155
|
.and_return(good_healthcheck)
|
154
156
|
|
155
157
|
expect { subject.run! }.to_not raise_error
|