omnibus 1.3.0 → 2.0.0.rc1

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.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -1
  3. data/.rubocop.yml +30 -0
  4. data/.travis.yml +14 -3
  5. data/CHANGELOG.md +72 -49
  6. data/Gemfile +8 -5
  7. data/NOTICE +2 -2
  8. data/README.md +65 -7
  9. data/Rakefile +12 -3
  10. data/bin/makeself-header.sh +1 -1
  11. data/bin/makeself.sh +2 -2
  12. data/bin/omnibus +2 -2
  13. data/functional/fixtures/mac_pkg/files/mac_pkg/Resources/background.png +0 -0
  14. data/functional/fixtures/mac_pkg/files/mac_pkg/Resources/license.html +1 -0
  15. data/functional/fixtures/mac_pkg/files/mac_pkg/Resources/welcome.html +1 -0
  16. data/functional/fixtures/mac_pkg/package-scripts/functional-test-project/postinstall +4 -0
  17. data/functional/packagers/mac_pkg_spec.rb +72 -0
  18. data/lib/omnibus/artifact.rb +11 -13
  19. data/lib/omnibus/build_version.rb +18 -21
  20. data/lib/omnibus/builder.rb +37 -48
  21. data/lib/omnibus/clean_tasks.rb +3 -5
  22. data/lib/omnibus/cli/application.rb +46 -53
  23. data/lib/omnibus/cli/base.rb +16 -19
  24. data/lib/omnibus/cli/build.rb +13 -13
  25. data/lib/omnibus/cli/cache.rb +13 -15
  26. data/lib/omnibus/cli/release.rb +4 -9
  27. data/lib/omnibus/cli.rb +2 -4
  28. data/lib/omnibus/config.rb +43 -23
  29. data/lib/omnibus/exceptions.rb +35 -1
  30. data/lib/omnibus/fetcher.rb +9 -13
  31. data/lib/omnibus/fetchers/git_fetcher.rb +15 -19
  32. data/lib/omnibus/fetchers/net_fetcher.rb +34 -38
  33. data/lib/omnibus/fetchers/path_fetcher.rb +7 -9
  34. data/lib/omnibus/fetchers/s3_cache_fetcher.rb +3 -4
  35. data/lib/omnibus/fetchers.rb +3 -3
  36. data/lib/omnibus/health_check.rb +126 -127
  37. data/lib/omnibus/library.rb +11 -12
  38. data/lib/omnibus/overrides.rb +6 -8
  39. data/lib/omnibus/package_release.rb +20 -22
  40. data/lib/omnibus/packagers/mac_pkg.rb +285 -0
  41. data/lib/omnibus/project.rb +215 -110
  42. data/lib/omnibus/reports.rb +16 -24
  43. data/lib/omnibus/s3_cacher.rb +15 -21
  44. data/lib/omnibus/software.rb +178 -88
  45. data/lib/omnibus/util.rb +25 -13
  46. data/lib/omnibus/version.rb +2 -2
  47. data/lib/omnibus.rb +11 -13
  48. data/omnibus.gemspec +20 -18
  49. data/spec/artifact_spec.rb +55 -52
  50. data/spec/build_version_spec.rb +121 -129
  51. data/spec/config_spec.rb +40 -0
  52. data/spec/data/projects/chefdk.rb +41 -0
  53. data/spec/data/projects/sample.rb +10 -0
  54. data/spec/data/software/erchef.rb +12 -12
  55. data/spec/data/software/zlib.rb +67 -0
  56. data/spec/fetchers/git_fetcher_spec.rb +55 -48
  57. data/spec/fetchers/net_fetcher_spec.rb +72 -78
  58. data/spec/omnibus_spec.rb +59 -0
  59. data/spec/overrides_spec.rb +64 -64
  60. data/spec/package_release_spec.rb +65 -64
  61. data/spec/packagers/mac_pkg_spec.rb +261 -0
  62. data/spec/project_spec.rb +138 -0
  63. data/spec/s3_cacher_spec.rb +9 -10
  64. data/spec/software_spec.rb +71 -50
  65. data/spec/spec_helper.rb +14 -7
  66. metadata +68 -60
  67. data/.rspec +0 -1
  68. data/.yardopts +0 -6
  69. data/spec/software_dirs_spec.rb +0 -34
