omnibus 2.0.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +2 -0
  3. data/.travis.yml +0 -2
  4. data/CHANGELOG.md +26 -6
  5. data/Gemfile +7 -0
  6. data/Guardfile +10 -0
  7. data/README.md +103 -160
  8. data/Rakefile +6 -1
  9. data/docs/Building on OSX.md +66 -0
  10. data/docs/omnibus-build-cache.md +75 -0
  11. data/lib/omnibus.rb +9 -13
  12. data/lib/omnibus/artifact.rb +1 -13
  13. data/lib/omnibus/assets/README-logo.png +0 -0
  14. data/lib/omnibus/assets/logo.psd +0 -0
  15. data/lib/omnibus/builder.rb +1 -0
  16. data/lib/omnibus/cli/application.rb +17 -4
  17. data/lib/omnibus/cli/build.rb +6 -4
  18. data/lib/omnibus/config.rb +33 -0
  19. data/lib/omnibus/exceptions.rb +20 -14
  20. data/lib/omnibus/health_check.rb +2 -0
  21. data/lib/omnibus/install_path_cache.rb +106 -0
  22. data/lib/omnibus/library.rb +18 -1
  23. data/lib/omnibus/packagers/base.rb +228 -0
  24. data/lib/omnibus/packagers/mac_dmg.rb +215 -0
  25. data/lib/omnibus/packagers/mac_pkg.rb +129 -253
  26. data/lib/omnibus/project.rb +89 -95
  27. data/lib/omnibus/s3_cacher.rb +4 -7
  28. data/lib/omnibus/software.rb +47 -83
  29. data/lib/omnibus/sugar.rb +49 -0
  30. data/lib/omnibus/templates/.kitchen.yml.erb +3 -0
  31. data/lib/omnibus/templates/Berksfile.erb +4 -0
  32. data/lib/omnibus/templates/Gemfile.erb +1 -1
  33. data/lib/omnibus/templates/mac_dmg/background.png +0 -0
  34. data/lib/omnibus/templates/mac_dmg/icon.png +0 -0
  35. data/lib/omnibus/templates/mac_pkg/background.png +0 -0
  36. data/lib/omnibus/templates/mac_pkg/license.html.erb +1 -0
  37. data/lib/omnibus/templates/mac_pkg/welcome.html.erb +9 -0
  38. data/lib/omnibus/templates/omnibus.rb.example.erb +31 -4
  39. data/lib/omnibus/version.rb +1 -1
  40. data/omnibus.gemspec +5 -4
  41. data/spec/fixtures/sample/files/mac_dmg/Resources/background.png +0 -0
  42. data/spec/fixtures/sample/files/mac_dmg/Resources/icon.png +0 -0
  43. data/spec/fixtures/sample/files/mac_pkg/Resources/background.png +0 -0
  44. data/spec/fixtures/sample/files/mac_pkg/Resources/license.html +1 -0
  45. data/spec/fixtures/sample/files/mac_pkg/Resources/welcome.html +9 -0
  46. data/{functional/fixtures/mac_pkg/package-scripts/functional-test-project → spec/fixtures/sample/package-scripts/sample}/postinstall +0 -0
  47. data/spec/functional/packagers/mac_spec.rb +74 -0
  48. data/spec/spec_helper.rb +14 -3
  49. data/spec/sugar_spec.rb +20 -0
  50. data/spec/{artifact_spec.rb → unit/artifact_spec.rb} +2 -3
  51. data/spec/{build_version_spec.rb → unit/build_version_spec.rb} +0 -0
  52. data/spec/{config_spec.rb → unit/config_spec.rb} +4 -0
  53. data/spec/{fetchers → unit/fetchers}/git_fetcher_spec.rb +0 -0
  54. data/spec/{fetchers → unit/fetchers}/net_fetcher_spec.rb +0 -0
  55. data/spec/unit/install_path_cache_spec.rb +175 -0
  56. data/spec/unit/library_spec.rb +67 -0
  57. data/spec/{omnibus_spec.rb → unit/omnibus_spec.rb} +0 -0
  58. data/spec/{overrides_spec.rb → unit/overrides_spec.rb} +0 -0
  59. data/spec/{package_release_spec.rb → unit/package_release_spec.rb} +0 -0
  60. data/spec/unit/packagers/base_spec.rb +221 -0
  61. data/spec/unit/packagers/mac_pkg_spec.rb +163 -0
  62. data/spec/{project_spec.rb → unit/project_spec.rb} +0 -14
  63. data/spec/{s3_cacher_spec.rb → unit/s3_cacher_spec.rb} +0 -0
  64. data/spec/{software_spec.rb → unit/software_spec.rb} +0 -1
  65. metadata +122 -103
  66. data/functional/fixtures/mac_pkg/files/mac_pkg/Resources/background.png +0 -0
  67. data/functional/fixtures/mac_pkg/files/mac_pkg/Resources/license.html +0 -1
  68. data/functional/fixtures/mac_pkg/files/mac_pkg/Resources/welcome.html +0 -1
  69. data/functional/packagers/mac_pkg_spec.rb +0 -72
  70. data/lib/omnibus/clean_tasks.rb +0 -28
  71. data/spec/packagers/mac_pkg_spec.rb +0 -262
