builderator 0.3.15 → 1.0.0.pre.rc.1

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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +9 -0
  3. data/Gemfile.lock +440 -0
  4. data/README.md +72 -18
  5. data/Rakefile +1 -2
  6. data/VERSION +1 -1
  7. data/bin/build-clean +102 -0
  8. data/bin/build-data +45 -0
  9. data/builderator.gemspec +7 -4
  10. data/docs/configuration.md +154 -0
  11. data/docs/configuration/cookbook.md +19 -0
  12. data/docs/configuration/profile.md +71 -0
  13. data/docs/versioning.md +65 -0
  14. data/lib/builderator.rb +3 -0
  15. data/lib/builderator/config.rb +93 -0
  16. data/lib/builderator/config/attributes.rb +287 -0
  17. data/lib/builderator/config/defaults.rb +163 -0
  18. data/lib/builderator/config/file.rb +336 -0
  19. data/lib/builderator/config/rash.rb +80 -0
  20. data/lib/builderator/control/cleaner.rb +138 -0
  21. data/lib/builderator/control/cookbook.rb +16 -0
  22. data/lib/builderator/control/data.rb +16 -0
  23. data/lib/builderator/control/data/image.rb +98 -0
  24. data/lib/builderator/control/version.rb +128 -0
  25. data/lib/builderator/control/version/auto.rb +48 -0
  26. data/lib/builderator/control/version/bump.rb +82 -0
  27. data/lib/builderator/control/version/comparable.rb +77 -0
  28. data/lib/builderator/control/version/git.rb +45 -0
  29. data/lib/builderator/control/version/scm.rb +92 -0
  30. data/lib/builderator/interface.rb +67 -0
  31. data/lib/builderator/interface/berkshelf.rb +38 -0
  32. data/lib/builderator/interface/packer.rb +75 -0
  33. data/lib/builderator/interface/vagrant.rb +31 -0
  34. data/lib/builderator/metadata.rb +5 -3
  35. data/lib/builderator/model/cleaner.rb +49 -0
  36. data/lib/builderator/model/cleaner/images.rb +93 -0
  37. data/lib/builderator/model/cleaner/instances.rb +58 -0
  38. data/lib/builderator/model/cleaner/launch_configs.rb +47 -0
  39. data/lib/builderator/model/cleaner/scaling_groups.rb +45 -0
  40. data/lib/builderator/model/cleaner/snapshots.rb +50 -0
  41. data/lib/builderator/model/cleaner/volumes.rb +48 -0
  42. data/lib/builderator/patch/berkshelf.rb +18 -0
  43. data/lib/builderator/patch/thor-actions.rb +47 -0
  44. data/lib/builderator/tasks.rb +127 -17
  45. data/lib/builderator/tasks/berkshelf.rb +63 -0
  46. data/lib/builderator/tasks/packer.rb +17 -56
  47. data/lib/builderator/tasks/vagrant.rb +111 -42
  48. data/lib/builderator/tasks/vendor.rb +94 -0
  49. data/lib/builderator/tasks/version.rb +58 -0
  50. data/lib/builderator/util.rb +37 -11
  51. data/lib/builderator/util/aws_exception.rb +1 -1
  52. data/lib/builderator/util/limit_exception.rb +12 -11
  53. data/lib/builderator/util/task_exception.rb +0 -2
  54. data/mkmf.log +4 -0
  55. data/spec/config_spec.rb +30 -0
  56. data/spec/data/Berksfile +6 -0
  57. data/spec/data/Buildfile +0 -0
  58. data/spec/data/Vagrantfile +0 -0
  59. data/spec/data/history.json +483 -0
  60. data/spec/data/packer.json +0 -0
  61. data/spec/interface_spec.rb +36 -0
  62. data/spec/resource/Buildfile +27 -0
  63. data/spec/spec_helper.rb +90 -0
  64. data/spec/version_spec.rb +282 -0
  65. data/template/Berksfile.erb +10 -0
  66. data/template/Buildfile.erb +28 -0
  67. data/template/Gemfile.erb +16 -0
  68. data/template/README.md.erb +61 -0
  69. data/template/Vagrantfile.erb +75 -0
  70. data/template/gitignore.erb +104 -0
  71. data/{.rubocop.yml → template/rubocop.erb} +0 -0
  72. metadata +203 -56
  73. data/.gitignore +0 -14
  74. data/lib/builderator/control/ami.rb +0 -65
  75. data/lib/builderator/control/clean.rb +0 -130
  76. data/lib/builderator/model.rb +0 -46
  77. data/lib/builderator/model/images.rb +0 -89
  78. data/lib/builderator/model/instances.rb +0 -55
  79. data/lib/builderator/model/launch_configs.rb +0 -46
  80. data/lib/builderator/model/scaling_groups.rb +0 -43
  81. data/lib/builderator/model/snapshots.rb +0 -49
  82. data/lib/builderator/model/volumes.rb +0 -48
  83. data/lib/builderator/tasks/ami.rb +0 -47
  84. data/lib/builderator/tasks/berks.rb +0 -68
  85. data/lib/builderator/tasks/clean.rb +0 -97
  86. data/lib/builderator/util/berkshim.rb +0 -34
  87. data/lib/builderator/util/cookbook.rb +0 -87
  88. data/lib/builderator/util/packer.rb +0 -39
  89. data/lib/builderator/util/shell.rb +0 -44