@@ -1,5 +1,6 @@
1
1
  #
2
- # Copyright:: Copyright (c) 2012 Opscode, Inc.
2
+ # Copyright:: Copyright (c) 2012-2014 Chef Software, Inc.
3
+ # Copyright:: Copyright (c) 2014 Noah Kantrowitz
3
4
  # License:: Apache License, Version 2.0
4
5
  #
5
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,10 +19,10 @@ require 'omnibus/artifact'
18
19
  require 'omnibus/exceptions'
19
20
  require 'omnibus/library'
20
21
  require 'omnibus/util'
22
+ require 'omnibus/packagers/mac_pkg'
21
23
  require 'time'
22
24
 
23
25
  module Omnibus
24
-
25
26
  # Omnibus project DSL reader
26
27
  #
27
28
  # @todo It seems like there's a bit of a conflation between a
@@ -53,8 +54,6 @@ module Omnibus
53
54
  # @param filename [String] unused!
54
55
  #
55
56
  # @see Omnibus::Project#load
56
- #
57
- # @todo Remove filename parameter, as it is unused.
58
57
  def initialize(io, filename)
59
58
  @output_package = nil
60
59
  @name = nil
@@ -63,13 +62,16 @@ module Omnibus
63
62
  @homepage = nil
64
63
  @description = nil
65
64
  @replaces = nil
66
-
67
- @exclusions = Array.new
68
- @conflicts = Array.new
69
- @config_files = Array.new
70
- @dependencies = Array.new
71
- @runtime_dependencies = Array.new
72
- instance_eval(io)
65
+ @mac_pkg_identifier = nil
66
+ @overrides = {}
67
+
68
+ @exclusions = []
69
+ @conflicts = []
70
+ @config_files = []
71
+ @extra_package_files = []
72
+ @dependencies = []
73
+ @runtime_dependencies = []
74
+ instance_eval(io, filename)
73
75
  validate
74
76
 
75
77
  @library = Omnibus::Library.new(self)
@@ -96,9 +98,9 @@ module Omnibus
96
98
  # @raise [MissingProjectConfiguration] if a value was not set
97
99
  # before being subsequently retrieved (i.e., a name
98
100
  # must be set in order to build a project)
99
- def name(val=NULL_ARG)
101
+ def name(val = NULL_ARG)
100
102
  @name = val unless val.equal?(NULL_ARG)
101
- @name || raise(MissingProjectConfiguration.new("name", "my_project"))
103
+ @name || fail(MissingProjectConfiguration.new('name', 'my_project'))
102
104
  end
103
105
 
104
106
  # Set or retrieve the package name of the project. Unless
@@ -106,7 +108,7 @@ module Omnibus
106
108
  #
107
109
  # @param val [String] the package name to set
108
110
  # @return [String]
109
- def package_name(val=NULL_ARG)
111
+ def package_name(val = NULL_ARG)
110
112
  @package_name = val unless val.equal?(NULL_ARG)
111
113
  @package_name.nil? ? @name : @package_name
112
114
  end
@@ -120,9 +122,9 @@ module Omnibus
120
122
  # @raise [MissingProjectConfiguration] if a value was not set
121
123
  # before being subsequently retrieved (i.e., an install_path
122
124
  # must be set in order to build a project)
123
- def install_path(val=NULL_ARG)
125
+ def install_path(val = NULL_ARG)
124
126
  @install_path = val unless val.equal?(NULL_ARG)
125
- @install_path || raise(MissingProjectConfiguration.new("install_path", "/opt/opscode"))
127
+ @install_path || fail(MissingProjectConfiguration.new('install_path', '/opt/chef'))
126
128
  end
127
129
 
128
130
  # Set or retrieve the the package maintainer.
@@ -133,9 +135,9 @@ module Omnibus
133
135
  # @raise [MissingProjectConfiguration] if a value was not set
134
136
  # before being subsequently retrieved (i.e., a maintainer must
135
137
  # be set in order to build a project)
136
- def maintainer(val=NULL_ARG)
138
+ def maintainer(val = NULL_ARG)
137
139
  @maintainer = val unless val.equal?(NULL_ARG)