@@ -1 +0,0 @@
1
- Apache 2 license
@@ -1 +0,0 @@
1
- Demonstration package.
@@ -1,72 +0,0 @@
1
- #
2
- # Copyright:: Copyright (c) 2014 Chef Software, Inc.
3
- # License:: Apache License, Version 2.0
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
- #
17
-
18
- require 'stringio'
19
- require 'omnibus/packagers/mac_pkg'
20
- require 'spec_helper'
21
-
22
- describe Omnibus::Packagers::MacPkg do
23
-
24
- let(:mac_pkg_identifier) { 'test.pkg.functional-test-project' }
25
-
26
- let(:omnibus_root) { File.expand_path('../../fixtures/mac_pkg', __FILE__) }
27
-
28
- let(:scripts_path) { "#{omnibus_root}/package-scripts" }
29
-
30
- let(:files_path) { "#{omnibus_root}/files" }
31
-
32
- let(:package_dir) { Dir.pwd }
33
-
34
- let(:project) do
35
-
36
- Omnibus.stub(:project_root).and_return(omnibus_root)
37
- Omnibus.config.stub(:package_dir).and_return(package_dir)
38
-
39
- project_file = <<-P
40
- name "functional-test-project"
41
- maintainer "YOU"
42
- homepage "http://www.theonion.com/articles/drunken-man-careens-wildly-across-internet,35249/"
43
- build_version "23.4.2"
44
- install_path "/opt/functional-test-project"
45
- mac_pkg_identifier "#{mac_pkg_identifier}"
46
- P
47
- Omnibus::Project.new(project_file, __FILE__)
48
- end
49
-
50
- let(:packager) do
51
- Omnibus::Packagers::MacPkg.new(project)
52
- end
53
-
54
- def create_app_dir
55
- FileUtils.mkdir('/opt/functional-test-project') unless File.directory?('/opt/functional-test-project')
56
- File.open('/opt/functional-test-project/itworks.txt', 'w+') do |f|
57
- f.puts 'hello world'
58
- end
59
- end
60
-
61
- # This will run the Omnibus::Packagers::MacPkg code without any stubs to
62
- # verify it works. In order for this test to run correctly, you have to run
63
- # as root or manually create the /opt/functional-test-project directory.
64
- #
65
- # There is no verification that the package was correctly created, you have
66
- # to install it yourself to verify.
67
- it 'builds a package' do
68
- create_app_dir
69
- packager.build
70
- end
71
-
72
- end
@@ -1,28 +0,0 @@
1
- #
2
- # Copyright:: Copyright (c) 2012-2014 Chef Software, Inc.
3
- # License:: Apache License, Version 2.0
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
- #
17
-
18
- # Adds source and build artifacts to Rake's CLEAN list, and install
19
- # and cache artifacts to its CLOBBER list, ensuring that the `clean`
20
- # and `clobber` Rake tasks do the right thing for Omnibus projects.
21
- #
22
- # @see https://github.com/jimweirich/rake/blob/master/lib/rake/clean.rb
23
-
24
- require 'rake/clean'
25
-
26
- ::CLEAN.include("#{Omnibus.config.source_dir}/**/*", "#{Omnibus.config.build_dir}/**/*")
27
-
28
- ::CLOBBER.include("#{Omnibus.config.cache_dir}/**/*", "#{Omnibus.config.package_dir}/**/*")
@@ -1,262 +0,0 @@
1
- #
2
- # Copyright:: Copyright (c) 2014 Chef Software, Inc.
3
- # License:: Apache License, Version 2.0
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
- #
17
-
18
- require 'stringio'
19
- require 'omnibus/packagers/mac_pkg'
20
- require 'spec_helper'
21
-
22
- describe Omnibus::Packagers::MacPkg do
23
-
24
- let(:project_name) { 'myproject' }
25
-
26
- let(:mac_pkg_identifier) { 'com.mycorp.myproject' }
27
-
28
- let(:omnibus_root) { '/omnibus/project/root' }
29
-
30
- let(:scripts_path) { "#{omnibus_root}/scripts" }
31
-
32
- let(:package_dir) { '/home/someuser/omnibus-myproject/pkg' }
33
-
34
- let(:package_tmp) { '/var/cache/omnibus/pkg-tmp' }
35
-
36
- let(:files_path) { "#{omnibus_root}/files" }
37
-
38
- let(:expected_distribution_content) do
39
- <<-EOH
40
- <?xml version="1.0" standalone="no"?>
41
- <installer-gui-script minSpecVersion="1">
42
- <title>Myproject</title>
43
- <background file="background.png" alignment="bottomleft" mime-type="image/png"/>
44
- <welcome file="welcome.html" mime-type="text/html"/>
45
- <license file="license.html" mime-type="text/html"/>
46
-
47
- <!-- Generated by productbuild - - synthesize -->
48
- <pkg-ref id="com.mycorp.myproject"/>
49
- <options customize="never" require-scripts="false"/>
50
- <choices-outline>
51
- <line choice="default">
52
- <line choice="com.mycorp.myproject"/>
53
- </line>
54
- </choices-outline>
55
- <choice id="default"/>
56
- <choice id="com.mycorp.myproject" visible="false">
57
- <pkg-ref id="com.mycorp.myproject"/>
58
- </choice>
59
- <pkg-ref id="com.mycorp.myproject" version="23.4.2" onConclusion="none">myproject-core.pkg</pkg-ref>
60
- </installer-gui-script>
61
- EOH
62
- end
63
-
64
- let(:expected_distribution_path) { '/var/cache/omnibus/pkg-tmp/mac-pkg/Distribution' }
65
-
66
- let(:productbuild_argv) do
67
- %W(
68
- productbuild
69
- --distribution #{expected_distribution_path}
70
- --resources /omnibus/project/root/files/mac_pkg/Resources
71
- /home/someuser/omnibus-myproject/pkg/myproject-23.4.2-4.pkg
72
- )
73
- end
74
-
75
- let(:pkgbuild_argv) do
76
- %w(
77
- pkgbuild
78
- --identifier com.mycorp.myproject
79
- --version 23.4.2
80
- --scripts /omnibus/project/root/scripts
81
- --root /opt/myproject
82
- --install-location /opt/myproject
83
- myproject-core.pkg
84
- )
85
- end
86
-
87
- let(:shellout_opts) do
88
- {
89
- timeout: 3600,
90
- cwd: File.join(package_tmp, 'mac-pkg'),
91
- }
92
- end
93
-
94
- let(:project) do
95
- double Omnibus::Project,
96
- name: project_name,
97
- build_version: '23.4.2',
98
- iteration: 4,
99
- maintainer: "Joe's Software",
100
- install_path: '/opt/myproject',
101
- package_scripts_path: scripts_path,
102
- files_path: files_path,
103
- package_dir: package_dir,
104
- package_tmp: package_tmp,
105
- mac_pkg_identifier: mac_pkg_identifier
106
- end
107
-
108
- let(:packager) do
109
- Omnibus::Packagers::MacPkg.new(project)
110
- end
111
-
112
- it "uses the project's version" do
113
- expect(packager.version).to eq(project.build_version)
114
- end
115
-
116
- it "uses the project's name" do
117
- expect(packager.name).to eq(project.name)
118
- end
119
-
120
- it "uses the project's mac_pkg_identifier" do
121
- expect(packager.identifier).to eq(mac_pkg_identifier)
122
- end
123
-
124
- it "uses the project's install_path as the package root" do
125
- expect(packager.pkg_root).to eq(project.install_path)
126
- end
127
-
128
- it "uses the project's install_path as the package install location" do
129
- expect(packager.install_location).to eq(project.install_path)
130
- end
131
-
132
- it 'names the component package PROJECT_NAME-core.pkg' do
133
- expect(packager.component_pkg_name).to eq('myproject-core.pkg')
134
- end
135
-
136
- it 'names the product package PROJECT_NAME.pkg' do
137
- # NOTE: #package_name is used by Project, so it's part of the **PUBLIC**
138
- # API.
139
- expect(packager.package_name).to eq('myproject-23.4.2-4.pkg')
140
- expect(packager.product_pkg_name).to eq('myproject-23.4.2-4.pkg')
141
- end
142
-
143
- it "use's the project's package_scripts_path" do
144
- expect(packager.scripts).to eq(project.package_scripts_path)
145
- end
146
-
147
- it "makes a list of required files to generate the 'product' pkg file" do
148
- project_file_path = '/omnibus/project/root/files/mac_pkg/Resources'
149
- required_files = %w(background.png welcome.html license.html).map do |basename|
150
- File.join(project_file_path, basename)
151
- end
152
-
153
- expect(packager.required_files).to match_array(required_files)
154
- end
155
-
156
- it 'validates that all required files are present' do
157
- expected_error_text = <<-E
158
- Your omnibus repo is missing the following files required to build Mac
159
- packages:
160
- * /omnibus/project/root/files/mac_pkg/Resources/background.png
161
- * /omnibus/project/root/files/mac_pkg/Resources/license.html
162
- * /omnibus/project/root/files/mac_pkg/Resources/welcome.html
163
- E
164
- # RSpec 2.14.1 doesn't do nice diffs of expected error strings, so do this
165
- # the hard way for now.
166
- e = nil
167
- begin
168
- packager.validate_omnibus_project!
169
- rescue => e
170
- end
171
- expect(e).to be_a(Omnibus::MissingMacPkgResource)
172
- expect(e.to_s).to eq(expected_error_text)
173
- end
174
-
175
- it 'clears and recreates the staging dir' do
176
- expect(FileUtils).to receive(:rm_rf).with('/var/cache/omnibus/pkg-tmp/mac-pkg')
177
- expect(FileUtils).to receive(:mkdir_p).with('/var/cache/omnibus/pkg-tmp/mac-pkg')
178
- packager.setup_staging_dir!
179
- end
180
-
181
- it 'generates a pkgbuild command' do
182
- expect(packager.pkgbuild_command).to eq(pkgbuild_argv)
183
- end
184
-
185
- it 'runs pkgbuild' do
186
- expected_args = pkgbuild_argv + [shellout_opts]
187
- expect(packager).to receive(:shellout!).with(*expected_args)
188
- packager.build_component_pkg
189
- end
190
-
191
- it 'has a temporary staging location for the distribution file' do
192
- expect(packager.staging_dir).to eq('/var/cache/omnibus/pkg-tmp/mac-pkg')
193
- end
194
-
195
- it 'generates a Distribution file describing the product package content' do
196
- expect(packager.distribution).to eq(expected_distribution_content)
197
- end
198
-
199
- it 'generates a productbuild command' do
200
- expect(packager.productbuild_command).to eq(productbuild_argv)
201
- end
202
-
203
- describe 'building the product package' do
204
-
205
- let(:distribution_file) { StringIO.new }
206
-
207
- before do
208
- expect(File).to receive(:open)
209
- .with(expected_distribution_path, File::RDWR | File::CREAT | File::EXCL, 0600)
210
- .and_yield(distribution_file)
211
- end
212
-
213
- it 'writes the distribution file to the staging directory' do
214
- packager.generate_distribution
215
- expect(distribution_file.string).to eq(expected_distribution_content)
216
- end
217
-
218
- it 'generates the distribution and runs productbuild' do
219
- expected_shellout_args = productbuild_argv + [shellout_opts]
220
-
221
- expect(packager).to receive(:shellout!).with(*expected_shellout_args)
222
- packager.build_product_pkg
223
- expect(distribution_file.string).to eq(expected_distribution_content)
224
- end
225
-
226
- end
227
- context "when the mac_pkg_identifier isn't specified by the project" do
228
-
229
- let(:mac_pkg_identifier) { nil }
230
- let(:project_name) { 'My $Project' }
231
-
232
- it 'sanitizes the MAINTAINER name' do
233
- expect(packager.sanitized_maintainer).to eq('joessoftware')
234
- end
235
-
236
- it 'sanitizes the project name' do
237
- expect(packager.sanitized_name).to eq('myproject')
238
- end
239
-
240
- it 'uses com.example.PROJECT_NAME as the identifier' do
241
- expect(packager.identifier).to eq('test.joessoftware.pkg.myproject')
242
- end
243
-
244
- end
245
-
246
- context 'when the project has the required Resource files' do
247
-
248
- before do
249
- project_file_path = '/omnibus/project/root/files/mac_pkg/Resources'
250
- %w(background.png welcome.html license.html).each do |basename|
251
- path = File.join(project_file_path, basename)
252
- File.stub(:exist?).with(path).and_return(true)
253
- end
254
- end
255
-
256
- it 'validates the presence of the required files' do
257
- expect(packager.validate_omnibus_project!).to be_true
258
- end
259
-
260
- end
261
-
262
- end