File without changes
@@ -0,0 +1,36 @@
1
+ require_relative './spec_helper'
2
+
3
+ require 'builderator/config'
4
+ require 'builderator/interface/berkshelf'
5
+ require 'builderator/interface/packer'
6
+ require 'builderator/interface/vagrant'
7
+
8
+ # :nodoc:
9
+ module Builderator
10
+ RSpec.describe Interface do
11
+ context 'Berksfile' do
12
+ berkshelf = Interface.berkshelf
13
+
14
+ it 'loads from Config values' do
15
+ expect(berkshelf.vendor).to eq Config.local.cookbook_path
16
+ end
17
+
18
+ it 'generates the correct Berksfile' do
19
+ expect(berkshelf.render).to eq IO.read(::File.expand_path('../data/Berksfile', __FILE__))
20
+ end
21
+ end
22
+
23
+ context 'Vagrantfile' do
24
+ vagrant = Interface.vagrant(:default)
25
+
26
+ it 'loads from Config values' do
27
+ expect(vagrant.build_name).to eq Config.build_name
28
+ end
29
+
30
+ it 'generates the correct Vagrantfile' do
31
+ pending "test doesn't work with absolute paths"
32
+ expect(vagrant.render).to eq IO.read(::File.expand_path('../data/Vagrantfile', __FILE__))
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,27 @@
1
+ ##
2
+ # Test Buildfile
3
+ ##
4
+ build_name 'builderator'
5
+
6
+ autoversion.create_tags false
7
+ autoversion.search_tags false
8
+
9
+ cookbook do |cookbook|
10
+ cookbook.depends 'apt'
11
+ cookbook.depends 'etcd-v2'
12
+ end
13
+
14
+ ## Fetch Chef resources
15
+ vendor :chef do |vendor|
16
+ vendor.git 'git@github.com:rapid7/chef-demo-data.git'
17
+ end
18
+
19
+ profile :default do |profile|
20
+ profile.chef.run_list 'apt::default', 'etcd-v2::node'
21
+
22
+ profile.vagrant do |vagrant|
23
+ vagrant.local do |local|
24
+ local.memory 512
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,90 @@
1
+ lib = File.expand_path('../../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ require 'builderator/config'
5
+ require 'builderator/util'
6
+
7
+ module Builderator
8
+ ## Hack everything into running in spec/resource
9
+ module Util
10
+ class << self
11
+ def relative_path(*relative)
12
+ Pathname.new(__FILE__).join('../resource').join(*relative).expand_path
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ RSpec.configure do |config|
19
+ Builderator::Config.load(::File.expand_path('../resource/Buildfile', __FILE__))
20
+
21
+ # rspec-expectations config goes here. You can use an alternate
22
+ # assertion/expectation library such as wrong or the stdlib/minitest
23
+ # assertions if you prefer.
24
+ config.expect_with :rspec do |expectations|
25
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
26
+ end
27
+
28
+ # rspec-mocks config goes here. You can use an alternate test double
29
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
30
+ config.mock_with :rspec do |mocks|
31
+ mocks.verify_partial_doubles = true
32
+ end
33
+
34
+ # The settings below are suggested to provide a good initial experience
35
+ # with RSpec, but feel free to customize to your heart's content.
36
+
37
+ # rubocop:disable Style/BlockComments
38
+ =begin
39
+ # These two settings work together to allow you to limit a spec run
40
+ # to individual examples or groups you care about by tagging them with
41
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
42
+ # get run.
43
+ config.filter_run :focus
44
+ config.run_all_when_everything_filtered = true
45
+
46
+ # Allows RSpec to persist some state between runs in order to support
47
+ # the `--only-failures` and `--next-failure` CLI options. We recommend
48
+ # you configure your source control system to ignore this file.
49
+ config.example_status_persistence_file_path = "spec/examples.txt"
50
+
51
+ # Limits the available syntax to the non-monkey patched syntax that is
52
+ # recommended. For more details, see:
53
+ # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
54
+ # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
55
+ # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
56
+ config.disable_monkey_patching!
57
+
58
+ # This setting enables warnings. It's recommended, but in some cases may
59
+ # be too noisy due to issues in dependencies.
60
+ config.warnings = true
61
+
62
+ # Many RSpec users commonly either run the entire suite or an individual
63
+ # file, and it's useful to allow more verbose output when running an
64
+ # individual spec file.
65
+ if config.files_to_run.one?
66
+ # Use the documentation formatter for detailed output,
67
+ # unless a formatter has already been configured
68
+ # (e.g. via a command-line flag).
69
+ config.default_formatter = 'doc'
70
+ end
71
+
72
+ # Print the 10 slowest examples and example groups at the
73
+ # end of the spec run, to help surface which specs are running
74
+ # particularly slow.
75
+ config.profile_examples = 10
76
+
77
+ # Run specs in random order to surface order dependencies. If you find an
78
+ # order dependency and want to debug it, you can fix the order by providing
79
+ # the seed, which is printed after each run.
80
+ # --seed 1234
81
+ config.order = :random
82
+
83
+ # Seed global randomization in this process using the `--seed` CLI option.
84
+ # Setting this allows you to use `--seed` to deterministically reproduce
85
+ # test failures related to randomization by passing the same `--seed` value
86
+ # as the one that triggered the failure.
87
+ Kernel.srand config.seed
88
+ =end
89
+ # rubocop:enable Style/BlockComments
90
+ end
@@ -0,0 +1,282 @@
1
+ require_relative './spec_helper'
2
+
3
+ require 'json'
4
+ require 'builderator/control/version'
5
+
6
+ # rubocop:disable Metrics/ClassLength
7
+
8
+ module Builderator
9
+ module Control
10
+ # :nodoc:
11
+ class Version
12
+ ## Test stub to load from an included JSON document
13
+ module Test
14
+ extend SCM
15
+
16
+ def self.supported?
17
+ true
18
+ end
19
+
20
+ def self._history
21
+ JSON.parse(
22
+ IO.read(::File.expand_path('../data/history.json', __FILE__)),
23
+ :symbolize_names => true)
24
+ end
25
+ end
26
+
27
+ ## Disable the Git provider
28
+ module Git
29
+ extend SCM
30
+
31
+ def self.supported?
32
+ false
33
+ end
34
+ end
35
+
36
+ SCM.register(Test)
37
+
38
+ RSpec.describe Builderator::Control::Version do
39
+ context 'loading, parsing, and ordering of commits and tags' do
40
+ it 'loads history from a provider' do
41
+ expect(SCM.history).to be_a Array
42
+ expect(SCM.history).to_not be_empty
43
+ expect(SCM.history).to all be_a SCM::Commit
44
+ end
45
+
46
+ context 'parses semver strings correctly' do
47
+ it 'parses a.b.c versions correctly' do
48
+ version = Version.from_string('1.2.3')
49
+
50
+ expect(version.major).to be == 1
51
+ expect(version.minor).to be == 2
52
+ expect(version.patch).to be == 3
53
+
54
+ expect(version.is_prerelease).to be false
55
+ expect(version.prerelease_name).to be_nil
56
+ expect(version.prerelease_iteration).to be_nil
57
+ expect(version.build).to be_nil
58
+ end
59
+
60
+ it 'parses pre-release versions correctly' do
61
+ version = Version.from_string('1.2.3-pre.42')
62
+
63
+ expect(version.major).to be == 1
64
+ expect(version.minor).to be == 2
65
+ expect(version.patch).to be == 3
66
+ expect(version.is_prerelease).to be true
67
+ expect(version.prerelease_name).to be == 'pre'
68
+ expect(version.prerelease_iteration).to be == 42
69
+ expect(version.build).to be_nil
70
+ end
71
+
72
+ it 'parses build versions correctly' do
73
+ version = Version.from_string('1.2.3+build.9')
74
+
75
+ expect(version.major).to be == 1
76
+ expect(version.minor).to be == 2
77
+ expect(version.patch).to be == 3
78
+ expect(version.is_prerelease).to be false
79
+ expect(version.prerelease_name).to be_nil
80
+ expect(version.prerelease_iteration).to be_nil
81
+ expect(version.build).to be == 9
82
+ end
83
+
84
+ it 'parses the complete spec' do
85
+ version = Version.from_string('1.2.3-yolo.42+build.9')
86
+
87
+ expect(version.major).to be == 1
88
+ expect(version.minor).to be == 2
89
+ expect(version.patch).to be == 3
90
+ expect(version.is_prerelease).to be true
91
+ expect(version.prerelease_name).to be == 'yolo'
92
+ expect(version.prerelease_iteration).to be == 42
93
+ expect(version.build).to be == 9
94
+ end
95
+
96
+ it 'fails on invalid specs' do
97
+ expect { Version.from_string('1.2.lizard-alpha.42+build.9') }.to raise_error RuntimeError
98
+ expect { Version.from_string('1.2.3-alpha.42+taco.9') }.to raise_error RuntimeError
99
+ expect { Version.from_string('1.2.3-alpha.guacamole+build.9') }.to raise_error RuntimeError
100
+ expect { Version.from_string('1.2.3-alpha.42+build.beef') }.to raise_error RuntimeError
101
+ expect { Version.from_string('1.2.dog') }.to raise_error RuntimeError
102
+ expect { Version.from_string('1.cat.3') }.to raise_error RuntimeError
103
+ expect { Version.from_string('cow.2.3') }.to raise_error RuntimeError
104
+ end
105
+ end
106
+
107
+ it 'generates Version objects from commits' do
108
+ expect(SCM.tags).to be_a Array
109
+ expect(SCM.tags).to_not be_empty
110
+ expect(SCM.tags).to all be_a Version
111
+ end
112
+
113
+ it 'finds the current version of the module' do
114
+ expect(SCM.tags).to all be <= Version.current
115
+ end
116
+ end
117
+
118
+ context 'bumping versions' do
119
+ it 'attaches the correct SCM ref to new versions' do
120
+ previous = Version.current
121
+
122
+ Version.bump(:major)
123
+ expect(Version.current.ref).to eq SCM.history.first.id
124
+ expect(Version.current).to_not equal(previous)
125
+ end
126
+
127
+ it 'fails when an invalid step is passed to #bump' do
128
+ expect { Version.bump(:lizard) }.to raise_error RuntimeError
129
+ end
130
+
131
+ context 'bump build' do
132
+ it 'adds, increments, and resets build numbers' do
133
+ expect(Version.current.build).to be_nil
134
+ previous = Version.current
135
+
136
+ Version.bump(:build)
137
+ expect(Version.current).to_not equal(previous)
138
+ expect(Version.current.build).to be == 0
139
+
140
+ Version.bump(:build)
141
+ expect(Version.current.build).to be == 1
142
+
143
+ Version.bump(:patch)
144
+ expect(Version.current.build).to be_nil
145
+ end
146
+ end
147
+
148
+ context 'bump prerelease and release' do
149
+ it 'creates and increments pre-releases from previous releases' do
150
+ expect(Version.current.is_prerelease).to be false
151
+ previous = Version.current
152
+
153
+ Version.bump(:prerelease)
154
+ expect(Version.current.patch).to be == (previous.patch + 1)
155
+ expect(Version.current.is_prerelease).to be true
156
+ expect(Version.current.prerelease_name).to be == 'alpha'
157
+ expect(Version.current.prerelease_iteration).to be == 0
158
+
159
+ Version.bump(:prerelease)
160
+ expect(Version.current.prerelease_name).to be == 'alpha'
161
+ expect(Version.current.prerelease_iteration).to be == 1
162
+ end
163
+
164
+ it 'creates and increments pre-releases with a specified name' do
165
+ expect(Version.current.is_prerelease).to be true
166
+
167
+ Version.bump(:prerelease, 'beta')
168
+ expect(Version.current.prerelease_name).to be == 'beta'
169
+ expect(Version.current.prerelease_iteration).to be == 0
170
+
171
+ Version.bump(:prerelease)
172
+ expect(Version.current.prerelease_name).to be == 'beta'
173
+ expect(Version.current.prerelease_iteration).to be == 1
174
+
175
+ Version.bump(:prerelease, 'beta')
176
+ expect(Version.current.prerelease_name).to be == 'beta'
177
+ expect(Version.current.prerelease_iteration).to be == 2
178
+ end
179
+
180
+ it 'removes pre-release parameters for a release' do
181
+ expect(Version.current.is_prerelease).to be true
182
+ previous = Version.current
183
+
184
+ Version.bump(:release)
185
+ expect(Version.current.patch).to be == previous.patch
186
+ expect(Version.current.is_prerelease).to be false
187
+ expect(Version.current.prerelease_name).to be_nil
188
+ expect(Version.current.prerelease_iteration).to be_nil
189
+ end
190
+ end
191
+
192
+ context 'bump major, minor, and patch-prerelease' do
193
+ it 'creates a new patch version for a patch-prerelease' do
194
+ Version.bump(:prerelease)
195
+ previous = Version.current
196
+ expect(Version.current.is_prerelease).to be true
197
+
198
+ Version.bump('patch-prerelease')
199
+ expect(Version.current.is_prerelease).to be true
200
+ expect(Version.current.patch).to be == (previous.patch + 1)
201
+ end
202
+
203
+ it 'creates a new minor version for a minor-prerelease' do
204
+ previous = Version.current
205
+ expect(Version.current.is_prerelease).to be true
206
+
207
+ Version.bump('minor-prerelease')
208
+ expect(Version.current.is_prerelease).to be true
209
+ expect(Version.current.patch).to be == 0
210
+ expect(Version.current.minor).to be == (previous.minor + 1)
211
+ end
212
+
213
+ it 'creates a new major version for a major-prerelease' do
214
+ previous = Version.current
215
+ expect(Version.current.is_prerelease).to be true
216
+
217
+ Version.bump('major-prerelease')
218
+ expect(Version.current.is_prerelease).to be true
219
+ expect(Version.current.patch).to be == 0
220
+ expect(Version.current.minor).to be == 0
221
+ expect(Version.current.major).to be == (previous.major + 1)
222
+ end
223
+ end
224
+
225
+ context 'bump major, minor, and patch' do
226
+ it 'creates a new patch version and resets build and prerelease parameters' do
227
+ Version.bump(:prerelease)
228
+ Version.bump(:build)
229
+ previous = Version.current
230
+
231
+ expect(Version.current.is_prerelease).to be true
232
+ expect(Version.current.build).to_not be_nil
233
+
234
+ Version.bump(:patch)
235
+
236
+ expect(Version.current.is_prerelease).to be false
237
+ expect(Version.current.build).to be_nil
238
+ expect(Version.current.patch).to be == (previous.patch + 1)
239
+ end
240
+
241
+ it 'creates a new minor version and resets lower-precedence parameters' do
242
+ Version.bump(:prerelease)
243
+ Version.bump(:build)
244
+ previous = Version.current
245
+
246
+ expect(Version.current.is_prerelease).to be true
247
+ expect(Version.current.build).to_not be_nil
248
+ expect(Version.current.patch).to_not be == 0
249
+
250
+ Version.bump(:minor)
251
+
252
+ expect(Version.current.is_prerelease).to be false
253
+ expect(Version.current.build).to be_nil
254
+ expect(Version.current.patch).to be == 0
255
+ expect(Version.current.minor).to be == (previous.minor + 1)
256
+ end
257
+
258
+ it 'creates a new major version and resets lower-precedence parameters' do
259
+ Version.bump(:prerelease)
260
+ Version.bump(:build)
261
+ previous = Version.current
262
+
263
+ expect(Version.current.is_prerelease).to be true
264
+ expect(Version.current.build).to_not be_nil
265
+ expect(Version.current.patch).to_not be == 0
266
+ expect(Version.current.minor).to_not be == 0
267
+
268
+ Version.bump(:major)
269
+
270
+ expect(Version.current.is_prerelease).to be false
271
+ expect(Version.current.build).to be_nil
272
+ expect(Version.current.patch).to be == 0
273
+ expect(Version.current.minor).to be == 0
274
+ expect(Version.current.major).to be == (previous.major + 1)
275
+ end
276
+ end
277
+ end
278
+ end
279
+ end
280
+ end
281
+ end
282
+ # rubocop:enable Metrics/ClassLength
@@ -0,0 +1,10 @@
1
+ require 'builderator/patch/berkshelf'
2
+
3
+ <% cookbook.sources.each do |s| -%>
4
+ source '<%= s %>'
5
+ <% end -%>
6
+ <% if cookbook.metadata %>metadata<% end -%>
7
+
8
+ <% cookbook.depends.each do |name, cookbook| -%>
9
+ cookbook '<%= name %>', '<%= cookbook.fetch(:version, '>= 0.0.0') %>', <%= cookbook.to_hash %>
10
+ <% end -%>