138
- @maintainer || raise(MissingProjectConfiguration.new("maintainer", "Opscode, Inc."))
140
+ @maintainer || fail(MissingProjectConfiguration.new('maintainer', 'Chef Software, Inc.'))
139
141
  end
140
142
 
141
143
  # Set or retrive the package homepage.
@@ -146,9 +148,9 @@ module Omnibus
146
148
  # @raise [MissingProjectConfiguration] if a value was not set
147
149
  # before being subsequently retrieved (i.e., a homepage must be
148
150
  # set in order to build a project)
149
- def homepage(val=NULL_ARG)
151
+ def homepage(val = NULL_ARG)
150
152
  @homepage = val unless val.equal?(NULL_ARG)
151
- @homepage || raise(MissingProjectConfiguration.new("homepage", "http://www.opscode.com"))
153
+ @homepage || fail(MissingProjectConfiguration.new('homepage', 'http://www.getchef.com'))
152
154
  end
153
155
 
154
156
  # Defines the iteration for the package to be generated. Adheres
@@ -162,15 +164,15 @@ module Omnibus
162
164
  case platform_family
163
165
  when 'rhel'
164
166
  platform_version =~ /^(\d+)/
165
- maj = $1
167
+ maj = Regexp.last_match[1]
166
168
  "#{build_iteration}.el#{maj}"
167
169
  when 'freebsd'
168
170
  platform_version =~ /^(\d+)/
169
- maj = $1
171
+ maj = Regexp.last_match[1]
170
172
  "#{build_iteration}.#{platform}.#{maj}.#{machine}"
171
173
  when 'windows'
172
174
  "#{build_iteration}.windows"
173
- when 'aix'
175
+ when 'aix', 'debian'
174
176
  "#{build_iteration}"
175
177
  else
176
178
  "#{build_iteration}.#{platform}.#{platform_version}"
@@ -187,7 +189,7 @@ module Omnibus
187
189
  # @return [String]
188
190
  #
189
191
  # @see #name
190
- def description(val=NULL_ARG)
192
+ def description(val = NULL_ARG)
191
193
  @description = val unless val.equal?(NULL_ARG)
192
194
  @description || "The full stack of #{name}"
193
195
  end
@@ -202,7 +204,7 @@ module Omnibus
202
204
  #
203
205
  # @todo Consider having this default to {#package_name}; many uses of this
204
206
  # method effectively do this already.
205
- def replaces(val=NULL_ARG)
207
+ def replaces(val = NULL_ARG)
206
208
  @replaces = val unless val.equal?(NULL_ARG)
207
209
  @replaces
208
210
  end
@@ -224,7 +226,7 @@ module Omnibus
224
226
  # @return [String]
225
227
  #
226
228
  # @see Omnibus::BuildVersion
227
- def build_version(val=NULL_ARG)
229
+ def build_version(val = NULL_ARG)
228
230
  @build_version = val unless val.equal?(NULL_ARG)
229
231
  @build_version
230
232
  end
@@ -237,25 +239,50 @@ module Omnibus
237
239
  #
238
240
  # @todo Is there a better name for this than "build_iteration"?
239
241
  # Would be nice to cut down confusiton with {#iteration}.
240
- def build_iteration(val=NULL_ARG)
242
+ def build_iteration(val = NULL_ARG)
241
243
  @build_iteration = val unless val.equal?(NULL_ARG)
242
244
  @build_iteration || 1
243
245
  end
244
246
 
247
+ def mac_pkg_identifier(val = NULL_ARG)
248
+ @mac_pkg_identifier = val unless val.equal?(NULL_ARG)
249
+ @mac_pkg_identifier
250
+ end
251
+
245
252
  # Set or retrieve the {deb/rpm/solaris}-user fpm argument.
246
253
  #
247
254
  # @param val [String]
248
255
  # @return [String]
249
- def package_user(val=NULL_ARG)
256
+ def package_user(val = NULL_ARG)
250
257
  @pkg_user = val unless val.equal?(NULL_ARG)
251
258
  @pkg_user
252
259
  end
253
260
 
