omnibus 4.1.0 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +22 -0
- data/MAINTAINERS.md +2 -1
- data/README.md +1 -1
- data/lib/omnibus/builder.rb +2 -17
- data/lib/omnibus/cli/publish.rb +4 -0
- data/lib/omnibus/exceptions.rb +12 -0
- data/lib/omnibus/fetchers/net_fetcher.rb +4 -0
- data/lib/omnibus/manifest.rb +1 -1
- data/lib/omnibus/metadata.rb +13 -4
- data/lib/omnibus/packager.rb +1 -0
- data/lib/omnibus/packagers/base.rb +1 -0
- data/lib/omnibus/packagers/bff.rb +1 -1
- data/lib/omnibus/packagers/deb.rb +4 -0
- data/lib/omnibus/packagers/msi.rb +168 -55
- data/lib/omnibus/packagers/rpm.rb +41 -29
- data/lib/omnibus/packagers/solaris.rb +76 -25
- data/lib/omnibus/publisher.rb +4 -0
- data/lib/omnibus/publishers/artifactory_publisher.rb +19 -8
- data/lib/omnibus/sugarable.rb +5 -0
- data/lib/omnibus/version.rb +1 -1
- data/omnibus.gemspec +1 -1
- data/resources/msi/CustomActionFastMsi.CA.dll +0 -0
- data/resources/msi/localization-en-us.wxl.erb +4 -0
- data/resources/msi/source.wxs.erb +46 -9
- data/resources/rpm/spec.erb +0 -1
- data/spec/functional/builder_spec.rb +109 -113
- data/spec/functional/fetchers/net_fetcher_spec.rb +10 -0
- data/spec/unit/metadata_spec.rb +39 -4
- data/spec/unit/packagers/bff_spec.rb +9 -0
- data/spec/unit/packagers/deb_spec.rb +17 -5
- data/spec/unit/packagers/msi_spec.rb +175 -3
- data/spec/unit/packagers/rpm_spec.rb +50 -3
- data/spec/unit/packagers/solaris_spec.rb +234 -0
- data/spec/unit/publisher_spec.rb +14 -0
- data/spec/unit/publishers/artifactory_publisher_spec.rb +72 -3
- data/spec/unit/sugarable_spec.rb +16 -0
- metadata +7 -4
@@ -282,27 +282,27 @@ module Omnibus
|
|
282
282
|
render_template(resource_path('spec.erb'),
|
283
283
|
destination: spec_file,
|
284
284
|
variables: {
|
285
|
-
name:
|
286
|
-
version:
|
287
|
-
iteration:
|
288
|
-
vendor:
|
289
|
-
license:
|
290
|
-
dist_tag:
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
285
|
+
name: safe_base_package_name,
|
286
|
+
version: safe_version,
|
287
|
+
iteration: safe_build_iteration,
|
288
|
+
vendor: vendor,
|
289
|
+
license: license,
|
290
|
+
dist_tag: dist_tag,
|
291
|
+
maintainer: project.maintainer,
|
292
|
+
homepage: project.homepage,
|
293
|
+
description: project.description,
|
294
|
+
priority: priority,
|
295
|
+
category: category,
|
296
|
+
conflicts: project.conflicts,
|
297
|
+
replaces: project.replaces,
|
298
|
+
dependencies: project.runtime_dependencies,
|
299
|
+
user: project.package_user,
|
300
|
+
group: project.package_group,
|
301
|
+
scripts: scripts,
|
302
|
+
config_files: config_files,
|
303
|
+
files: files,
|
304
|
+
build_dir: build_dir,
|
305
|
+
platform_family: Ohai['platform_family']
|
306
306
|
}
|
307
307
|
)
|
308
308
|
end
|
@@ -316,6 +316,7 @@ module Omnibus
|
|
316
316
|
#
|
317
317
|
def create_rpm_file
|
318
318
|
command = %|fakeroot rpmbuild|
|
319
|
+
command << %| --target #{safe_architecture}|
|
319
320
|
command << %| -bb|
|
320
321
|
command << %| --buildroot #{staging_dir}/BUILD|
|
321
322
|
command << %| --define '_topdir #{staging_dir}'|
|
@@ -494,16 +495,27 @@ module Omnibus
|
|
494
495
|
# http://rpm.org/ticket/56
|
495
496
|
#
|
496
497
|
if version =~ /\-/
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
498
|
+
if Ohai['platform_family'] == 'wrlinux'
|
499
|
+
converted = version.gsub('-', '_') #WRL has an elderly RPM version
|
500
|
+
log.warn(log_key) do
|
501
|
+
"Omnibus replaces dashes (-) with tildes (~) so pre-release " \
|
502
|
+
"versions get sorted earlier than final versions. However, the " \
|
503
|
+
"version of rpmbuild on Wind River Linux does not support this. " \
|
504
|
+
"All dashes will be replaced with underscores (_). Converting " \
|
505
|
+
"`#{project.build_version}' to `#{converted}'."
|
506
|
+
end
|
507
|
+
else
|
508
|
+
converted = version.gsub('-', '~')
|
509
|
+
log.warn(log_key) do
|
510
|
+
"Tildes hold special significance in the RPM package versions. " \
|
511
|
+
"They mark a version as lower priority in RPM's version compare " \
|
512
|
+
"logic. We'll replace all dashes (-) with tildes (~) so pre-release" \
|
513
|
+
"versions get sorted earlier then final versions. Converting" \
|
514
|
+
"`#{project.build_version}' to `#{converted}'."
|
515
|
+
end
|
505
516
|
end
|
506
517
|
|
518
|
+
|
507
519
|
version = converted
|
508
520
|
end
|
509
521
|
|
@@ -14,29 +14,32 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
|
17
|
+
require 'socket'
|
18
|
+
|
17
19
|
module Omnibus
|
18
20
|
class Packager::Solaris < Packager::Base
|
21
|
+
# @return [Hash]
|
22
|
+
SCRIPT_MAP = {
|
23
|
+
# Default Omnibus naming
|
24
|
+
postinst: 'postinstall',
|
25
|
+
postrm: 'postremove',
|
26
|
+
# Default Solaris naming
|
27
|
+
postinstall: 'postinstall',
|
28
|
+
postremove: 'postremove',
|
29
|
+
}.freeze
|
30
|
+
|
19
31
|
id :solaris
|
20
32
|
|
21
33
|
build do
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
write_pkginfo_content
|
28
|
-
|
29
|
-
copy_file("#{project.package_scripts_path}/postinst", staging_dir_path('postinstall'))
|
30
|
-
copy_file("#{project.package_scripts_path}/postrm", staging_dir_path('postremove'))
|
31
|
-
|
32
|
-
shellout! "pkgmk -o -r #{install_dirname} -d #{staging_dir} -f #{staging_dir_path('Prototype')}"
|
33
|
-
shellout! "pkgchk -vd #{staging_dir} #{project.package_name}"
|
34
|
-
shellout! "pkgtrans #{staging_dir} #{package_path} #{project.package_name}"
|
34
|
+
write_scripts
|
35
|
+
write_prototype_file
|
36
|
+
write_pkginfo_file
|
37
|
+
create_solaris_file
|
35
38
|
end
|
36
39
|
|
37
40
|
# @see Base#package_name
|
38
41
|
def package_name
|
39
|
-
"#{project.package_name}-#{pkgmk_version}.#{
|
42
|
+
"#{project.package_name}-#{pkgmk_version}.#{safe_architecture}.solaris"
|
40
43
|
end
|
41
44
|
|
42
45
|
def pkgmk_version
|
@@ -50,24 +53,42 @@ module Omnibus
|
|
50
53
|
def install_basename
|
51
54
|
File.basename(project.install_dir)
|
52
55
|
end
|
53
|
-
|
56
|
+
|
54
57
|
def staging_dir_path(file_name)
|
55
58
|
File.join(staging_dir, file_name)
|
56
59
|
end
|
57
60
|
|
61
|
+
#
|
62
|
+
# Copy all scripts in {Project#package_scripts_path} to the control
|
63
|
+
# directory of this repo.
|
64
|
+
#
|
65
|
+
# @return [void]
|
66
|
+
#
|
67
|
+
def write_scripts
|
68
|
+
SCRIPT_MAP.each do |source, destination|
|
69
|
+
source_path = File.join(project.package_scripts_path, source.to_s)
|
70
|
+
|
71
|
+
if File.file?(source_path)
|
72
|
+
destination_path = staging_dir_path(destination)
|
73
|
+
log.debug(log_key) { "Adding script `#{source}' to `#{destination_path}'" }
|
74
|
+
copy_file(source_path, destination_path)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
58
79
|
#
|
59
80
|
# Generate a Prototype file for solaris build
|
60
81
|
#
|
61
|
-
def
|
62
|
-
|
63
|
-
i pkginfo
|
64
|
-
i postinstall
|
65
|
-
i postremove
|
66
|
-
EOF
|
82
|
+
def write_prototype_file
|
83
|
+
shellout! "cd #{install_dirname} && find #{install_basename} -print > #{staging_dir_path('files')}"
|
67
84
|
|
68
85
|
# generate list of control files
|
69
86
|
File.open staging_dir_path('Prototype'), 'w+' do |f|
|
70
|
-
f.write
|
87
|
+
f.write <<-EOF.gsub(/^ {10}/, '')
|
88
|
+
i pkginfo
|
89
|
+
i postinstall
|
90
|
+
i postremove
|
91
|
+
EOF
|
71
92
|
end
|
72
93
|
|
73
94
|
# generate the prototype's file list
|
@@ -80,7 +101,10 @@ module Omnibus
|
|
80
101
|
#
|
81
102
|
# Generate a pkginfo file for solaris build
|
82
103
|
#
|
83
|
-
def
|
104
|
+
def write_pkginfo_file
|
105
|
+
hostname = Socket.gethostname
|
106
|
+
|
107
|
+
# http://docs.oracle.com/cd/E19683-01/816-0219/6m6njqbat/index.html
|
84
108
|
pkginfo_content = <<-EOF.gsub(/^ {8}/, '')
|
85
109
|
CLASSES=none
|
86
110
|
TZ=PST
|
@@ -88,17 +112,44 @@ module Omnibus
|
|
88
112
|
BASEDIR=#{install_dirname}
|
89
113
|
PKG=#{project.package_name}
|
90
114
|
NAME=#{project.package_name}
|
91
|
-
ARCH=#{
|
115
|
+
ARCH=#{safe_architecture}
|
92
116
|
VERSION=#{pkgmk_version}
|
93
117
|
CATEGORY=application
|
94
118
|
DESC=#{project.description}
|
95
119
|
VENDOR=#{project.maintainer}
|
96
120
|
EMAIL=#{project.maintainer}
|
97
|
-
PSTAMP=#{
|
121
|
+
PSTAMP=#{hostname}#{Time.now.utc.iso8601}
|
98
122
|
EOF
|
99
123
|
File.open staging_dir_path('pkginfo'), 'w+' do |f|
|
100
124
|
f.write pkginfo_content
|
101
125
|
end
|
102
126
|
end
|
127
|
+
|
128
|
+
#
|
129
|
+
# Generate the Solaris file using +pkg*+.
|
130
|
+
#
|
131
|
+
# @return [void]
|
132
|
+
#
|
133
|
+
def create_solaris_file
|
134
|
+
shellout! "pkgmk -o -r #{install_dirname} -d #{staging_dir} -f #{staging_dir_path('Prototype')}"
|
135
|
+
shellout! "pkgchk -vd #{staging_dir} #{project.package_name}"
|
136
|
+
shellout! "pkgtrans #{staging_dir} #{package_path} #{project.package_name}"
|
137
|
+
end
|
138
|
+
|
139
|
+
#
|
140
|
+
# The architecture for this Solaris package.
|
141
|
+
#
|
142
|
+
# @return [String]
|
143
|
+
#
|
144
|
+
def safe_architecture
|
145
|
+
# The #i386? and #intel? helpers come from chef-sugar
|
146
|
+
if intel?
|
147
|
+
'i386'
|
148
|
+
elsif sparc?
|
149
|
+
'sparc'
|
150
|
+
else
|
151
|
+
Ohai['kernel']['machine']
|
152
|
+
end
|
153
|
+
end
|
103
154
|
end
|
104
155
|
end
|
data/lib/omnibus/publisher.rb
CHANGED
@@ -38,10 +38,7 @@ module Omnibus
|
|
38
38
|
artifact_for(package).upload(
|
39
39
|
repository,
|
40
40
|
remote_path_for(package),
|
41
|
-
|
42
|
-
'build.name' => package.metadata[:name],
|
43
|
-
'build.number' => package.metadata[:version],
|
44
|
-
),
|
41
|
+
default_properties.merge(metadata_properties_for(package)),
|
45
42
|
)
|
46
43
|
end
|
47
44
|
rescue Artifactory::Error::HTTPError => e
|
@@ -120,11 +117,11 @@ module Omnibus
|
|
120
117
|
name: 'omnibus',
|
121
118
|
version: Omnibus::VERSION,
|
122
119
|
},
|
123
|
-
properties:
|
120
|
+
properties: default_properties.merge(
|
124
121
|
'omnibus.project' => name,
|
125
122
|
'omnibus.version' => manifest.build_version,
|
126
123
|
'omnibus.version_manifest' => manifest.to_json,
|
127
|
-
|
124
|
+
),
|
128
125
|
modules: [
|
129
126
|
{
|
130
127
|
# com.getchef:chef-server:12.0.0
|
@@ -188,8 +185,8 @@ module Omnibus
|
|
188
185
|
#
|
189
186
|
# @return [Hash<String, String>]
|
190
187
|
#
|
191
|
-
def
|
192
|
-
{
|
188
|
+
def metadata_properties_for(package)
|
189
|
+
metadata = {
|
193
190
|
'omnibus.project' => package.metadata[:name],
|
194
191
|
'omnibus.platform' => package.metadata[:platform],
|
195
192
|
'omnibus.platform_version' => package.metadata[:platform_version],
|
@@ -201,6 +198,20 @@ module Omnibus
|
|
201
198
|
'omnibus.sha256' => package.metadata[:sha256],
|
202
199
|
'omnibus.sha512' => package.metadata[:sha512],
|
203
200
|
}
|
201
|
+
metadata.merge!(
|
202
|
+
'build.name' => package.metadata[:name],
|
203
|
+
'build.number' => package.metadata[:version],
|
204
|
+
) if build_record?
|
205
|
+
metadata
|
206
|
+
end
|
207
|
+
|
208
|
+
#
|
209
|
+
# Properties to attach to published artifacts (and build record).
|
210
|
+
#
|
211
|
+
# @return [Hash<String, String>]
|
212
|
+
#
|
213
|
+
def default_properties
|
214
|
+
@properties ||= @options[:properties] || {}
|
204
215
|
end
|
205
216
|
|
206
217
|
#
|
data/lib/omnibus/sugarable.rb
CHANGED
@@ -30,6 +30,11 @@ require 'chef/sugar/vagrant'
|
|
30
30
|
|
31
31
|
module Omnibus
|
32
32
|
module Sugarable
|
33
|
+
def self.extended(base)
|
34
|
+
base.send(:extend, Chef::Sugar::DSL)
|
35
|
+
base.send(:extend, Omnibus::Sugar)
|
36
|
+
end
|
37
|
+
|
33
38
|
def self.included(base)
|
34
39
|
base.send(:include, Chef::Sugar::DSL)
|
35
40
|
base.send(:include, Omnibus::Sugar)
|
data/lib/omnibus/version.rb
CHANGED
data/omnibus.gemspec
CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |gem|
|
|
13
13
|
gem.description = gem.summary
|
14
14
|
gem.homepage = 'https://github.com/opscode/omnibus'
|
15
15
|
|
16
|
-
gem.required_ruby_version = '>=
|
16
|
+
gem.required_ruby_version = '>= 2'
|
17
17
|
|
18
18
|
gem.files = `git ls-files`.split($/)
|
19
19
|
gem.bindir = 'bin'
|
Binary file
|
@@ -16,4 +16,8 @@
|
|
16
16
|
<String Id="VerifyReadyDlgInstallTitle">{\WixUI_Font_Title_White}Ready to install [ProductName]</String>
|
17
17
|
|
18
18
|
<String Id="FeatureMainName"><%= friendly_name %></String>
|
19
|
+
|
20
|
+
<String Id="MinimumOSVersionMessage">This package requires minimum OS version: Windows 7/Windows Server 2008 R2 or greater.</String>
|
21
|
+
<String Id="DowngradeErrorMessage">A newer version of [ProductName] is already installed.</String>
|
22
|
+
<String Id="FileExtractionProgress">Extracting files, please wait...</String>
|
19
23
|
</WixLocalization>
|
@@ -12,23 +12,60 @@
|
|
12
12
|
Version="$(var.VersionNumber)" Manufacturer="!(loc.ManufacturerName)" UpgradeCode="$(var.UpgradeCode)">
|
13
13
|
|
14
14
|
<!--
|
15
|
-
|
16
|
-
The install
|
15
|
+
Minimum installer version (2.0) - Window XP and above.
|
16
|
+
The install scope is per machine, not the current user
|
17
17
|
-->
|
18
|
-
<Package InstallerVersion="200" InstallPrivileges="elevated"
|
18
|
+
<Package InstallerVersion="200" InstallPrivileges="elevated"
|
19
|
+
Compressed="yes" InstallScope="perMachine" />
|
19
20
|
|
20
21
|
<Media Id="1" Cabinet="Project.cab" EmbedCab="yes" CompressionLevel="high" />
|
21
22
|
|
22
|
-
<!--
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
<!--
|
24
|
+
Uncomment launch condition below to check for minimum OS
|
25
|
+
601 = Windows 7/Server 2008R2.
|
26
|
+
-->
|
27
|
+
<!-- Condition Message="!(loc.MinimumOSVersionMessage)">
|
28
|
+
<![CDATA[Installed OR VersionNT >= 601]]>
|
29
|
+
</Condition -->
|
30
|
+
|
31
|
+
<!-- We always do Major upgrades -->
|
32
|
+
<MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeErrorMessage)" />
|
33
|
+
|
34
|
+
<!--
|
35
|
+
If fastmsi is set, custom actions will be invoked during install to unzip
|
36
|
+
project files, and during uninstall to remove the project folder
|
37
|
+
-->
|
38
|
+
<% if fastmsi %>
|
39
|
+
<SetProperty Id="FastUnzip"
|
40
|
+
Value="FASTZIPDIR=[INSTALLLOCATION];FASTZIPAPPNAME=chefdk"
|
41
|
+
Sequence="execute"
|
42
|
+
Before="FastUnzip" />
|
43
|
+
|
44
|
+
<CustomAction Id="FastUnzip"
|
45
|
+
BinaryKey="CustomActionFastMsiDLL"
|
46
|
+
DllEntry="FastUnzip"
|
47
|
+
Execute="deferred"
|
48
|
+
Return="check" />
|
49
|
+
|
50
|
+
<Binary Id="CustomActionFastMsiDLL"
|
51
|
+
SourceFile="CustomActionFastMsi.CA.dll" />
|
52
|
+
|
53
|
+
<CustomAction Id="Cleanup"
|
54
|
+
Directory="INSTALLLOCATION"
|
55
|
+
ExeCommand="cmd /C "rd /S /Q chefdk""
|
56
|
+
Execute="deferred"
|
57
|
+
Return="ignore" />
|
27
58
|
|
28
59
|
<InstallExecuteSequence>
|
29
|
-
<
|
60
|
+
<Custom Action="FastUnzip" After="InstallFiles">NOT Installed</Custom>
|
61
|
+
<Custom Action="Cleanup" After="RemoveFiles">REMOVE~="ALL"</Custom>
|
30
62
|
</InstallExecuteSequence>
|
31
63
|
|
64
|
+
<UI>
|
65
|
+
<ProgressText Action="FastUnzip">!(loc.FileExtractionProgress)</ProgressText>
|
66
|
+
</UI>
|
67
|
+
<% end %>
|
68
|
+
|
32
69
|
<Directory Id="TARGETDIR" Name="SourceDir">
|
33
70
|
<Directory Id="WINDOWSVOLUME">
|
34
71
|
<% hierarchy.each.with_index do |(name, id), index| -%>
|
data/resources/rpm/spec.erb
CHANGED
@@ -19,7 +19,6 @@ Name: <%= name %>
|
|
19
19
|
Version: <%= version %>
|
20
20
|
Release: <%= iteration %><%= dist_tag %>
|
21
21
|
Summary: <%= description.split("\n").first.empty? ? "_" : description.split("\n").first %>
|
22
|
-
BuildArch: <%= architecture %>
|
23
22
|
AutoReqProv: no
|
24
23
|
BuildRoot: %buildroot
|
25
24
|
Prefix: /
|
@@ -15,18 +15,94 @@ module Omnibus
|
|
15
15
|
# manner similar to one that omnibus provides, we would need to emulate
|
16
16
|
# the fixup steps here as well, which is a pain the ass.
|
17
17
|
#
|
18
|
-
#
|
18
|
+
# Instead we write batch files that redirect to the batch files
|
19
|
+
# corresponding to the system installation and hope it all works out.
|
19
20
|
def fake_embedded_bin(name)
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
if windows?
|
22
|
+
ext = (name == 'ruby') ? '.exe' : '.bat'
|
23
|
+
source = Bundler.which(name + ext)
|
24
|
+
raise "Could not find #{name} in bundler environment" unless source
|
25
|
+
File.open(File.join(embedded_bin_dir, name + '.bat'), 'w') do |f|
|
26
|
+
f.write <<-EOH.gsub(/^ {12}/, '')
|
27
|
+
@"#{source}" %*
|
28
|
+
EOH
|
29
|
+
end
|
30
|
+
else
|
31
|
+
source = Bundler.which(name)
|
32
|
+
raise "Could not find #{name} in bundler environment" unless source
|
33
|
+
|
34
|
+
target = File.join(embedded_bin_dir, name)
|
35
|
+
create_link(source, target) unless File.exists?(target)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def shellout_opts(subject)
|
40
|
+
# Pass GEM_HOME and GEM_PATH to subprocess so our fake bin works
|
41
|
+
options = {}
|
42
|
+
options[:env] = {
|
43
|
+
'GEM_HOME' => ENV['GEM_HOME'],
|
44
|
+
'GEM_PATH' => ENV['GEM_PATH'],
|
45
|
+
}
|
46
|
+
options[:env].merge!(subject.with_embedded_path)
|
47
|
+
options
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
def make_gemspec()
|
52
|
+
gemspec = File.join(project_dir, "#{project_name}.gemspec")
|
53
|
+
File.open(gemspec, 'w') do |f|
|
54
|
+
f.write <<-EOH.gsub(/^ {12}/, '')
|
55
|
+
Gem::Specification.new do |gem|
|
56
|
+
gem.name = '#{project_name}'
|
57
|
+
gem.version = '1.0.0'
|
58
|
+
gem.author = 'Chef Software, Inc.'
|
59
|
+
gem.email = 'info@getchef.com'
|
60
|
+
gem.description = 'Installs a thing'
|
61
|
+
gem.summary = gem.description
|
62
|
+
end
|
63
|
+
EOH
|
64
|
+
end
|
65
|
+
gemspec
|
66
|
+
end
|
67
|
+
|
68
|
+
def make_gemfile()
|
69
|
+
gemfile = File.join(project_dir, 'Gemfile')
|
70
|
+
File.open(gemfile, 'w') do |f|
|
71
|
+
f.write <<-EOH.gsub(/^ {12}/, '')
|
72
|
+
gemspec
|
73
|
+
EOH
|
74
|
+
end
|
75
|
+
gemfile
|
76
|
+
end
|
77
|
+
|
78
|
+
def make_gemfile_lock()
|
79
|
+
gemfile_lock = File.join(project_dir, 'Gemfile.lock')
|
80
|
+
File.open(gemfile_lock, 'w') do |f|
|
81
|
+
f.write <<-EOH.gsub(/^ {12}/, '')
|
82
|
+
PATH
|
83
|
+
remote: .
|
84
|
+
specs:
|
85
|
+
#{project_name} (1.0.0)
|
86
|
+
|
87
|
+
GEM
|
88
|
+
specs:
|
89
|
+
|
90
|
+
PLATFORMS
|
91
|
+
ruby
|
92
|
+
|
93
|
+
DEPENDENCIES
|
94
|
+
#{project_name}!
|
95
|
+
EOH
|
96
|
+
end
|
97
|
+
gemfile_lock
|
23
98
|
end
|
24
99
|
|
25
100
|
subject { described_class.new(software) }
|
101
|
+
let(:project_name) { 'example' }
|
102
|
+
let(:project_dir) { File.join(source_dir, project_name) }
|
26
103
|
|
27
104
|
describe '#command' do
|
28
105
|
it 'executes the command' do
|
29
|
-
path = File.join(software.install_dir, 'file.txt')
|
30
106
|
subject.command("echo 'Hello World!'")
|
31
107
|
|
32
108
|
output = capture_logging { subject.build }
|
@@ -78,7 +154,7 @@ module Omnibus
|
|
78
154
|
|
79
155
|
fake_embedded_bin('ruby')
|
80
156
|
|
81
|
-
subject.ruby(ruby)
|
157
|
+
subject.ruby(ruby, env: subject.with_embedded_path)
|
82
158
|
subject.build
|
83
159
|
|
84
160
|
path = "#{software.install_dir}/test.txt"
|
@@ -87,140 +163,60 @@ module Omnibus
|
|
87
163
|
end
|
88
164
|
end
|
89
165
|
|
90
|
-
describe '#gem'
|
166
|
+
describe '#gem' do
|
91
167
|
it 'executes the command as the embedded gem' do
|
92
|
-
|
93
|
-
File.open(gemspec, 'w') do |f|
|
94
|
-
f.write <<-EOH.gsub(/^ {12}/, '')
|
95
|
-
Gem::Specification.new do |gem|
|
96
|
-
gem.name = 'example'
|
97
|
-
gem.version = '1.0.0'
|
98
|
-
gem.author = 'Chef Software, Inc.'
|
99
|
-
gem.email = 'info@getchef.com'
|
100
|
-
gem.description = 'Installs a thing'
|
101
|
-
gem.summary = gem.description
|
102
|
-
end
|
103
|
-
EOH
|
104
|
-
end
|
105
|
-
|
168
|
+
make_gemspec
|
106
169
|
fake_embedded_bin('gem')
|
170
|
+
gem_file = "#{project_name}-1.0.0.gem"
|
107
171
|
|
108
|
-
subject.gem("build #{gemspec
|
109
|
-
subject.gem("install #{
|
172
|
+
subject.gem("build #{project_name}.gemspec", shellout_opts(subject))
|
173
|
+
subject.gem("install #{gem_file}", shellout_opts(subject))
|
110
174
|
output = capture_logging { subject.build }
|
111
175
|
|
176
|
+
expect(File.join(project_dir, gem_file)).to be_a_file
|
112
177
|
expect(output).to include('gem build')
|
113
178
|
expect(output).to include('gem install')
|
179
|
+
|
114
180
|
end
|
115
181
|
end
|
116
182
|
|
117
|
-
describe '#bundler'
|
183
|
+
describe '#bundler' do
|
118
184
|
it 'executes the command as the embedded bundler' do
|
119
|
-
|
120
|
-
|
121
|
-
f.write <<-EOH.gsub(/^ {12}/, '')
|
122
|
-
Gem::Specification.new do |gem|
|
123
|
-
gem.name = 'example'
|
124
|
-
gem.version = '1.0.0'
|
125
|
-
gem.author = 'Chef Software, Inc.'
|
126
|
-
gem.email = 'info@getchef.com'
|
127
|
-
gem.description = 'Installs a thing'
|
128
|
-
gem.summary = gem.description
|
129
|
-
end
|
130
|
-
EOH
|
131
|
-
end
|
132
|
-
|
133
|
-
gemfile = File.join(tmp_path, 'Gemfile')
|
134
|
-
File.open(gemfile, 'w') do |f|
|
135
|
-
f.write <<-EOH.gsub(/^ {12}/, '')
|
136
|
-
gemspec
|
137
|
-
EOH
|
138
|
-
end
|
139
|
-
|
185
|
+
make_gemspec
|
186
|
+
make_gemfile
|
140
187
|
fake_embedded_bin('bundle')
|
141
188
|
|
142
|
-
|
143
|
-
options = {}
|
144
|
-
options[:env] = {
|
145
|
-
'GEM_HOME' => ENV['GEM_HOME'],
|
146
|
-
'GEM_PATH' => ENV['GEM_PATH'],
|
147
|
-
}
|
148
|
-
|
149
|
-
subject.bundle('install', options)
|
189
|
+
subject.bundle('install', shellout_opts(subject))
|
150
190
|
output = capture_logging { subject.build }
|
151
191
|
|
192
|
+
expect(File.join(project_dir, 'Gemfile.lock')).to be_a_file
|
152
193
|
expect(output).to include('bundle install')
|
153
194
|
end
|
154
195
|
end
|
155
196
|
|
156
|
-
describe '#appbundle'
|
197
|
+
describe '#appbundle' do
|
157
198
|
it 'executes the command as the embedded appbundler' do
|
199
|
+
make_gemspec
|
200
|
+
make_gemfile
|
201
|
+
make_gemfile_lock
|
158
202
|
|
159
|
-
|
160
|
-
embedded_app_dir = "#{software.install_dir}/embedded/apps/example"
|
161
|
-
bin_dir = "#{software.install_dir}/bin"
|
162
|
-
|
163
|
-
FileUtils.mkdir(source_dir)
|
164
|
-
|
165
|
-
gemspec = File.join(source_dir, 'example.gemspec')
|
166
|
-
File.open(gemspec, 'w') do |f|
|
167
|
-
f.write <<-EOH.gsub(/^ {12}/, '')
|
168
|
-
Gem::Specification.new do |gem|
|
169
|
-
gem.name = 'example'
|
170
|
-
gem.version = '1.0.0'
|
171
|
-
gem.author = 'Chef Software, Inc.'
|
172
|
-
gem.email = 'info@getchef.com'
|
173
|
-
gem.description = 'Installs a thing'
|
174
|
-
gem.summary = gem.description
|
175
|
-
end
|
176
|
-
EOH
|
177
|
-
end
|
178
|
-
|
179
|
-
gemfile = File.join(source_dir, 'Gemfile')
|
180
|
-
File.open(gemfile, 'w') do |f|
|
181
|
-
f.write <<-EOH.gsub(/^ {12}/, '')
|
182
|
-
gemspec
|
183
|
-
EOH
|
184
|
-
end
|
185
|
-
|
186
|
-
gemfile_lock = File.join(source_dir, 'Gemfile.lock')
|
187
|
-
File.open(gemfile_lock, 'w') do |f|
|
188
|
-
f.write <<-EOH.gsub(/^ {12}/, '')
|
189
|
-
PATH
|
190
|
-
remote: .
|
191
|
-
specs:
|
192
|
-
example (1.0.0)
|
193
|
-
|
194
|
-
GEM
|
195
|
-
specs:
|
196
|
-
|
197
|
-
PLATFORMS
|
198
|
-
ruby
|
199
|
-
|
200
|
-
DEPENDENCIES
|
201
|
-
example!
|
202
|
-
EOH
|
203
|
-
end
|
204
|
-
|
203
|
+
fake_embedded_bin('gem')
|
205
204
|
fake_embedded_bin('appbundler')
|
206
205
|
|
207
|
-
#
|
208
|
-
|
209
|
-
|
210
|
-
'GEM_HOME' => ENV['GEM_HOME'],
|
211
|
-
'GEM_PATH' => ENV['GEM_PATH'],
|
212
|
-
}
|
213
|
-
|
214
|
-
subject.appbundle('example', options)
|
206
|
+
subject.gem("build #{project_name}.gemspec", shellout_opts(subject))
|
207
|
+
subject.gem("install #{project_name}-1.0.0.gem", shellout_opts(subject))
|
208
|
+
subject.appbundle(project_name, shellout_opts(subject))
|
215
209
|
output = capture_logging { subject.build }
|
216
210
|
|
217
|
-
|
211
|
+
appbundler_path = File.join(embedded_bin_dir, 'appbundler')
|
212
|
+
appbundler_path.gsub!(/\//,'\\') if windows?
|
213
|
+
expect(output).to include("#{appbundler_path} '#{project_dir}' '#{bin_dir}'")
|
218
214
|
end
|
219
215
|
end
|
220
216
|
|
221
|
-
describe '#rake'
|
217
|
+
describe '#rake' do
|
222
218
|
it 'executes the command as the embedded rake' do
|
223
|
-
rakefile = File.join(
|
219
|
+
rakefile = File.join(project_dir, 'Rakefile')
|
224
220
|
File.open(rakefile, 'w') do |f|
|
225
221
|
f.write <<-EOH.gsub(/^ {12}/, '')
|
226
222
|
task(:foo) { }
|
@@ -229,8 +225,8 @@ module Omnibus
|
|
229
225
|
|
230
226
|
fake_embedded_bin('rake')
|
231
227
|
|
232
|
-
subject.rake('-T')
|
233
|
-
subject.rake('foo')
|
228
|
+
subject.rake('-T', shellout_opts(subject))
|
229
|
+
subject.rake('foo', shellout_opts(subject))
|
234
230
|
output = capture_logging { subject.build }
|
235
231
|
|
236
232
|
expect(output).to include('rake -T')
|