omnibus 2.0.2 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rubocop.yml +2 -0
- data/.travis.yml +0 -2
- data/CHANGELOG.md +26 -6
- data/Gemfile +7 -0
- data/Guardfile +10 -0
- data/README.md +103 -160
- data/Rakefile +6 -1
- data/docs/Building on OSX.md +66 -0
- data/docs/omnibus-build-cache.md +75 -0
- data/lib/omnibus.rb +9 -13
- data/lib/omnibus/artifact.rb +1 -13
- data/lib/omnibus/assets/README-logo.png +0 -0
- data/lib/omnibus/assets/logo.psd +0 -0
- data/lib/omnibus/builder.rb +1 -0
- data/lib/omnibus/cli/application.rb +17 -4
- data/lib/omnibus/cli/build.rb +6 -4
- data/lib/omnibus/config.rb +33 -0
- data/lib/omnibus/exceptions.rb +20 -14
- data/lib/omnibus/health_check.rb +2 -0
- data/lib/omnibus/install_path_cache.rb +106 -0
- data/lib/omnibus/library.rb +18 -1
- data/lib/omnibus/packagers/base.rb +228 -0
- data/lib/omnibus/packagers/mac_dmg.rb +215 -0
- data/lib/omnibus/packagers/mac_pkg.rb +129 -253
- data/lib/omnibus/project.rb +89 -95
- data/lib/omnibus/s3_cacher.rb +4 -7
- data/lib/omnibus/software.rb +47 -83
- data/lib/omnibus/sugar.rb +49 -0
- data/lib/omnibus/templates/.kitchen.yml.erb +3 -0
- data/lib/omnibus/templates/Berksfile.erb +4 -0
- data/lib/omnibus/templates/Gemfile.erb +1 -1
- data/lib/omnibus/templates/mac_dmg/background.png +0 -0
- data/lib/omnibus/templates/mac_dmg/icon.png +0 -0
- data/lib/omnibus/templates/mac_pkg/background.png +0 -0
- data/lib/omnibus/templates/mac_pkg/license.html.erb +1 -0
- data/lib/omnibus/templates/mac_pkg/welcome.html.erb +9 -0
- data/lib/omnibus/templates/omnibus.rb.example.erb +31 -4
- data/lib/omnibus/version.rb +1 -1
- data/omnibus.gemspec +5 -4
- data/spec/fixtures/sample/files/mac_dmg/Resources/background.png +0 -0
- data/spec/fixtures/sample/files/mac_dmg/Resources/icon.png +0 -0
- data/spec/fixtures/sample/files/mac_pkg/Resources/background.png +0 -0
- data/spec/fixtures/sample/files/mac_pkg/Resources/license.html +1 -0
- data/spec/fixtures/sample/files/mac_pkg/Resources/welcome.html +9 -0
- data/{functional/fixtures/mac_pkg/package-scripts/functional-test-project → spec/fixtures/sample/package-scripts/sample}/postinstall +0 -0
- data/spec/functional/packagers/mac_spec.rb +74 -0
- data/spec/spec_helper.rb +14 -3
- data/spec/sugar_spec.rb +20 -0
- data/spec/{artifact_spec.rb → unit/artifact_spec.rb} +2 -3
- data/spec/{build_version_spec.rb → unit/build_version_spec.rb} +0 -0
- data/spec/{config_spec.rb → unit/config_spec.rb} +4 -0
- data/spec/{fetchers → unit/fetchers}/git_fetcher_spec.rb +0 -0
- data/spec/{fetchers → unit/fetchers}/net_fetcher_spec.rb +0 -0
- data/spec/unit/install_path_cache_spec.rb +175 -0
- data/spec/unit/library_spec.rb +67 -0
- data/spec/{omnibus_spec.rb → unit/omnibus_spec.rb} +0 -0
- data/spec/{overrides_spec.rb → unit/overrides_spec.rb} +0 -0
- data/spec/{package_release_spec.rb → unit/package_release_spec.rb} +0 -0
- data/spec/unit/packagers/base_spec.rb +221 -0
- data/spec/unit/packagers/mac_pkg_spec.rb +163 -0
- data/spec/{project_spec.rb → unit/project_spec.rb} +0 -14
- data/spec/{s3_cacher_spec.rb → unit/s3_cacher_spec.rb} +0 -0
- data/spec/{software_spec.rb → unit/software_spec.rb} +0 -1
- metadata +122 -103
- data/functional/fixtures/mac_pkg/files/mac_pkg/Resources/background.png +0 -0
- data/functional/fixtures/mac_pkg/files/mac_pkg/Resources/license.html +0 -1
- data/functional/fixtures/mac_pkg/files/mac_pkg/Resources/welcome.html +0 -1
- data/functional/packagers/mac_pkg_spec.rb +0 -72
- data/lib/omnibus/clean_tasks.rb +0 -28
- data/spec/packagers/mac_pkg_spec.rb +0 -262
@@ -15,275 +15,151 @@
|
|
15
15
|
# limitations under the License.
|
16
16
|
#
|
17
17
|
|
18
|
-
require 'forwardable'
|
19
|
-
require 'fileutils'
|
20
|
-
require 'omnibus/util'
|
21
|
-
|
22
18
|
module Omnibus
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
# The Omnibus::Project instance that we're packaging.
|
39
|
-
attr_reader :project
|
40
|
-
|
41
|
-
# !@method name
|
42
|
-
# @return (see Project#name)
|
43
|
-
def_delegator :@project, :name
|
44
|
-
|
45
|
-
# !@method version
|
46
|
-
# @return (see Project#build_version)
|
47
|
-
def_delegator :@project, :build_version, :version
|
48
|
-
|
49
|
-
# !@method iteration
|
50
|
-
# @return (see Project#iteration)
|
51
|
-
def_delegator :@project, :iteration, :iteration
|
52
|
-
|
53
|
-
# !@method identifier
|
54
|
-
# @return (see Project#mac_pkg_identifier)
|
55
|
-
def_delegator :@project, :mac_pkg_identifier, :identifier
|
56
|
-
|
57
|
-
# !@method pkg_root
|
58
|
-
# @return (see Project#install_path)
|
59
|
-
def_delegator :@project, :install_path, :pkg_root
|
60
|
-
|
61
|
-
# !@method install_location
|
62
|
-
# @return (see Project#install_path)
|
63
|
-
def_delegator :@project, :install_path, :install_location
|
64
|
-
|
65
|
-
# !@method scripts
|
66
|
-
# @return (see Project#package_scripts_path)
|
67
|
-
def_delegator :@project, :package_scripts_path, :scripts
|
68
|
-
|
69
|
-
# !@method files_path
|
70
|
-
# @return (see Project#files_path)
|
71
|
-
def_delegator :@project, :files_path
|
72
|
-
|
73
|
-
# !@method package_dir
|
74
|
-
# @return (see Project#package_dir)
|
75
|
-
def_delegator :@project, :package_dir
|
76
|
-
|
77
|
-
# @param project [Project] the omnibus project to package.
|
78
|
-
def initialize(project)
|
79
|
-
@project = project
|
80
|
-
end
|
81
|
-
|
82
|
-
# Build the package.
|
83
|
-
def build
|
84
|
-
# Ensure the omnibus project repo contains the stuff we need.
|
85
|
-
validate_omnibus_project!
|
86
|
-
|
87
|
-
# create the staging dir for intermediate build products, if needed.
|
88
|
-
setup_staging_dir!
|
89
|
-
|
90
|
-
# build the component package
|
91
|
-
build_component_pkg
|
92
|
-
|
93
|
-
# build the product package
|
94
|
-
build_product_pkg
|
95
|
-
end
|
96
|
-
|
97
|
-
# Verifies that the #required_files are present in the
|
98
|
-
# omnibus project repo.
|
99
|
-
# @return [true] if required files are present.
|
100
|
-
# @raise [MissingMacPkgResource] if anything is missing.
|
101
|
-
def validate_omnibus_project!
|
102
|
-
missing_files = required_files.select { |f| !File.exist?(f) }
|
103
|
-
if missing_files.empty?
|
104
|
-
true # all good
|
105
|
-
else
|
106
|
-
fail MissingMacPkgResource.new(missing_files)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
# Nukes and re-creates the staging_dir
|
111
|
-
# @return [void]
|
112
|
-
def setup_staging_dir!
|
113
|
-
FileUtils.rm_rf(staging_dir)
|
114
|
-
FileUtils.mkdir_p(staging_dir)
|
115
|
-
end
|
116
|
-
|
117
|
-
def build_component_pkg
|
118
|
-
shellout!(*pkgbuild_command, shellout_opts)
|
119
|
-
end
|
120
|
-
|
121
|
-
def build_product_pkg
|
122
|
-
generate_distribution
|
123
|
-
shellout!(*productbuild_command, shellout_opts)
|
124
|
-
end
|
125
|
-
|
126
|
-
# The argv for a pkgbuild command that will build the component package.
|
127
|
-
# The resulting package is only an intermediate build product. It can be
|
128
|
-
# installed with the mac installer, but doesn't contain the data needed
|
129
|
-
# to customize the installer UI.
|
130
|
-
# @return [Array<String>] argv for the pkgbuild command.
|
131
|
-
def pkgbuild_command
|
132
|
-
%W(
|
133
|
-
pkgbuild
|
134
|
-
--identifier #{identifier}
|
135
|
-
--version #{version}
|
136
|
-
--scripts #{scripts}
|
137
|
-
--root #{pkg_root}
|
138
|
-
--install-location #{install_location}
|
139
|
-
#{component_pkg_name}
|
140
|
-
)
|
141
|
-
end
|
142
|
-
|
143
|
-
# The argv for a productbuild command that will build the product package.
|
144
|
-
# The generated package is the final build product that you ship to end
|
145
|
-
# users.
|
146
|
-
# @return [Array<String>] argv for the productbuild command
|
147
|
-
def productbuild_command
|
148
|
-
%W(
|
149
|
-
productbuild
|
150
|
-
--distribution #{distribution_staging_path}
|
151
|
-
--resources #{mac_pkg_files_path}
|
152
|
-
#{product_pkg_path}
|
153
|
-
)
|
154
|
-
end
|
155
|
-
|
156
|
-
# Writes the Distribution file to the staging area.
|
157
|
-
# @return [void]
|
158
|
-
def generate_distribution
|
159
|
-
File.open(distribution_staging_path, File::RDWR | File::CREAT | File::EXCL, 0600) do |file|
|
160
|
-
file.print(distribution)
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
# The name of the (only) component package.
|
165
|
-
# @return [String] the filename of the component .pkg file to create.
|
166
|
-
def component_pkg_name
|
167
|
-
"#{name}-core.pkg"
|
168
|
-
end
|
169
|
-
|
170
|
-
# The basename of the end-result package (that will be distributed to
|
171
|
-
# users).
|
172
|
-
#
|
173
|
-
# Project uses this to generate metadata about the package after its
|
174
|
-
# built.
|
175
|
-
#
|
176
|
-
# @return [String] the basename of the package file
|
177
|
-
def package_name
|
178
|
-
"#{name}-#{version}-#{iteration}.pkg"
|
179
|
-
end
|
180
|
-
|
181
|
-
def identifier
|
182
|
-
project.mac_pkg_identifier ||
|
183
|
-
"test.#{sanitized_maintainer}.pkg.#{sanitized_name}"
|
184
|
-
end
|
19
|
+
# Builds a Mac OS X "product" package (.pkg extension)
|
20
|
+
#
|
21
|
+
# Mac OS X packages are built in two stages. First, files are packaged up
|
22
|
+
# into one or more "component" .pkg files (MacPkg only supports making a
|
23
|
+
# single component). This is done with `pkgbuild`. Next the component(s)
|
24
|
+
# are combined into a single "product" package, using `productbuild`. It is
|
25
|
+
# this container package that can have custom branding (background image)
|
26
|
+
# and a license. It can also allow for user customization of which
|
27
|
+
# component packages to install, but MacPkg does not expose this feature.
|
28
|
+
class Packager::MacPkg < Packager::Base
|
29
|
+
validate do
|
30
|
+
assert_presence!(resource('background.png'))
|
31
|
+
assert_presence!(resource('license.html'))
|
32
|
+
assert_presence!(resource('welcome.html'))
|
33
|
+
end
|
185
34
|
|
186
|
-
|
187
|
-
|
188
|
-
|
35
|
+
setup do
|
36
|
+
purge_directory(install_path)
|
37
|
+
purge_directory(staging_dir)
|
38
|
+
purge_directory(project.package_dir)
|
39
|
+
end
|
189
40
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
File.join(package_dir, product_pkg_name)
|
195
|
-
end
|
41
|
+
build do
|
42
|
+
build_component_pkg
|
43
|
+
generate_distribution
|
44
|
+
build_product_pkg
|
196
45
|
|
197
|
-
|
198
|
-
|
199
|
-
File.join(staging_dir, 'Distribution')
|
46
|
+
if project.config[:build_dmg]
|
47
|
+
Packager::MacDmg.new(self).run!
|
200
48
|
end
|
49
|
+
end
|
201
50
|
|
202
|
-
|
203
|
-
#
|
204
|
-
|
205
|
-
# OS X installer.
|
206
|
-
# @return [String] Distribution file content (XML)
|
207
|
-
def distribution
|
208
|
-
<<-END_DISTRIBTION
|
209
|
-
<?xml version="1.0" standalone="no"?>
|
210
|
-
<installer-gui-script minSpecVersion="1">
|
211
|
-
<title>#{name.capitalize}</title>
|
212
|
-
<background file="background.png" alignment="bottomleft" mime-type="image/png"/>
|
213
|
-
<welcome file="welcome.html" mime-type="text/html"/>
|
214
|
-
<license file="license.html" mime-type="text/html"/>
|
215
|
-
|
216
|
-
<!-- Generated by productbuild - - synthesize -->
|
217
|
-
<pkg-ref id="#{identifier}"/>
|
218
|
-
<options customize="never" require-scripts="false"/>
|
219
|
-
<choices-outline>
|
220
|
-
<line choice="default">
|
221
|
-
<line choice="#{identifier}"/>
|
222
|
-
</line>
|
223
|
-
</choices-outline>
|
224
|
-
<choice id="default"/>
|
225
|
-
<choice id="#{identifier}" visible="false">
|
226
|
-
<pkg-ref id="#{identifier}"/>
|
227
|
-
</choice>
|
228
|
-
<pkg-ref id="#{identifier}" version="#{version}" onConclusion="none">#{component_pkg_name}</pkg-ref>
|
229
|
-
</installer-gui-script>
|
230
|
-
END_DISTRIBTION
|
231
|
-
end
|
51
|
+
clean do
|
52
|
+
# There is nothing to cleanup
|
53
|
+
end
|
232
54
|
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
end
|
55
|
+
# @see Base#package_name
|
56
|
+
def package_name
|
57
|
+
"#{name}-#{version}-#{iteration}.pkg"
|
58
|
+
end
|
238
59
|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
welcome_file_path,
|
246
|
-
]
|
247
|
-
end
|
60
|
+
# The full path where the product package was/will be written.
|
61
|
+
#
|
62
|
+
# @return [String] Path to the packge file.
|
63
|
+
def final_pkg
|
64
|
+
File.expand_path("#{project.package_dir}/#{package_name}")
|
65
|
+
end
|
248
66
|
|
249
|
-
|
250
|
-
|
251
|
-
|
67
|
+
#
|
68
|
+
# Construct the intermediate build product. It can be installed with the
|
69
|
+
# Installer.app, but doesn't contain the data needed to customize the
|
70
|
+
# installer UI.
|
71
|
+
#
|
72
|
+
def build_component_pkg
|
73
|
+
execute <<-EOH.gsub(/^ {8}/, '')
|
74
|
+
pkgbuild \\
|
75
|
+
--identifier "#{identifier}" \\
|
76
|
+
--version "#{version}" \\
|
77
|
+
--scripts "#{scripts}" \\
|
78
|
+
--root "#{install_path}" \\
|
79
|
+
--install-location "#{install_path}" \\
|
80
|
+
"#{component_pkg}"
|
81
|
+
EOH
|
82
|
+
end
|
252
83
|
|
253
|
-
|
254
|
-
|
84
|
+
#
|
85
|
+
# Write the Distribution file to the staging area. This method generates the
|
86
|
+
# content of the Distribution file, which is used by +productbuild+ to
|
87
|
+
# select the component packages to include in the product package.
|
88
|
+
#
|
89
|
+
# It also includes information used to customize the UI of the Mac OS X
|
90
|
+
# installer.
|
91
|
+
#
|
92
|
+
def generate_distribution
|
93
|
+
File.open(distribution_file, 'w', 0600) do |file|
|
94
|
+
file.puts <<-EOH.gsub(/^ {10}/, '')
|
95
|
+
<?xml version="1.0" standalone="no"?>
|
96
|
+
<installer-gui-script minSpecVersion="1">
|
97
|
+
<title>#{name.capitalize}</title>
|
98
|
+
<background file="background.png" alignment="bottomleft" mime-type="image/png"/>
|
99
|
+
<welcome file="welcome.html" mime-type="text/html"/>
|
100
|
+
<license file="license.html" mime-type="text/html"/>
|
101
|
+
|
102
|
+
<!-- Generated by productbuild - - synthesize -->
|
103
|
+
<pkg-ref id="#{identifier}"/>
|
104
|
+
<options customize="never" require-scripts="false"/>
|
105
|
+
<choices-outline>
|
106
|
+
<line choice="default">
|
107
|
+
<line choice="#{identifier}"/>
|
108
|
+
</line>
|
109
|
+
</choices-outline>
|
110
|
+
<choice id="default"/>
|
111
|
+
<choice id="#{identifier}" visible="false">
|
112
|
+
<pkg-ref id="#{identifier}"/>
|
113
|
+
</choice>
|
114
|
+
<pkg-ref id="#{identifier}" version="#{version}" onConclusion="none">#{component_pkg}</pkg-ref>
|
115
|
+
</installer-gui-script>
|
116
|
+
EOH
|
255
117
|
end
|
118
|
+
end
|
256
119
|
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
120
|
+
#
|
121
|
+
# Construct the product package. The generated package is the final build
|
122
|
+
# product that is shipped to end users.
|
123
|
+
#
|
124
|
+
def build_product_pkg
|
125
|
+
execute <<-EOH.gsub(/^ {8}/, '')
|
126
|
+
productbuild \\
|
127
|
+
--distribution "#{distribution_file}" \\
|
128
|
+
--resources "#{resources_path}" \\
|
129
|
+
"#{final_pkg}"
|
130
|
+
EOH
|
131
|
+
end
|
263
132
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
133
|
+
# The identifier for this mac package (the com.whatever.thing.whatever).
|
134
|
+
# This is a configurable project value, but a default value is calculated if
|
135
|
+
# one is not given.
|
136
|
+
#
|
137
|
+
# @return [String]
|
138
|
+
def identifier
|
139
|
+
@identifier ||= project.mac_pkg_identifier ||
|
140
|
+
"test.#{sanitize(project.maintainer)}.pkg.#{sanitize(project.name)}"
|
141
|
+
end
|
268
142
|
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
143
|
+
# Filesystem path where the Distribution XML file is written.
|
144
|
+
#
|
145
|
+
# @return [String]
|
146
|
+
def distribution_file
|
147
|
+
File.expand_path("#{staging_dir}/Distribution")
|
148
|
+
end
|
273
149
|
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
150
|
+
# The name of the (only) component package.
|
151
|
+
#
|
152
|
+
# @return [String] the filename of the component .pkg file to create.
|
153
|
+
def component_pkg
|
154
|
+
"#{name}-core.pkg"
|
155
|
+
end
|
280
156
|
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
157
|
+
# Sanitize the given string for the package identifier.
|
158
|
+
#
|
159
|
+
# @param [String]
|
160
|
+
# @return [String]
|
161
|
+
def sanitize(string)
|
162
|
+
string.gsub(/[^[:alnum:]]/, '').downcase
|
287
163
|
end
|
288
164
|
end
|
289
165
|
end
|
data/lib/omnibus/project.rb
CHANGED
@@ -19,7 +19,6 @@ require 'omnibus/artifact'
|
|
19
19
|
require 'omnibus/exceptions'
|
20
20
|
require 'omnibus/library'
|
21
21
|
require 'omnibus/util'
|
22
|
-
require 'omnibus/packagers/mac_pkg'
|
23
22
|
require 'time'
|
24
23
|
|
25
24
|
module Omnibus
|
@@ -32,12 +31,12 @@ module Omnibus
|
|
32
31
|
# @todo: Reorder DSL methods to fit in the same YARD group
|
33
32
|
# @todo: Generate the DSL methods via metaprogramming... they're all so similar
|
34
33
|
class Project
|
35
|
-
include Rake::DSL
|
36
34
|
include Util
|
37
35
|
|
38
36
|
NULL_ARG = Object.new
|
39
37
|
|
40
38
|
attr_reader :library
|
39
|
+
attr_accessor :dirty_cache
|
41
40
|
|
42
41
|
# Convenience method to initialize a Project from a DSL file.
|
43
42
|
#
|
@@ -71,11 +70,71 @@ module Omnibus
|
|
71
70
|
@extra_package_files = []
|
72
71
|
@dependencies = []
|
73
72
|
@runtime_dependencies = []
|
73
|
+
@dirty_cache = false
|
74
74
|
instance_eval(io, filename)
|
75
75
|
validate
|
76
76
|
|
77
77
|
@library = Omnibus::Library.new(self)
|
78
|
-
|
78
|
+
end
|
79
|
+
|
80
|
+
def build_me
|
81
|
+
FileUtils.mkdir_p(config.package_dir)
|
82
|
+
FileUtils.mkdir_p('pkg')
|
83
|
+
|
84
|
+
if OHAI.platform == 'windows'
|
85
|
+
shellout!("rmdir #{install_path} /s /q")
|
86
|
+
else
|
87
|
+
shellout!("rm -rf #{install_path}/*")
|
88
|
+
end
|
89
|
+
|
90
|
+
library.build_order.each do |software|
|
91
|
+
software.build_me
|
92
|
+
end
|
93
|
+
health_check_me
|
94
|
+
package_me
|
95
|
+
end
|
96
|
+
|
97
|
+
def health_check_me
|
98
|
+
if OHAI.platform == 'windows'
|
99
|
+
puts 'Skipping health check on windows...'
|
100
|
+
else
|
101
|
+
# build a list of all whitelist files from all project dependencies
|
102
|
+
whitelist_files = library.components.map { |component| component.whitelist_files }.flatten
|
103
|
+
Omnibus::HealthCheck.run(install_path, whitelist_files)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def package_me
|
108
|
+
package_types.each do |pkg_type|
|
109
|
+
if pkg_type == 'makeself'
|
110
|
+
run_makeself
|
111
|
+
elsif pkg_type == 'msi'
|
112
|
+
run_msi
|
113
|
+
elsif pkg_type == 'bff'
|
114
|
+
run_bff
|
115
|
+
elsif pkg_type == 'pkgmk'
|
116
|
+
run_pkgmk
|
117
|
+
elsif pkg_type == 'mac_pkg'
|
118
|
+
run_mac_package_build
|
119
|
+
elsif pkg_type == 'mac_dmg'
|
120
|
+
# noop, since the dmg creation is handled by the packager
|
121
|
+
else # pkg_type == "fpm"
|
122
|
+
run_fpm(pkg_type)
|
123
|
+
end
|
124
|
+
|
125
|
+
render_metadata(pkg_type)
|
126
|
+
|
127
|
+
if OHAI.platform == 'windows'
|
128
|
+
cp_cmd = "xcopy #{config.package_dir}\\*.msi pkg\\ /Y"
|
129
|
+
elsif OHAI.platform == 'aix'
|
130
|
+
cp_cmd = "cp #{config.package_dir}/*.bff pkg/"
|
131
|
+
else
|
132
|
+
cp_cmd = "cp #{config.package_dir}/* pkg/"
|
133
|
+
end
|
134
|
+
shell = Mixlib::ShellOut.new(cp_cmd)
|
135
|
+
shell.run_command
|
136
|
+
shell.error!
|
137
|
+
end
|
79
138
|
end
|
80
139
|
|
81
140
|
# Ensures that certain project information has been set
|
@@ -123,7 +182,7 @@ module Omnibus
|
|
123
182
|
# before being subsequently retrieved (i.e., an install_path
|
124
183
|
# must be set in order to build a project)
|
125
184
|
def install_path(val = NULL_ARG)
|
126
|
-
@install_path = val unless val.equal?(NULL_ARG)
|
185
|
+
@install_path = File.expand_path(val) unless val.equal?(NULL_ARG)
|
127
186
|
@install_path || fail(MissingProjectConfiguration.new('install_path', '/opt/chef'))
|
128
187
|
end
|
129
188
|
|
@@ -249,14 +308,13 @@ module Omnibus
|
|
249
308
|
@mac_pkg_identifier
|
250
309
|
end
|
251
310
|
|
252
|
-
# Set or retrieve the
|
253
|
-
# to +root+ if not otherwise set.
|
311
|
+
# Set or retrieve the {deb/rpm/solaris}-user fpm argument.
|
254
312
|
#
|
255
313
|
# @param val [String]
|
256
314
|
# @return [String]
|
257
315
|
def package_user(val = NULL_ARG)
|
258
316
|
@pkg_user = val unless val.equal?(NULL_ARG)
|
259
|
-
@pkg_user
|
317
|
+
@pkg_user
|
260
318
|
end
|
261
319
|
|
262
320
|
# Set or retrieve the full overrides hash for all software being overridden. Calling it as
|
@@ -279,14 +337,13 @@ module Omnibus
|
|
279
337
|
@overrides[name]
|
280
338
|
end
|
281
339
|
|
282
|
-
# Set or retrieve the
|
283
|
-
# to +root+ if not otherwise set.
|
340
|
+
# Set or retrieve the {deb/rpm/solaris}-group fpm argument.
|
284
341
|
#
|
285
342
|
# @param val [String]
|
286
343
|
# @return [String]
|
287
344
|
def package_group(val = NULL_ARG)
|
288
345
|
@pkg_group = val unless val.equal?(NULL_ARG)
|
289
|
-
@pkg_group
|
346
|
+
@pkg_group
|
290
347
|
end
|
291
348
|
|
292
349
|
# Add an Omnibus software dependency.
|
@@ -461,7 +518,7 @@ module Omnibus
|
|
461
518
|
end
|
462
519
|
|
463
520
|
# The directory where packages are written when created. Delegates to
|
464
|
-
# #config. The delegation allows Packagers (like
|
521
|
+
# #config. The delegation allows Packagers (like Packager::MacPkg) to
|
465
522
|
# define the implementation rather than using the global config everywhere.
|
466
523
|
#
|
467
524
|
# @return [String] path to the package directory.
|
@@ -484,25 +541,22 @@ module Omnibus
|
|
484
541
|
# If specific types cannot be determined, default to `["makeself"]`.
|
485
542
|
#
|
486
543
|
# @return [Array<(String)>]
|
487
|
-
#
|
488
|
-
# @todo Why does this only ever return a single-element array,
|
489
|
-
# instead of just a string, or symbol?
|
490
544
|
def package_types
|
491
545
|
case platform_family
|
492
546
|
when 'debian'
|
493
|
-
|
547
|
+
%w(deb)
|
494
548
|
when 'fedora', 'rhel'
|
495
|
-
|
549
|
+
%w(rpm)
|
496
550
|
when 'aix'
|
497
|
-
|
551
|
+
%w(bff)
|
498
552
|
when 'solaris2'
|
499
|
-
|
553
|
+
%w(pkgmk)
|
500
554
|
when 'windows'
|
501
|
-
|
555
|
+
%w(msi)
|
502
556
|
when 'mac_os_x'
|
503
|
-
|
557
|
+
%w(mac_pkg mac_dmg)
|
504
558
|
else
|
505
|
-
|
559
|
+
%w(makeself)
|
506
560
|
end
|
507
561
|
end
|
508
562
|
|
@@ -561,10 +615,13 @@ module Omnibus
|
|
561
615
|
def render_metadata(pkg_type)
|
562
616
|
basename = output_package(pkg_type)
|
563
617
|
pkg_path = "#{config.package_dir}/#{basename}"
|
618
|
+
|
619
|
+
# Don't generate metadata for packages that haven't been created.
|
620
|
+
# TODO: Fix this and make it betterer
|
621
|
+
return unless File.exist?(pkg_path)
|
622
|
+
|
564
623
|
artifact = Artifact.new(pkg_path, [platform_tuple], version: build_version)
|
565
624
|
metadata = artifact.flat_metadata
|
566
|
-
metadata['name'] = name
|
567
|
-
metadata['homepage'] = homepage
|
568
625
|
File.open("#{pkg_path}.metadata.json", 'w+') do |f|
|
569
626
|
f.print(JSON.pretty_generate(metadata))
|
570
627
|
end
|
@@ -583,7 +640,10 @@ module Omnibus
|
|
583
640
|
when 'pkgmk'
|
584
641
|
"#{package_name}-#{build_version}-#{iteration}.solaris"
|
585
642
|
when 'mac_pkg'
|
586
|
-
|
643
|
+
Packager::MacPkg.new(self).package_name
|
644
|
+
when 'mac_dmg'
|
645
|
+
pkg = Packager::MacPkg.new(self)
|
646
|
+
Packager::MacDmg.new(pkg).package_name
|
587
647
|
else # fpm
|
588
648
|
require "fpm/package/#{pkg_type}"
|
589
649
|
pkg = FPM::Package.types[pkg_type].new
|
@@ -705,12 +765,15 @@ module Omnibus
|
|
705
765
|
end
|
706
766
|
|
707
767
|
command_and_opts << " --replaces #{@replaces}" if @replaces
|
708
|
-
command_and_opts << install_path
|
709
768
|
|
769
|
+
# All project files must be appended to the command "last", but before
|
770
|
+
# the final install path
|
710
771
|
@extra_package_files.each do |files|
|
711
772
|
command_and_opts << files
|
712
773
|
end
|
713
774
|
|
775
|
+
# Install path must be the final entry in the command
|
776
|
+
command_and_opts << install_path
|
714
777
|
command_and_opts
|
715
778
|
end
|
716
779
|
|
@@ -835,7 +898,7 @@ PSTAMP=#{`hostname`.chomp + Time.now.utc.iso8601}
|
|
835
898
|
end
|
836
899
|
|
837
900
|
def run_mac_package_build
|
838
|
-
|
901
|
+
Packager::MacPkg.new(self).run!
|
839
902
|
end
|
840
903
|
|
841
904
|
# Runs the necessary command to make a package with fpm. As a side-effect,
|
@@ -863,74 +926,5 @@ PSTAMP=#{`hostname`.chomp + Time.now.utc.iso8601}
|
|
863
926
|
|
864
927
|
shellout!(command, cmd_options)
|
865
928
|
end
|
866
|
-
|
867
|
-
# Dynamically generate Rake tasks to build projects and all the software they depend on.
|
868
|
-
#
|
869
|
-
# @note Much Rake magic ahead!
|
870
|
-
#
|
871
|
-
# @return void
|
872
|
-
def render_tasks
|
873
|
-
directory config.package_dir
|
874
|
-
directory 'pkg'
|
875
|
-
|
876
|
-
namespace :projects do
|
877
|
-
namespace @name do
|
878
|
-
|
879
|
-
package_types.each do |pkg_type|
|
880
|
-
dep_tasks = @dependencies.map { |dep| "software:#{dep}" }
|
881
|
-
dep_tasks << config.package_dir
|
882
|
-
dep_tasks << 'health_check'
|
883
|
-
|
884
|
-
desc "package #{@name} into a #{pkg_type}"
|
885
|
-
task pkg_type => dep_tasks do
|
886
|
-
if pkg_type == 'makeself'
|
887
|
-
run_makeself
|
888
|
-
elsif pkg_type == 'msi'
|
889
|
-
run_msi
|
890
|
-
elsif pkg_type == 'bff'
|
891
|
-
run_bff
|
892
|
-
elsif pkg_type == 'pkgmk'
|
893
|
-
run_pkgmk
|
894
|
-
elsif pkg_type == 'mac_pkg'
|
895
|
-
run_mac_package_build
|
896
|
-
else # pkg_type == "fpm"
|
897
|
-
run_fpm(pkg_type)
|
898
|
-
end
|
899
|
-
|
900
|
-
render_metadata(pkg_type)
|
901
|
-
|
902
|
-
end
|
903
|
-
end
|
904
|
-
|
905
|
-
task 'copy' => package_types do
|
906
|
-
if OHAI.platform == 'windows'
|
907
|
-
cp_cmd = "xcopy #{config.package_dir}\\*.msi pkg\\ /Y"
|
908
|
-
elsif OHAI.platform == 'aix'
|
909
|
-
cp_cmd = "cp #{config.package_dir}/*.bff pkg/"
|
910
|
-
else
|
911
|
-
cp_cmd = "cp #{config.package_dir}/* pkg/"
|
912
|
-
end
|
913
|
-
shell = Mixlib::ShellOut.new(cp_cmd)
|
914
|
-
shell.run_command
|
915
|
-
shell.error!
|
916
|
-
end
|
917
|
-
task 'copy' => 'pkg'
|
918
|
-
|
919
|
-
desc "run the health check on the #{@name} install path"
|
920
|
-
task 'health_check' do
|
921
|
-
if OHAI.platform == 'windows'
|
922
|
-
puts 'Skipping health check on windows...'
|
923
|
-
else
|
924
|
-
# build a list of all whitelist files from all project dependencies
|
925
|
-
whitelist_files = library.components.map { |component| component.whitelist_files }.flatten
|
926
|
-
Omnibus::HealthCheck.run(install_path, whitelist_files)
|
927
|
-
end
|
928
|
-
end
|
929
|
-
end
|
930
|
-
|
931
|
-
desc "package #{@name}"
|
932
|
-
task @name => "#{@name}:copy"
|
933
|
-
end
|
934
|
-
end
|
935
929
|
end
|
936
930
|
end
|