omnibus-sonian 1.2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +5 -0
  5. data/.yardopts +6 -0
  6. data/CHANGELOG.md +96 -0
  7. data/Gemfile +9 -0
  8. data/LICENSE +201 -0
  9. data/NOTICE +9 -0
  10. data/README.md +195 -0
  11. data/Rakefile +7 -0
  12. data/bin/makeself-header.sh +401 -0
  13. data/bin/makeself.sh +407 -0
  14. data/bin/omnibus +11 -0
  15. data/lib/omnibus.rb +304 -0
  16. data/lib/omnibus/artifact.rb +151 -0
  17. data/lib/omnibus/build_version.rb +285 -0
  18. data/lib/omnibus/builder.rb +328 -0
  19. data/lib/omnibus/clean_tasks.rb +30 -0
  20. data/lib/omnibus/cli.rb +35 -0
  21. data/lib/omnibus/cli/application.rb +140 -0
  22. data/lib/omnibus/cli/base.rb +118 -0
  23. data/lib/omnibus/cli/build.rb +62 -0
  24. data/lib/omnibus/cli/cache.rb +60 -0
  25. data/lib/omnibus/cli/release.rb +49 -0
  26. data/lib/omnibus/config.rb +224 -0
  27. data/lib/omnibus/exceptions.rb +143 -0
  28. data/lib/omnibus/fetcher.rb +184 -0
  29. data/lib/omnibus/fetchers.rb +22 -0
  30. data/lib/omnibus/fetchers/git_fetcher.rb +212 -0
  31. data/lib/omnibus/fetchers/net_fetcher.rb +193 -0
  32. data/lib/omnibus/fetchers/path_fetcher.rb +65 -0
  33. data/lib/omnibus/fetchers/s3_cache_fetcher.rb +42 -0
  34. data/lib/omnibus/health_check.rb +356 -0
  35. data/lib/omnibus/library.rb +62 -0
  36. data/lib/omnibus/overrides.rb +69 -0
  37. data/lib/omnibus/package_release.rb +163 -0
  38. data/lib/omnibus/project.rb +715 -0
  39. data/lib/omnibus/reports.rb +99 -0
  40. data/lib/omnibus/s3_cacher.rb +138 -0
  41. data/lib/omnibus/software.rb +441 -0
  42. data/lib/omnibus/templates/Berksfile.erb +3 -0
  43. data/lib/omnibus/templates/Gemfile.erb +4 -0
  44. data/lib/omnibus/templates/README.md.erb +102 -0
  45. data/lib/omnibus/templates/Vagrantfile.erb +95 -0
  46. data/lib/omnibus/templates/gitignore.erb +8 -0
  47. data/lib/omnibus/templates/omnibus.rb.example.erb +5 -0
  48. data/lib/omnibus/templates/package_scripts/makeselfinst.erb +27 -0
  49. data/lib/omnibus/templates/package_scripts/postinst.erb +17 -0
  50. data/lib/omnibus/templates/package_scripts/postrm.erb +9 -0
  51. data/lib/omnibus/templates/project.rb.erb +21 -0
  52. data/lib/omnibus/templates/software/c-example.rb.erb +42 -0
  53. data/lib/omnibus/templates/software/erlang-example.rb.erb +38 -0
  54. data/lib/omnibus/templates/software/ruby-example.rb.erb +24 -0
  55. data/lib/omnibus/util.rb +61 -0
  56. data/lib/omnibus/version.rb +20 -0
  57. data/omnibus.gemspec +34 -0
  58. data/spec/artifact_spec.rb +106 -0
  59. data/spec/build_version_spec.rb +266 -0
  60. data/spec/data/overrides/bad_line.overrides +3 -0
  61. data/spec/data/overrides/good.overrides +5 -0
  62. data/spec/data/overrides/with_dupes.overrides +4 -0
  63. data/spec/data/software/erchef.rb +40 -0
  64. data/spec/fetchers/net_fetcher_spec.rb +16 -0
  65. data/spec/overrides_spec.rb +114 -0
  66. data/spec/package_release_spec.rb +197 -0
  67. data/spec/s3_cacher_spec.rb +47 -0
  68. data/spec/software_spec.rb +85 -0
  69. data/spec/spec_helper.rb +28 -0
  70. metadata +252 -0