261
+ # Set or retrieve the full overrides hash for all software being overridden. Calling it as
262
+ # a setter does not merge hash entries and will obliterate any previous overrides that have been setup.
263
+ #
264
+ # @param val [Hash]
265
+ # @return [Hash]
266
+ def overrides(val = NULL_ARG)
267
+ @overrides = val unless val.equal?(NULL_ARG)
268
+ @overrides
269
+ end
270
+
271
+ # Set or retrieve the overrides hash for one piece of software being overridden. Calling it as a
272
+ # setter does not merge hash entries and it will set all the overrides for a given software definition.
273
+ #
274
+ # @param val [Hash]
275
+ # @return [Hash]
276
+ def override(name, val = NULL_ARG)
277
+ @overrides[name] = val unless val.equal?(NULL_ARG)
278
+ @overrides[name]
279
+ end
280
+
254
281
  # Set or retrieve the {deb/rpm/solaris}-group fpm argument.
255
282
  #
256
283
  # @param val [String]
257
284
  # @return [String]
258
- def package_group(val=NULL_ARG)
285
+ def package_group(val = NULL_ARG)
259
286
  @pkg_group = val unless val.equal?(NULL_ARG)
260
287
  @pkg_group
261
288
  end
@@ -300,7 +327,7 @@ module Omnibus
300
327
  #
301
328
  # @param val [Array<String>] a list of names of Software components
302
329
  # @return [Array<String>]
303
- def dependencies(val=NULL_ARG)
330
+ def dependencies(val = NULL_ARG)
304
331
  @dependencies = val unless val.equal?(NULL_ARG)
305
332
  @dependencies
306
333
  end
@@ -323,6 +350,33 @@ module Omnibus
323
350
  @config_files << val
324
351
  end
325
352
 
353
+ # Add other files or dirs outside of install_path
354
+ #
355
+ # @param val [String] the name of a dir or file to include in build
356
+ # @return [void]
357
+ # NOTE: This option is currently only supported with FPM based package
358
+ # builds such as RPM, DEB and .sh (makeselfinst). This isn't supported
359
+ # on Mac OSX packages, Windows MSI, AIX and Solaris
360
+ def extra_package_file(val)
361
+ @extra_package_files << val
362
+ end
363
+
364
+ # Set or retrieve the array of files and directories used to
365
+ # build this project. If you use this to write, only pass the
366
+ # full path to the dir or file you want included in the omnibus
367
+ # package build.
368
+ #
369
+ # @note - similar to the depdencies array - this will reinitialize
370
+ # the files array and overwrite and dependencies that were set using
371
+ # {#file}.
372
+ #
373
+ # @param val [Array<String>] a list of names of Software components
374
+ # @return [Array<String>]
375
+ def extra_package_files(val = NULL_ARG)
376
+ @extra_package_files = val unless val.equal?(NULL_ARG)
377
+ @extra_package_files
378
+ end
379
+
326
380
  # Returns the platform version of the machine on which Omnibus is
327
381
  # running, as determined by Ohai.
328
382
  #
@@ -391,6 +445,37 @@ module Omnibus
391
445
  "#{Omnibus.project_root}/package-scripts/#{name}"
392
446
  end
393
447
 
448
+ # Path to the /files directory in the omnibus project. This directory can
449
+ # contain assets used for creating packages (e.g., Mac .pkg files and
450
+ # Windows MSIs can be installed by GUI which can optionally be customized
451
+ # with background images, license agreements, etc.)
452
+ #
453
+ # This method delegates to the Omnibus.project_root module function so that
454
+ # Packagers classes rely only on the Project object for their inputs.
455
+ #
456
+ # @return [String] path to the files directory.
457
+ def files_path
458
+ "#{Omnibus.project_root}/files"
459
+ end
460
+
461
+ # The directory where packages are written when created. Delegates to
462
+ # #config. The delegation allows Packagers (like Packagers::MacPkg) to
463
+ # define the implementation rather than using the global config everywhere.
464
+ #
465
+ # @return [String] path to the package directory.
466
+ def package_dir
467
+ config.package_dir
468
+ end
469
+
470
+ # The directory where intermediate packaging products may be stored.
471
+ # Delegates to Config so that Packagers have a consistent API.
472
+ #
473
+ # @see Config.package_tmp some caveats.
474
+ # @return [String] path to the package temp directory.
475
+ def package_tmp
476
+ config.package_tmp
477
+ end
478
+
394
479
  # Determine the package type(s) to be built, based on the platform
395
480
  # family for which the package is being built.
396
481
  #
@@ -403,17 +488,19 @@ module Omnibus
403
488
  def package_types
404
489
  case platform_family
405
490
  when 'debian'
406
- [ "deb" ]
491
+ ['deb']
407
492
  when 'fedora', 'rhel'
408
- [ "rpm" ]
493
+ ['rpm']
409
494
  when 'aix'
410
- [ "bff" ]
495
+ ['bff']
411
496
  when 'solaris2'
412
- [ "pkgmk" ]
497
+ ['pkgmk']
413
498
  when 'windows'
414
- [ "msi" ]
499
+ ['msi']
500
+ when 'mac_os_x'
501
+ ['mac_pkg']
415
502
  else
416
- [ "makeself" ]
503
+ ['makeself']
417
504
  end
418
505
  end
419
506
 
@@ -451,7 +538,7 @@ module Omnibus
451
538
  # this is just the platform_version.
452
539
  # @return [String] the platform version
453
540
  def platform_version_for_package
454
- if platform == "rhel"
541
+ if platform == 'rhel'
455
542
  platform_version[/([\d]+)\..+/, 1]
456
543
  else
457
544
  platform_version
@@ -462,8 +549,8 @@ module Omnibus
462
549
  # rhel/centos become "el", all others are just platform
463
550
  # @return [String] the platform family short name
464
551
  def platform_shortname
465
- if platform_family == "rhel"
466
- "el"
552
+ if platform_family == 'rhel'
553
+ 'el'
467
554
  else
468
555
  platform
469
556
  end
@@ -472,9 +559,9 @@ module Omnibus
472
559
  def render_metadata(pkg_type)
473
560
  basename = output_package(pkg_type)
474
561
  pkg_path = "#{config.package_dir}/#{basename}"
475
- artifact = Artifact.new(pkg_path, [ platform_tuple ], :version => build_version)
562
+ artifact = Artifact.new(pkg_path, [platform_tuple], version: build_version)
476
563
  metadata = artifact.flat_metadata
477
- File.open("#{pkg_path}.metadata.json", "w+") do |f|
564
+ File.open("#{pkg_path}.metadata.json", 'w+') do |f|
478
565
  f.print(JSON.pretty_generate(metadata))
479
566
  end
480
567
  end
@@ -483,22 +570,24 @@ module Omnibus
483
570
  # @return [String] the basename of the package file
484
571
  def output_package(pkg_type)
485
572
  case pkg_type
486
- when "makeself"
573
+ when 'makeself'
487
574
  "#{package_name}-#{build_version}_#{iteration}.sh"
488
- when "msi"
575
+ when 'msi'
489
576
  "#{package_name}-#{build_version}-#{iteration}.msi"
490
- when "bff"
577
+ when 'bff'
491
578
  "#{package_name}.#{bff_version}.bff"
492
- when "pkgmk"
579
+ when 'pkgmk'
493
580
  "#{package_name}-#{build_version}-#{iteration}.solaris"
581
+ when 'mac_pkg'
582
+ Packagers::MacPkg.new(self).package_name
494
583
  else # fpm
495
584
  require "fpm/package/#{pkg_type}"
496
585
  pkg = FPM::Package.types[pkg_type].new
497
586
  pkg.version = build_version
498
587
  pkg.name = package_name
499
588
  pkg.iteration = iteration
500
- if pkg_type == "solaris"
501
- pkg.to_s("NAME.FULLVERSION.ARCH.TYPE")
589
+ if pkg_type == 'solaris'
590
+ pkg.to_s('NAME.FULLVERSION.ARCH.TYPE')
502
591
  else
503
592
  pkg.to_s
504
593
  end
@@ -518,26 +607,27 @@ module Omnibus
518
607
  # Mixlib::ShellOut object ready for execution. Using Arrays
519
608
  # makes downstream processing needlessly complicated.
520
609
  def msi_command