@@ -0,0 +1,20 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2012 Opscode, 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
+ module Omnibus
19
+ VERSION = "1.2.0.1"
20
+ end
data/omnibus.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'omnibus/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "omnibus-sonian"
8
+ gem.version = Omnibus::VERSION
9
+ gem.license = "Apache 2.0"
10
+ gem.author = "Opscode"
11
+ gem.email = "info@opscode.com"
12
+ gem.description = "Omnibus helps you build self-installing, full-stack software builds. Sonian build."
13
+ gem.summary = gem.description
14
+ gem.homepage = "https://github.com/opscode/omnibus-ruby"
15
+
16
+ gem.required_ruby_version = ">= 1.9.1"
17
+
18
+ gem.files = `git ls-files`.split($/)
19
+ gem.bindir = "bin"
20
+ gem.executables = %w(omnibus)
21
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
22
+ gem.require_paths = ["lib"]
23
+
24
+ gem.add_dependency "mixlib-shellout", "~> 1.0"
25
+ gem.add_dependency "mixlib-config", "~> 1.1.2"
26
+ gem.add_dependency "ohai", ">= 0.6.12"
27
+ gem.add_dependency "rake", ">= 0.9"
28
+ gem.add_dependency "fpm", "~> 0.4.33"
29
+ gem.add_dependency "uber-s3"
30
+ gem.add_dependency "thor", ">= 0.16.0"
31
+
32
+ gem.add_development_dependency "rspec"
33
+ gem.add_development_dependency "rspec_junit_formatter"
34
+ end
@@ -0,0 +1,106 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2012 Opscode, 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 'omnibus/artifact'
19
+ require 'spec_helper'
20
+
21
+ describe Omnibus::Artifact do
22
+
23
+ let(:path) { "build_os=centos-5,machine_architecture=x86,role=oss-builder/pkg/demoproject-11.4.0-1.el5.x86_64.rpm" }
24
+
25
+ let(:content) { StringIO.new("this is the package content\n") }
26
+
27
+ let(:md5) { "d41d8cd98f00b204e9800998ecf8427e" }
28
+
29
+ let(:sha256) { "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }
30
+
31
+ let(:platforms) { [ [ "el", "5", "x86_64" ], [ "sles","11.2","x86_64" ] ] }
32
+
33
+ let(:artifact) { Omnibus::Artifact.new(path, platforms, { :version => "11.4.0-1" }) }
34
+
35
+ it "has the path to the package" do
36
+ artifact.path.should == path
37
+ end
38
+
39
+ it "has a list of platforms the package supports" do
40
+ artifact.platforms.should == platforms
41
+ end
42
+
43
+ it "generates a MD5 of an artifact" do
44
+ File.should_receive(:open).with(path).and_return(content)
45
+ artifact.md5.should == md5
46
+ end
47
+
48
+ it "generates a SHA256 of an artifact" do
49
+ File.should_receive(:open).with(path).and_return(content)
50
+ artifact.sha256.should == sha256
51
+ end
52
+
53
+ it "generates 'flat' metadata" do
54
+ File.should_receive(:open).twice.with(path).and_return(content)
55
+ flat_metadata = artifact.flat_metadata
56
+ flat_metadata["platform"].should == "el"
57
+ flat_metadata["platform_version"].should == "5"
58
+ flat_metadata["arch"].should == "x86_64"
59
+ flat_metadata["version"].should == "11.4.0-1"
60
+ flat_metadata["basename"].should == "demoproject-11.4.0-1.el5.x86_64.rpm"
61
+ flat_metadata["md5"].should == md5
62
+ flat_metadata["sha256"].should == sha256
63
+ end
64
+
65
+ it "adds the package to a release manifest" do
66
+ expected = {
67
+ "el" => {
68
+ "5" => { "x86_64" => { "11.4.0-1" => "/el/5/x86_64/demoproject-11.4.0-1.el5.x86_64.rpm" } }
69
+ },
70
+ "sles" => {
71
+ "11.2" => { "x86_64" => { "11.4.0-1" => "/el/5/x86_64/demoproject-11.4.0-1.el5.x86_64.rpm" } }
72
+ }
73
+ }
74
+
75
+ manifest = artifact.add_to_release_manifest!({})
76
+ manifest.should == expected
77
+ end
78
+
79
+ it "adds the package to a v2 release manifest" do
80
+ File.should_receive(:open).with(path).twice.and_return(content)
81
+ expected = {
82
+ "el" => {
83
+ "5" => { "x86_64" => { "11.4.0-1" => {
84
+ "relpath" => "/el/5/x86_64/demoproject-11.4.0-1.el5.x86_64.rpm",
85
+ "md5" => md5,
86
+ "sha256" => sha256
87
+ }
88
+ }
89
+ }
90
+ },
91
+ "sles" => {
92
+ "11.2" => { "x86_64" => { "11.4.0-1" => {
93
+ "relpath" => "/el/5/x86_64/demoproject-11.4.0-1.el5.x86_64.rpm",
94
+ "md5" => md5,
95
+ "sha256" => sha256
96
+ }
97
+ }
98
+ }
99
+ }
100
+ }
101
+ v2_manifest = artifact.add_to_v2_release_manifest!({})
102
+ v2_manifest.should == expected
103
+ end
104
+
105
+ end
106
+
@@ -0,0 +1,266 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2012 Opscode, 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 'omnibus/build_version'
19
+ require 'spec_helper'
20
+
21
+ describe Omnibus::BuildVersion do
22
+
23
+ let(:git_describe){ "11.0.0-alpha1-207-g694b062" }
24
+ let(:valid_semver_regex){/^\d+\.\d+\.\d+(\-[\dA-Za-z\-\.]+)?(\+[\dA-Za-z\-\.]+)?$/}
25
+ let(:valid_git_describe_regex){/^\d+\.\d+\.\d+(\-[A-Za-z0-9\-\.]+)?(\-\d+\-g[0-9a-f]+)?$/}
26
+
27
+ subject(:build_version){ Omnibus::BuildVersion.new }
28
+
29
+ before :each do
30
+ ENV['BUILD_ID'] = nil
31
+ ENV['OMNIBUS_APPEND_TIMESTAMP'] = nil
32
+ Omnibus::BuildVersion.any_instance.stub(:shellout)
33
+ .and_return(mock("ouput",
34
+ :stdout => git_describe,
35
+ :exitstatus => 0))
36
+ end
37
+
38
+ describe "git describe parsing" do
39
+
40
+ # we prefer our git tags to be SemVer compliant
41
+
42
+ # release version
43
+ context "11.0.1" do
44
+ let(:git_describe){ "11.0.1" }
45
+ its(:version_tag){ should == "11.0.1" }
46
+ its(:prerelease_tag){ should be_nil }
47
+ its(:git_sha_tag){ should be_nil }
48
+ its(:commits_since_tag){ should == 0 }
49
+ its(:development_version?){ should be_true }
50
+ its(:prerelease_version?){ should be_false }
51
+ end
52
+
53
+ # SemVer compliant prerelease version
54
+ context "11.0.0-alpha.2" do
55
+ let(:git_describe){ "11.0.0-alpha.2" }
56
+ its(:version_tag){ should == "11.0.0" }
57
+ its(:prerelease_tag){ should == "alpha.2" }
58
+ its(:git_sha_tag){ should be_nil }
59
+ its(:commits_since_tag){ should == 0 }
60
+ its(:development_version?){ should be_false }
61
+ its(:prerelease_version?){ should be_true }
62
+ end
63
+
64
+ # full git describe string
65
+ context "11.0.0-alpha.3-59-gf55b180" do
66
+ let(:git_describe){ "11.0.0-alpha.3-59-gf55b180" }
67
+ its(:version_tag){ should == "11.0.0" }
68
+ its(:prerelease_tag){ should == "alpha.3" }
69
+ its(:git_sha_tag){ should == "f55b180" }
70
+ its(:commits_since_tag){ should == 59 }
71
+ its(:development_version?){ should be_false }
72
+ its(:prerelease_version?){ should be_true }
73
+ end
74
+
75
+ # Degenerate git tag formats
76
+
77
+ # RubyGems compliant git tag
78
+ context "10.16.0.rc.0" do
79
+ let(:git_describe){ "10.16.0.rc.0" }
80
+ its(:version_tag){ should == "10.16.0" }
81
+ its(:prerelease_tag){ should == "rc.0" }
82
+ its(:git_sha_tag){ should be_nil }
83
+ its(:commits_since_tag){ should == 0 }
84
+ its(:development_version?){ should be_false }
85
+ its(:prerelease_version?){ should be_true }
86
+ end
87
+
88
+ # dash seperated prerelease
89
+ context "11.0.0-alpha-2" do
90
+ let(:git_describe){ "11.0.0-alpha-2" }
91
+ its(:version_tag){ should == "11.0.0" }
92
+ its(:prerelease_tag){ should == "alpha-2" }
93
+ its(:git_sha_tag){ should be_nil }
94
+ its(:commits_since_tag){ should == 0 }
95
+ its(:development_version?){ should be_false }
96
+ its(:prerelease_version?){ should be_true }
97
+ end
98
+
99
+ # dash seperated prerelease full git describe string
100
+ context "11.0.0-alpha-2-59-gf55b180" do
101
+ let(:git_describe){ "11.0.0-alpha-2-59-gf55b180" }
102
+ its(:version_tag){ should == "11.0.0" }
103
+ its(:prerelease_tag){ should == "alpha-2" }
104
+ its(:git_sha_tag){ should == "f55b180" }
105
+ its(:commits_since_tag){ should == 59 }
106
+ its(:development_version?){ should be_false }
107
+ its(:prerelease_version?){ should be_true }
108
+ end
109
+
110
+ # WTF git tag
111
+ context "11.0.0-alpha2" do
112
+ let(:git_describe){ "11.0.0-alpha2" }
113
+ its(:version_tag){ should == "11.0.0" }
114
+ its(:prerelease_tag){ should == "alpha2" }
115
+ its(:git_sha_tag){ should be_nil }
116
+ its(:commits_since_tag){ should == 0 }
117
+ its(:development_version?){ should be_false }
118
+ its(:prerelease_version?){ should be_true }
119
+ end
120
+ end
121
+
122
+ describe "semver output" do
123
+ let(:today_string){ Time.now.utc.strftime("%Y%m%d") }
124
+
125
+ it "generates a valid semver version" do
126
+ build_version.semver.should =~ valid_semver_regex
127
+ end
128
+
129
+ it "generates a version matching format 'MAJOR.MINOR.PATCH-PRERELEASE+TIMESTAMP.git.COMMITS_SINCE.GIT_SHA'" do
130
+ build_version.semver.should =~ /11.0.0-alpha1\+#{today_string}[0-9]+.git.207.694b062/
131
+ end
132
+
133
+ it "uses ENV['BUILD_ID'] to generate timestamp if set" do
134
+ ENV['BUILD_ID'] = "2012-12-25_16-41-40"
135
+ build_version.semver.should == "11.0.0-alpha1+20121225164140.git.207.694b062"
136
+ end
137
+
138
+ it "fails on invalid ENV['BUILD_ID'] values" do
139
+ ENV['BUILD_ID'] = "AAAA"
140
+ expect { build_version.semver }.to raise_error(ArgumentError)
141
+ end
142
+
143
+ context "prerelease version with dashes" do
144
+ let(:git_describe){ "11.0.0-alpha-3-207-g694b062" }
145
+
146
+ it "converts all dashes to dots" do
147
+ build_version.semver.should =~ /11.0.0-alpha.3\+#{today_string}[0-9]+.git.207.694b062/
148
+ end
149
+ end
150
+
151
+ context "exact version" do
152
+ let(:git_describe){ "11.0.0-alpha2" }
153
+
154
+ it "appends a timestamp with no git info" do
155
+ build_version.semver.should =~ /11.0.0-alpha2\+#{today_string}[0-9]+/
156
+ end
157
+ end
158
+
159
+ describe "appending a timestamp" do
160
+ let(:git_describe){ "11.0.0-alpha-3-207-g694b062" }
161
+
162
+ it "appends a timestamp by default" do
163
+ build_version.semver.should =~ /11.0.0-alpha.3\+#{today_string}[0-9]+.git.207.694b062/
164
+ end
165
+
166
+ describe "ENV['OMNIBUS_APPEND_TIMESTAMP'] is set" do
167
+ ["true","t","yes","y",1].each do |truthy|
168
+ context "to #{truthy}" do
169
+ before { ENV['OMNIBUS_APPEND_TIMESTAMP'] = truthy.to_s }
170
+ it "appends a timestamp" do
171
+ build_version.semver.should =~ /11.0.0-alpha.3\+#{today_string}[0-9]+.git.207.694b062/
172
+ end
173
+ end
174
+ end
175
+
176
+ ["false","f","no","n",0].each do |falsey|
177
+ context "to #{falsey}" do
178
+ before { ENV['OMNIBUS_APPEND_TIMESTAMP'] = falsey.to_s }
179
+ it "does not append a timestamp" do
180
+ build_version.semver.should =~ /11.0.0-alpha.3\+git.207.694b062/
181
+ end
182
+ end
183
+ end
184
+ end
185
+
186
+ describe "Omnibus::Config.append_timestamp is set" do
187
+ context "is true" do
188
+ before { Omnibus::Config.append_timestamp(true) }
189
+ it "appends a timestamp" do
190
+ build_version.semver.should =~ /11.0.0-alpha.3\+#{today_string}[0-9]+.git.207.694b062/
191
+ end
192
+ end
193
+
194
+ context "is false" do
195
+ before { Omnibus::Config.append_timestamp(false) }
196
+ it "does not append a timestamp" do
197
+ build_version.semver.should =~ /11.0.0-alpha.3\+git.207.694b062/
198
+ end
199
+ end
200
+ end
201
+
202
+ describe "both are set" do
203
+ before do
204
+ ENV['OMNIBUS_APPEND_TIMESTAMP'] = "false"
205
+ Omnibus::Config.append_timestamp(true)
206
+ end
207
+ it "prefers the value from ENV['OMNIBUS_APPEND_TIMESTAMP']" do
208
+ build_version.semver.should =~ /11.0.0-alpha.3\+git.207.694b062/
209
+ end
210
+ end
211
+ end
212
+ end
213
+
214
+ describe "git describe output" do
215
+ it "generates a valid git describe version" do
216
+ build_version.git_describe.should =~ valid_git_describe_regex
217
+ end
218
+
219
+ it "generates a version matching format 'MAJOR.MINOR.PATCH-PRELEASE.COMMITS_SINCE-gGIT_SHA'" do
220
+ build_version.git_describe.should == git_describe
221
+ end
222
+ end
223
+
224
+ describe "deprecated full output" do
225
+ it "generates a valid git describe version" do
226
+ Omnibus::BuildVersion.full.should =~ valid_git_describe_regex
227
+ end
228
+
229
+ it "outputs a deprecation message" do
230
+ Omnibus::BuildVersion.should_receive(:puts).with(/is deprecated/)
231
+ Omnibus::BuildVersion.full
232
+ end
233
+ end
234
+
235
+ describe "`git describe` command failure" do
236
+ before do
237
+ stderr =<<-STDERR
238
+ fatal: No tags can describe '809ea1afcce67e1148c1bf0822d40a7ef12c380e'.
239
+ Try --always, or create some tags.
240
+ STDERR
241
+ build_version.stub(:shellout)
242
+ .and_return(mock("ouput",
243
+ :stderr => stderr,
244
+ :exitstatus => 128))
245
+ end
246
+ it "sets the version to 0.0.0" do
247
+ build_version.git_describe.should eq("0.0.0")
248
+ end
249
+ end
250
+
251
+ describe "#initialize `path` parameter" do
252
+ let(:path) { "/some/fake/path" }
253
+ subject(:build_version){ Omnibus::BuildVersion.new(path) }
254
+
255
+ it "runs `git describe` at an alternate path" do
256
+ build_version.should_receive(:shellout)
257
+ .with("git describe",
258
+ {:live_stream => nil,
259
+ :cwd => path})
260
+ .and_return(mock("ouput",
261
+ :stdout => git_describe,
262
+ :exitstatus => 0))
263
+ build_version.git_describe
264
+ end
265
+ end
266
+ end
@@ -0,0 +1,3 @@
1
+ foo 1.0.0
2
+ THIS IS A BAD LINE
3
+ bar 1.0.0
@@ -0,0 +1,5 @@
1
+ foo 1.2.3
2
+ bar 0.0.1
3
+ baz deadbeefdeadbeefdeadbeefdeadbeef
4
+ spunky master
5
+ monkey release
@@ -0,0 +1,4 @@
1
+ foo 1.0.0
2
+ erchef 1.0.0
3
+ bar 1.0.0
4
+ erchef 2.0.0