521
- msi_command = ["light.exe",
522
- "-nologo",
523
- "-ext WixUIExtension",
524
- "-cultures:en-us",
525
- "-loc #{install_path}\\msi-tmp\\#{package_name}-en-us.wxl",
526
- "#{install_path}\\msi-tmp\\#{package_name}-Files.wixobj",
527
- "#{install_path}\\msi-tmp\\#{package_name}.wixobj",
528
- "-out #{config.package_dir}\\#{output_package("msi")}"]
610
+ msi_command = [
611
+ 'light.exe',
612
+ '-nologo',
613
+ '-ext WixUIExtension',
614
+ '-cultures:en-us',
615
+ "-loc #{install_path}\\msi-tmp\\#{package_name}-en-us.wxl",
616
+ "#{install_path}\\msi-tmp\\#{package_name}-Files.wixobj",
617
+ "#{install_path}\\msi-tmp\\#{package_name}.wixobj",
618
+ "-out #{config.package_dir}\\#{output_package("msi")}",
619
+ ]
529
620
 
530
621
  # Don't care about the 204 return code from light.exe since it's
531
622
  # about some expected warnings...
532
- [msi_command.join(" "), {:returns => [0, 204]}]
623
+ [msi_command.join(' '), { returns: [0, 204] }]
533
624
  end
534
625
 
535
626
  def bff_command
536
- bff_command = ["sudo /usr/sbin/mkinstallp -d / -T /tmp/bff/gen.template"]
537
- [bff_command.join(" "), {:returns => [0]}]
627
+ bff_command = ['sudo /usr/sbin/mkinstallp -d / -T /tmp/bff/gen.template']
628
+ [bff_command.join(' '), { returns: [0] }]
538
629
  end
539
630
 
540
-
541
631
  # The {https://github.com/jordansissel/fpm fpm} command to
542
632
  # generate a package for RedHat, Ubuntu, Solaris, etc. platforms.
543
633
  #
@@ -553,17 +643,20 @@ module Omnibus
553
643
  # @todo Use the long option names (i.e., the double-dash ones) in
554
644
  # the fpm command for maximum clarity.
555
645
  def fpm_command(pkg_type)
556
- command_and_opts = ["fpm",
557
- "-s dir",
558
- "-t #{pkg_type}",
559
- "-v #{build_version}",
560
- "-n #{package_name}",
561
- "-p #{output_package(pkg_type)}",
562
- "--iteration #{iteration}",
563
- "-m '#{maintainer}'",
564
- "--description '#{description}'",
565
- "--url #{homepage}"]
566
- if File.exist?(File.join(package_scripts_path, "preinst"))
646
+ command_and_opts = [
647
+ 'fpm',
648
+ '-s dir',
649
+ "-t #{pkg_type}",
650
+ "-v #{build_version}",
651
+ "-n #{package_name}",
652
+ "-p #{output_package(pkg_type)}",
653
+ "--iteration #{iteration}",
654
+ "-m '#{maintainer}'",
655
+ "--description '#{description}'",
656
+ "--url #{homepage}",
657
+ ]
658
+
659
+ if File.exist?(File.join(package_scripts_path, 'preinst'))
567
660
  command_and_opts << "--before-install '#{File.join(package_scripts_path, "preinst")}'"
568
661
  end
569
662
 
@@ -582,7 +675,7 @@ module Omnibus
582
675
  @exclusions.each do |pattern|
583
676
  command_and_opts << "--exclude '#{pattern}'"
584
677
  end
585
-
678
+
586
679
  @config_files.each do |config_file|
587
680
  command_and_opts << "--config-files '#{config_file}'"
588
681
  end
@@ -609,18 +702,24 @@ module Omnibus
609
702
 
610
703
  command_and_opts << " --replaces #{@replaces}" if @replaces
611
704
  command_and_opts << install_path
705
+
706
+ @extra_package_files.each do |files|
707
+ command_and_opts << files
708
+ end
709
+
612
710
  command_and_opts
613
711
  end
614
712
 
615
713
  # TODO: what's this do?
616
714
  def makeself_command
617
- command_and_opts = [ File.expand_path(File.join(Omnibus.source_root, "bin", "makeself.sh")),
618
- "--gzip",
619
- install_path,
620
- output_package("makeself"),
621
- "'The full stack of #{@name}'"
622
- ]
623
- command_and_opts << "./makeselfinst" if File.exists?("#{package_scripts_path}/makeselfinst")
715
+ command_and_opts = [
716
+ File.expand_path(File.join(Omnibus.source_root, 'bin', 'makeself.sh')),
717
+ '--gzip',
718
+ install_path,
719
+ output_package('makeself'),
720
+ "'The full stack of #{@name}'",
721
+ ]
722
+ command_and_opts << './makeselfinst' if File.exists?("#{package_scripts_path}/makeselfinst")
624
723
  command_and_opts
625
724
  end
626
725
 
@@ -635,11 +734,11 @@ module Omnibus
635
734
  end
636
735
 
637
736
  # run the makeself program
638
- package_commands << makeself_command.join(" ")
737
+ package_commands << makeself_command.join(' ')
639
738
 
640
739
  # rm the makeself installer (for incremental builds)
641
740
  package_commands << "rm -f #{install_path}/makeselfinst"
642
- package_commands.each {|cmd| run_package_command(cmd) }
741
+ package_commands.each { |cmd| run_package_command(cmd) }
643
742
  end
644
743
 
645
744
  # Runs the necessary command to make an MSI. As a side-effect, sets `output_package`
@@ -649,13 +748,13 @@ module Omnibus
649
748
  end
650
749
 
651
750
  def bff_version
652
- build_version.split(/[^\d]/)[0..2].join(".") + ".#{iteration}"
751
+ build_version.split(/[^\d]/)[0..2].join('.') + ".#{iteration}"
653
752
  end
654
753
 
655
754
  def run_bff
656
- FileUtils.rm_rf "/.info/*"
657
- FileUtils.rm_rf "/tmp/bff"
658
- FileUtils.mkdir "/tmp/bff"
755
+ FileUtils.rm_rf '/.info/*'
756
+ FileUtils.rm_rf '/tmp/bff'
757
+ FileUtils.mkdir '/tmp/bff'
659
758
 
660
759
  system "find #{install_path} -print > /tmp/bff/file.list"
661
760
 
@@ -680,8 +779,8 @@ module Omnibus
680
779
  install_dirname = File.dirname(install_path)
681
780
  install_basename = File.basename(install_path)
682
781
 
683
- system "sudo rm -rf /tmp/pkgmk"
684
- FileUtils.mkdir "/tmp/pkgmk"
782
+ system 'sudo rm -rf /tmp/pkgmk'
783
+ FileUtils.mkdir '/tmp/pkgmk'
685
784
 
686
785
  system "cd #{install_dirname} && find #{install_basename} -print > /tmp/pkgmk/files"
687
786
 
@@ -691,7 +790,7 @@ i postinstall
691
790
  i postremove
692
791
  EOF
693
792
 
694
- File.open "/tmp/pkgmk/Prototype", "w+" do |f|
793
+ File.open '/tmp/pkgmk/Prototype', 'w+' do |f|
695
794
  f.write prototype_content
696
795
  end
697
796
 
@@ -717,25 +816,29 @@ EMAIL=#{maintainer}
717
816
  PSTAMP=#{`hostname`.chomp + Time.now.utc.iso8601}
718
817
  EOF
719
818
 
720
- File.open "/tmp/pkgmk/pkginfo", "w+" do |f|
819
+ File.open '/tmp/pkgmk/pkginfo', 'w+' do |f|
721
820
  f.write pkginfo_content
722
821
  end
723
822
 
724
- FileUtils.cp "#{package_scripts_path}/postinst", "/tmp/pkgmk/postinstall"
725
- FileUtils.cp "#{package_scripts_path}/postrm", "/tmp/pkgmk/postremove"
823
+ FileUtils.cp "#{package_scripts_path}/postinst", '/tmp/pkgmk/postinstall'
824
+ FileUtils.cp "#{package_scripts_path}/postrm", '/tmp/pkgmk/postremove'
726
825
 
727
- shellout!("pkgmk -o -r #{install_dirname} -d /tmp/pkgmk -f /tmp/pkgmk/Prototype", :timeout => 3600)
826
+ shellout!("pkgmk -o -r #{install_dirname} -d /tmp/pkgmk -f /tmp/pkgmk/Prototype", timeout: 3600)
728
827
 
729
- system "pkgchk -vd /tmp/pkgmk chef"
828
+ system 'pkgchk -vd /tmp/pkgmk chef'
730
829
 
731
830
  system "pkgtrans /tmp/pkgmk /var/cache/omnibus/pkg/#{output_package("pkgmk")} chef"
732
831
  end
733
832
 
833
+ def run_mac_package_build
834
+ Packagers::MacPkg.new(self).build
835
+ end
836
+
734
837
  # Runs the necessary command to make a package with fpm. As a side-effect,
735
838
  # sets `output_package`
736
839
  # @return void
737
840
  def run_fpm(pkg_type)
738
- run_package_command(fpm_command(pkg_type).join(" "))
841
+ run_package_command(fpm_command(pkg_type).join(' '))
739
842
  end
740
843
 
741
844
  # Executes the given command via mixlib-shellout.
@@ -743,8 +846,8 @@ PSTAMP=#{`hostname`.chomp + Time.now.utc.iso8601}
743
846
  # object, so the caller can inspect the stdout and stderr.
744
847
  def run_package_command(cmd)
745
848
  cmd_options = {
746
- :timeout => 3600,
747
- :cwd => config.package_dir
849
+ timeout: 3600,
850
+ cwd: config.package_dir,
748
851
  }
749
852
 
750
853
  if cmd.is_a?(Array)
@@ -764,26 +867,28 @@ PSTAMP=#{`hostname`.chomp + Time.now.utc.iso8601}
764
867
  # @return void
765
868
  def render_tasks
766
869
  directory config.package_dir
767
- directory "pkg"
870
+ directory 'pkg'
768
871
 
769
872
  namespace :projects do
770
873
  namespace @name do
771
874
 
772
875
  package_types.each do |pkg_type|
773
- dep_tasks = @dependencies.map {|dep| "software:#{dep}"}
876
+ dep_tasks = @dependencies.map { |dep| "software:#{dep}" }
774
877
  dep_tasks << config.package_dir
775
- dep_tasks << "health_check"
878
+ dep_tasks << 'health_check'
776
879
 
777
880
  desc "package #{@name} into a #{pkg_type}"
778
881
  task pkg_type => dep_tasks do
779
- if pkg_type == "makeself"
882
+ if pkg_type == 'makeself'
780
883
  run_makeself
781
- elsif pkg_type == "msi"
884
+ elsif pkg_type == 'msi'
782
885
  run_msi
783
- elsif pkg_type == "bff"
886
+ elsif pkg_type == 'bff'
784
887
  run_bff
785
- elsif pkg_type == "pkgmk"
888
+ elsif pkg_type == 'pkgmk'
786
889
  run_pkgmk
890
+ elsif pkg_type == 'mac_pkg'
891
+ run_mac_package_build
787
892
  else # pkg_type == "fpm"
788
893
  run_fpm(pkg_type)
789
894
  end
@@ -793,10 +898,10 @@ PSTAMP=#{`hostname`.chomp + Time.now.utc.iso8601}
793
898
  end
794
899
  end
795
900
 
796
- task "copy" => package_types do
797
- if OHAI.platform == "windows"
901
+ task 'copy' => package_types do
902
+ if OHAI.platform == 'windows'
798
903
  cp_cmd = "xcopy #{config.package_dir}\\*.msi pkg\\ /Y"
799
- elsif OHAI.platform == "aix"
904
+ elsif OHAI.platform == 'aix'
800
905
  cp_cmd = "cp #{config.package_dir}/*.bff pkg/"
801
906
  else
802
907
  cp_cmd = "cp #{config.package_dir}/* pkg/"
@@ -805,15 +910,15 @@ PSTAMP=#{`hostname`.chomp + Time.now.utc.iso8601}
805
910
  shell.run_command
806
911
  shell.error!
807
912
  end
808
- task "copy" => "pkg"
913
+ task 'copy' => 'pkg'
809
914
 
810
915
  desc "run the health check on the #{@name} install path"
811
- task "health_check" do
812
- if OHAI.platform == "windows"
813
- puts "Skipping health check on windows..."
916
+ task 'health_check' do
917
+ if OHAI.platform == 'windows'
918
+ puts 'Skipping health check on windows...'
814
919
  else
815
920
  # build a list of all whitelist files from all project dependencies
816
- whitelist_files = library.components.map{|component| component.whitelist_files }.flatten
921
+ whitelist_files = library.components.map { |component| component.whitelist_files }.flatten
817
922
  Omnibus::HealthCheck.run(install_path, whitelist_files)
818
923
  end
819
924
  end