bunchr 0.1.1 → 0.1.2
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.
- data/README.md +148 -116
- data/bunchr.gemspec +1 -1
- data/lib/bunchr/version.rb +1 -1
- data/lib/bunchr.rb +2 -0
- data/pkg/bunchr-0.1.1/README.md +355 -0
- data/pkg/bunchr-0.1.1/Rakefile +9 -0
- data/pkg/bunchr-0.1.1/TODO +7 -0
- data/pkg/bunchr-0.1.1/bunchr.gemspec +34 -0
- data/pkg/bunchr-0.1.1/doc/Bunchr/Logger.html +201 -0
- data/pkg/bunchr-0.1.1/doc/Bunchr/Ohai.html +201 -0
- data/pkg/bunchr-0.1.1/doc/Bunchr/Packages.html +1840 -0
- data/pkg/bunchr-0.1.1/doc/Bunchr/Software.html +1727 -0
- data/pkg/bunchr-0.1.1/doc/Bunchr/Utils.html +334 -0
- data/pkg/bunchr-0.1.1/doc/Bunchr.html +124 -0
- data/pkg/bunchr-0.1.1/doc/_index.html +181 -0
- data/pkg/bunchr-0.1.1/doc/class_list.html +47 -0
- data/pkg/bunchr-0.1.1/doc/css/common.css +1 -0
- data/pkg/bunchr-0.1.1/doc/css/full_list.css +55 -0
- data/pkg/bunchr-0.1.1/doc/css/style.css +322 -0
- data/pkg/bunchr-0.1.1/doc/file.README.html +376 -0
- data/pkg/bunchr-0.1.1/doc/file_list.html +49 -0
- data/pkg/bunchr-0.1.1/doc/frames.html +13 -0
- data/pkg/bunchr-0.1.1/doc/index.html +376 -0
- data/pkg/bunchr-0.1.1/doc/js/app.js +205 -0
- data/pkg/bunchr-0.1.1/doc/js/full_list.js +173 -0
- data/pkg/bunchr-0.1.1/doc/js/jquery.js +16 -0
- data/pkg/bunchr-0.1.1/doc/method_list.html +438 -0
- data/pkg/bunchr-0.1.1/doc/top-level-namespace.html +105 -0
- data/pkg/bunchr-0.1.1/example_recipes/autoconf.rake +18 -0
- data/pkg/bunchr-0.1.1/example_recipes/libyaml.rake +18 -0
- data/pkg/bunchr-0.1.1/example_recipes/openssl.rake +54 -0
- data/pkg/bunchr-0.1.1/example_recipes/ruby.rake +38 -0
- data/pkg/bunchr-0.1.1/example_recipes/sensu.rake +18 -0
- data/pkg/bunchr-0.1.1/example_recipes/sensu_bin_stubs.rake +17 -0
- data/pkg/bunchr-0.1.1/example_recipes/sensu_configs.rake +30 -0
- data/pkg/bunchr-0.1.1/example_recipes/sensu_dashboard.rake +17 -0
- data/pkg/bunchr-0.1.1/example_recipes/zlib.rake +32 -0
- data/pkg/bunchr-0.1.1/lib/bunchr/logger.rb +18 -0
- data/pkg/bunchr-0.1.1/lib/bunchr/ohai.rb +18 -0
- data/pkg/bunchr-0.1.1/lib/bunchr/packages.rb +176 -0
- data/pkg/bunchr-0.1.1/lib/bunchr/software.rb +164 -0
- data/pkg/bunchr-0.1.1/lib/bunchr/utils.rb +36 -0
- data/pkg/bunchr-0.1.1/lib/bunchr/version.rb +3 -0
- data/pkg/bunchr-0.1.1/lib/bunchr.rb +44 -0
- data/pkg/bunchr-0.1.1.gem +0 -0
- metadata +123 -62
data/README.md
CHANGED
@@ -29,7 +29,7 @@ to install and should not interfere with any other Ruby apps or scripts on the
|
|
29
29
|
server.
|
30
30
|
|
31
31
|
About the time the Sensu project was discussing a new packaging approach,
|
32
|
-
|
32
|
+
[Adam Jacob](http://twitter.com/adamhjk) from [Opscode/Chef](http://opscode.com/) took notice and suggested
|
33
33
|
a slightly different approach that achieved the same goals. The approach was
|
34
34
|
called 'omnibus' and was already in use at Opscode to produce a simple and
|
35
35
|
uniform installer for Chef.
|
@@ -48,12 +48,25 @@ Installation
|
|
48
48
|
gem install bunchr
|
49
49
|
```
|
50
50
|
|
51
|
+
Usage
|
52
|
+
-----
|
53
|
+
|
54
|
+
The simplest workflow is:
|
55
|
+
|
56
|
+
1. Create a `Rakefile`
|
57
|
+
2. Define 1 or more `Bunchr::Software` objects
|
58
|
+
3. Define 1 `Bunchr::Packages` object.
|
59
|
+
4. run `rake`
|
60
|
+
5. receive new packages (.rpm or .deb, depending on platform) !
|
61
|
+
|
62
|
+
For details on the DSL and examples, continue reading.
|
63
|
+
|
51
64
|
DSL Overview
|
52
65
|
------------
|
53
66
|
|
54
67
|
A typical Bunchr project is comprised of one or more `Bunchr::Software` objects
|
55
|
-
and a single `Bunchr::Packages` object. Define these all in a `Rakefile` or
|
56
|
-
separate them into files.
|
68
|
+
and a single `Bunchr::Packages` object. Define these all in a single `Rakefile` or
|
69
|
+
separate them into files for readability and re-use.
|
57
70
|
|
58
71
|
`Software` objects are responsible for downloading, building, and installing
|
59
72
|
a single software component, such as `zlib` or `ruby`. `Software` objects
|
@@ -74,123 +87,19 @@ Currently supported package types:
|
|
74
87
|
* .deb
|
75
88
|
* .rpm
|
76
89
|
|
77
|
-
### Software DSL
|
78
|
-
|
79
|
-
* Example software recipes: https://github.com/joemiller/bunchr/tree/master/example_recipes
|
80
|
-
|
81
|
-
Example recipe for building and installing `ruby`:
|
82
|
-
|
83
|
-
```
|
84
|
-
Bunchr::Software.new do |t|
|
85
|
-
t.name = 'ruby'
|
86
|
-
t.version = '1.9.3-p125'
|
87
|
-
|
88
|
-
t.depends_on('autoconf')
|
89
|
-
t.depends_on('zlib')
|
90
|
-
t.depends_on('openssl')
|
91
|
-
t.depends_on('libyaml')
|
92
|
-
|
93
|
-
install_prefix = "#{Bunchr.install_dir}/embedded"
|
94
|
-
|
95
|
-
os = t.ohai['os']
|
96
|
-
arch = t.ohai['kernel']['machine']
|
97
|
-
|
98
|
-
t.download_commands << "curl -O http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p125.tar.gz"
|
99
|
-
t.download_commands << "tar xfvz ruby-1.9.3-p125.tar.gz"
|
100
|
-
|
101
|
-
if os == 'darwin' && arch == 'x86_64'
|
102
|
-
t.build_environment['LDFLAGS'] = "-arch x86_64 -R#{install_prefix}/lib -L#{install_prefix}/lib -I#{install_prefix}/include"
|
103
|
-
t.build_environment['CFLAGS'] = "-arch x86_64 -m64 -L#{install_prefix}/lib -I#{install_prefix}/include"
|
104
|
-
elsif os == 'linux'
|
105
|
-
t.build_environment['LDFLAGS'] = "-Wl,-rpath #{install_prefix}/lib -L#{install_prefix}/lib -I#{install_prefix}/include"
|
106
|
-
t.build_environment['CFLAGS'] = "-L#{install_prefix}/lib -I#{install_prefix}/include"
|
107
|
-
elsif os == 'solaris2'
|
108
|
-
t.build_environment['LDFLAGS'] = "-R#{install_prefix}/lib -L#{install_prefix}/lib -I#{install_prefix}/include"
|
109
|
-
t.build_environment['CFLAGS'] = "-L#{install_prefix}/lib -I#{install_prefix}/include"
|
110
|
-
end
|
111
|
-
|
112
|
-
t.build_commands << "./configure --prefix=#{install_prefix} \
|
113
|
-
--with-opt-dir=#{install_prefix} \
|
114
|
-
--enable-shared \
|
115
|
-
--disable-install-doc"
|
116
|
-
t.build_commands << "make"
|
117
|
-
|
118
|
-
t.install_commands << "make install"
|
119
|
-
|
120
|
-
CLEAN << install_prefix
|
121
|
-
end
|
122
|
-
```
|
123
|
-
|
124
|
-
* `t.name` - Required. Name of the software component.
|
125
|
-
|
126
|
-
* `t.version` - Optional. Version of the software component.
|
127
|
-
|
128
|
-
* `t.depends_on(name)` - Optional. This is used to tell Bunchr that other
|
129
|
-
`Software` components should be built before this one.
|
130
|
-
|
131
|
-
* `t.ohai` - This provides access to the `Bunchr::Ohai` object which contains
|
132
|
-
Ohai data about the system. By default, only the `platform` and `os` plugins
|
133
|
-
are loaded. Since you have direct access to the Ohai object, other plugins
|
134
|
-
can be loaded by calling `t.ohai.require_plugin`
|
135
|
-
|
136
|
-
* `t.download_commands` - An array of shell commands used to download and
|
137
|
-
uncompress the source. You could also do a `git clone ..` here. These commands
|
138
|
-
are executed in the `download_dir` which is as `#{Bunchr.build_dir}/#{t.name}`.
|
139
|
-
The `download_dir` cannot be changed.
|
140
|
-
|
141
|
-
* `t.build_commands` - An array of shell commands used to compile the downloaded
|
142
|
-
source. These commands are executed in the directory defined by
|
143
|
-
`t.work_dir` which will be automatically determined from:
|
144
|
-
1) `#{download_dir}/#{t.name}-#{t.version}` (common for most tarballs), or
|
145
|
-
2) `#{download_dir}/#{t.name}` (if no `t.version` set), or
|
146
|
-
3) explicitly set by calling `t.work_dir = '/some/absolute/path'`
|
147
|
-
|
148
|
-
* `t.install_commands` - An array of shell commands used to download and
|
149
|
-
uncompress the source. You could also do a `git clone ..` here. These commands
|
150
|
-
are executed in `t.work_dir` directory.
|
151
|
-
|
152
|
-
* `CLEAN` - Optional. This is an array of files and directories that should be deleted
|
153
|
-
when `rake clean` is executed.
|
154
|
-
|
155
|
-
`download_commands`, `build_commands`, and `install_commands` are all optional,
|
156
|
-
but unless one of them contains some commands your `Software` object won't be
|
157
|
-
doing anything useful.
|
158
|
-
|
159
|
-
If any of `download_commands`, `build_commands`, or `install_commands` exit
|
160
|
-
with a non-zero status, the entire Bunchr process will stop
|
161
|
-
and print any STDOUT or STDERR from the failed command to the Logger.
|
162
|
-
|
163
|
-
Bunchr will keep track of what has succeeded so that you can restart a failed
|
164
|
-
build after fixing an error. This can save quite a bit of time during package
|
165
|
-
development, but you should consider doing a full `rake clean` before building
|
166
|
-
any official packages.
|
167
|
-
|
168
|
-
|
169
|
-
All tasks created by a `Bunchr::Software` object are prefixed into the
|
170
|
-
`software:` namespace. To see the generated tasks:
|
171
|
-
|
172
|
-
```
|
173
|
-
$ rake -T software:ruby
|
174
|
-
rake software:ruby # Download, build, and install ruby 1.9.3-p125
|
175
|
-
rake software:ruby:build # Build ruby 1.9.3-p125
|
176
|
-
rake software:ruby:download # Download ruby 1.9.3-p125
|
177
|
-
rake software:ruby:install # Install ruby 1.9.3-p125
|
178
|
-
```
|
179
|
-
|
180
|
-
`Software` recipes can be defined directly in the Rakefile or they can
|
181
|
-
be separated into individual files and loaded via `Bunchr.load_recipes(files)`.
|
182
|
-
|
183
90
|
### Packages DSL
|
184
91
|
|
185
92
|
A project will typically only contain a single `Bunchr::Packages` object which
|
186
|
-
is essentially a wrapper around `fpm
|
187
|
-
|
188
|
-
|
93
|
+
is essentially a wrapper around `fpm`.
|
94
|
+
|
95
|
+
The Ohai `platform` data will be used to determined what type of packages can be
|
96
|
+
built on the current system. Typically you would run the same Bunchr code on a
|
189
97
|
Debian based box to build the .deb, and a Redhat based box to build the .rpm.
|
98
|
+
Vagrant can help with this.
|
190
99
|
|
191
100
|
Example `Rakefile`:
|
192
101
|
|
193
|
-
```
|
102
|
+
```ruby
|
194
103
|
require 'bunchr'
|
195
104
|
|
196
105
|
Bunchr.build_dir = '/tmp/build'
|
@@ -303,6 +212,114 @@ rake packages:sensu:build_tarball # Build tarball: sensu-0.9.5-1-x86_64.tar.gz
|
|
303
212
|
The main task is `packages:#{name}`. Exec this task to create all relevant
|
304
213
|
packages.
|
305
214
|
|
215
|
+
|
216
|
+
### Software DSL
|
217
|
+
|
218
|
+
* Example software recipes: https://github.com/joemiller/bunchr/tree/master/example_recipes
|
219
|
+
|
220
|
+
Example recipe for building and installing `ruby`:
|
221
|
+
|
222
|
+
```ruby
|
223
|
+
Bunchr::Software.new do |t|
|
224
|
+
t.name = 'ruby'
|
225
|
+
t.version = '1.9.3-p125'
|
226
|
+
|
227
|
+
t.depends_on('autoconf')
|
228
|
+
t.depends_on('zlib')
|
229
|
+
t.depends_on('openssl')
|
230
|
+
t.depends_on('libyaml')
|
231
|
+
|
232
|
+
install_prefix = "#{Bunchr.install_dir}/embedded"
|
233
|
+
|
234
|
+
os = t.ohai['os']
|
235
|
+
arch = t.ohai['kernel']['machine']
|
236
|
+
|
237
|
+
t.download_commands << "curl -O http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p125.tar.gz"
|
238
|
+
t.download_commands << "tar xfvz ruby-1.9.3-p125.tar.gz"
|
239
|
+
|
240
|
+
if os == 'darwin' && arch == 'x86_64'
|
241
|
+
t.build_environment['LDFLAGS'] = "-arch x86_64 -R#{install_prefix}/lib -L#{install_prefix}/lib -I#{install_prefix}/include"
|
242
|
+
t.build_environment['CFLAGS'] = "-arch x86_64 -m64 -L#{install_prefix}/lib -I#{install_prefix}/include"
|
243
|
+
elsif os == 'linux'
|
244
|
+
t.build_environment['LDFLAGS'] = "-Wl,-rpath #{install_prefix}/lib -L#{install_prefix}/lib -I#{install_prefix}/include"
|
245
|
+
t.build_environment['CFLAGS'] = "-L#{install_prefix}/lib -I#{install_prefix}/include"
|
246
|
+
elsif os == 'solaris2'
|
247
|
+
t.build_environment['LDFLAGS'] = "-R#{install_prefix}/lib -L#{install_prefix}/lib -I#{install_prefix}/include"
|
248
|
+
t.build_environment['CFLAGS'] = "-L#{install_prefix}/lib -I#{install_prefix}/include"
|
249
|
+
end
|
250
|
+
|
251
|
+
t.build_commands << "./configure --prefix=#{install_prefix} \
|
252
|
+
--with-opt-dir=#{install_prefix} \
|
253
|
+
--enable-shared \
|
254
|
+
--disable-install-doc"
|
255
|
+
t.build_commands << "make"
|
256
|
+
|
257
|
+
t.install_commands << "make install"
|
258
|
+
|
259
|
+
CLEAN << install_prefix
|
260
|
+
end
|
261
|
+
```
|
262
|
+
|
263
|
+
* `t.name` - Required. Name of the software component.
|
264
|
+
|
265
|
+
* `t.version` - Optional. Version of the software component.
|
266
|
+
|
267
|
+
* `t.depends_on(name)` - Optional. This is used to tell Bunchr that other
|
268
|
+
`Software` components should be built before this one.
|
269
|
+
|
270
|
+
* `t.ohai` - This provides access to the `Bunchr::Ohai` object which contains
|
271
|
+
Ohai data about the system. By default, only the `platform` and `os` plugins
|
272
|
+
are loaded. Since you have direct access to the Ohai object, other plugins
|
273
|
+
can be loaded by calling `t.ohai.require_plugin`
|
274
|
+
|
275
|
+
* `t.download_commands` - An array of shell commands used to download and
|
276
|
+
uncompress the source. You could also do a `git clone ..` here. These commands
|
277
|
+
are executed in the `download_dir` which is `#{Bunchr.build_dir}/#{t.name}`.
|
278
|
+
The `download_dir` cannot be changed.
|
279
|
+
|
280
|
+
* `t.build_commands` - An array of shell commands used to compile the downloaded
|
281
|
+
source. These commands are executed in the directory defined by
|
282
|
+
`t.work_dir` which will be automatically determined from:
|
283
|
+
1) `#{download_dir}/#{t.name}-#{t.version}` (common for most tarballs), or
|
284
|
+
2) `#{download_dir}/#{t.name}` (if no `t.version` set), or
|
285
|
+
3) explicitly set by calling `t.work_dir = '/some/absolute/path'`
|
286
|
+
|
287
|
+
* `t.install_commands` - An array of shell commands used to download and
|
288
|
+
uncompress the source. You could also do a `git clone ..` here. These commands
|
289
|
+
are executed in `t.work_dir` directory.
|
290
|
+
|
291
|
+
* `CLEAN` - Optional. This is an array of files and directories that should be deleted
|
292
|
+
when `rake clean` is executed.
|
293
|
+
|
294
|
+
`download_commands`, `build_commands`, and `install_commands` are all optional,
|
295
|
+
but unless one of them contains some commands your `Software` object won't be
|
296
|
+
doing anything useful.
|
297
|
+
|
298
|
+
If any of `download_commands`, `build_commands`, or `install_commands` exit
|
299
|
+
with a non-zero status, the entire Bunchr process will stop
|
300
|
+
and print any STDOUT or STDERR from the failed command to the Logger.
|
301
|
+
|
302
|
+
Bunchr will keep track of what has succeeded so that you can restart a failed
|
303
|
+
build after fixing an error. This can save quite a bit of time during package
|
304
|
+
development, but you should consider doing a full `rake clean` before building
|
305
|
+
any official packages.
|
306
|
+
|
307
|
+
|
308
|
+
All tasks created by a `Bunchr::Software` object are prefixed into the
|
309
|
+
`software:` namespace. To see the generated tasks:
|
310
|
+
|
311
|
+
```
|
312
|
+
$ rake -T software:ruby
|
313
|
+
rake software:ruby # Download, build, and install ruby 1.9.3-p125
|
314
|
+
rake software:ruby:build # Build ruby 1.9.3-p125
|
315
|
+
rake software:ruby:download # Download ruby 1.9.3-p125
|
316
|
+
rake software:ruby:install # Install ruby 1.9.3-p125
|
317
|
+
```
|
318
|
+
|
319
|
+
`Software` recipes can be defined directly in the Rakefile or they can
|
320
|
+
be separated into individual files and loaded via `Bunchr.load_recipes(files)`.
|
321
|
+
|
322
|
+
|
306
323
|
Integration with Vagrant
|
307
324
|
------------------------
|
308
325
|
|
@@ -318,6 +335,21 @@ Author
|
|
318
335
|
|
319
336
|
* [Joe Miller](https://twitter.com/miller_joe) - http://joemiller.me / https://github.com/joemiller
|
320
337
|
|
321
|
-
|
322
|
-
|
323
|
-
|
338
|
+
License
|
339
|
+
-------
|
340
|
+
|
341
|
+
Author:: Joe Miller (<joeym@joeym.net>)
|
342
|
+
Copyright:: Copyright (c) 2012 Joe Miller
|
343
|
+
License:: Apache License, Version 2.0
|
344
|
+
|
345
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
346
|
+
you may not use this file except in compliance with the License.
|
347
|
+
You may obtain a copy of the License at
|
348
|
+
|
349
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
350
|
+
|
351
|
+
Unless required by applicable law or agreed to in writing, software
|
352
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
353
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
354
|
+
See the License for the specific language governing permissions and
|
355
|
+
limitations under the License.
|
data/bunchr.gemspec
CHANGED
@@ -27,7 +27,7 @@ EOF
|
|
27
27
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
28
28
|
s.specification_version = 3 if s.respond_to? :specification_version
|
29
29
|
|
30
|
-
s.add_dependency("rake", ">= 0.8.
|
30
|
+
s.add_dependency("rake", ">= 0.8.7")
|
31
31
|
s.add_dependency("ohai")
|
32
32
|
s.add_dependency("systemu")
|
33
33
|
s.add_dependency("fpm", "~> 0.4.6")
|
data/lib/bunchr/version.rb
CHANGED
data/lib/bunchr.rb
CHANGED
@@ -0,0 +1,355 @@
|
|
1
|
+
Bunchr
|
2
|
+
======
|
3
|
+
|
4
|
+
Overview
|
5
|
+
--------
|
6
|
+
|
7
|
+
Bunchr is a Rake/Ruby-based DSL for building and bundling complex software
|
8
|
+
projects into various package formats, ie: RPM, DEB, etc (packaging performed
|
9
|
+
by [fpm](https://github.com/jordansissel/fpm).
|
10
|
+
|
11
|
+
Originally developed to create "omnibus" style packages that include an entire
|
12
|
+
ruby stack along with one or more gems, but useful for general compilation and
|
13
|
+
packaging as well.
|
14
|
+
|
15
|
+
It is typically intended to be used in conjunction with [Vagrant](http://vagrantup.com)
|
16
|
+
but can be used without Vagrant as well.
|
17
|
+
|
18
|
+
History
|
19
|
+
-------
|
20
|
+
|
21
|
+
Bunchr was conceived as a tool to help the [Sensu](https://github.com/sensu)
|
22
|
+
monitoring project find a better way to create packages that would be as
|
23
|
+
easy as possible to deploy on a variety of platforms with minimal friction and
|
24
|
+
with little or no knowledge about the idiosyncrasies of the Ruby universe
|
25
|
+
(version incompatibilities, gem conflicts, etc). This was particularly desirable
|
26
|
+
for Sensu because one of the components is an agent that will be installed
|
27
|
+
on most or all servers in an infrastructure. Thus, the package should be easy
|
28
|
+
to install and should not interfere with any other Ruby apps or scripts on the
|
29
|
+
server.
|
30
|
+
|
31
|
+
About the time the Sensu project was discussing a new packaging approach,
|
32
|
+
[Adam Jacob](http://twitter.com/adamhjk) from [Opscode/Chef](http://opscode.com/) took notice and suggested
|
33
|
+
a slightly different approach that achieved the same goals. The approach was
|
34
|
+
called 'omnibus' and was already in use at Opscode to produce a simple and
|
35
|
+
uniform installer for Chef.
|
36
|
+
|
37
|
+
Opscode was using a Clojure-based tool at the time called [omnibus](https://github.com/opscode/omnibus)
|
38
|
+
and were working on a Ruby-based version of omnibus as well.
|
39
|
+
|
40
|
+
However, the Ruby based Omnibus was not available at the time, so Bunchr was
|
41
|
+
created and it re-implements many of the concepts of the Clojure-based Omnibus
|
42
|
+
but on top of Ruby / Rake with a few differences.
|
43
|
+
|
44
|
+
Installation
|
45
|
+
------------
|
46
|
+
|
47
|
+
```
|
48
|
+
gem install bunchr
|
49
|
+
```
|
50
|
+
|
51
|
+
Usage
|
52
|
+
-----
|
53
|
+
|
54
|
+
The simplest workflow is:
|
55
|
+
|
56
|
+
1. Create a `Rakefile`
|
57
|
+
2. Define 1 or more `Bunchr::Software` objects
|
58
|
+
3. Define 1 `Bunchr::Packages` object.
|
59
|
+
4. run `rake`
|
60
|
+
5. receive new packages (.rpm or .deb, depending on platform) !
|
61
|
+
|
62
|
+
For details on the DSL and examples, continue reading.
|
63
|
+
|
64
|
+
DSL Overview
|
65
|
+
------------
|
66
|
+
|
67
|
+
A typical Bunchr project is comprised of one or more `Bunchr::Software` objects
|
68
|
+
and a single `Bunchr::Packages` object. Define these all in a single `Rakefile` or
|
69
|
+
separate them into files for readability and re-use.
|
70
|
+
|
71
|
+
`Software` objects are responsible for downloading, building, and installing
|
72
|
+
a single software component, such as `zlib` or `ruby`. `Software` objects
|
73
|
+
support platform-specific compilation options by making Ohai data available
|
74
|
+
for decision making.
|
75
|
+
|
76
|
+
`Packages` objects are used to combine `Software` objects into a single package.
|
77
|
+
It will automatically try to generate any packages supported by the current
|
78
|
+
platform, for example, RPMs will be built if the platform supports it, DEB
|
79
|
+
will be built if the platform supports it.
|
80
|
+
|
81
|
+
The goal is to be able to use a single code base to build _and_ package a
|
82
|
+
project on multiple platforms.
|
83
|
+
|
84
|
+
Currently supported package types:
|
85
|
+
|
86
|
+
* tar.gz
|
87
|
+
* .deb
|
88
|
+
* .rpm
|
89
|
+
|
90
|
+
### Packages DSL
|
91
|
+
|
92
|
+
A project will typically only contain a single `Bunchr::Packages` object which
|
93
|
+
is essentially a wrapper around `fpm`.
|
94
|
+
|
95
|
+
The Ohai `platform` data will be used to determined what type of packages can be
|
96
|
+
built on the current system. Typically you would run the same Bunchr code on a
|
97
|
+
Debian based box to build the .deb, and a Redhat based box to build the .rpm.
|
98
|
+
Vagrant can help with this.
|
99
|
+
|
100
|
+
Example `Rakefile`:
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
require 'bunchr'
|
104
|
+
|
105
|
+
Bunchr.build_dir = '/tmp/build'
|
106
|
+
Bunchr.install_dir = '/opt/sensu'
|
107
|
+
|
108
|
+
Bunchr.load_recipes Dir['recipes/**/*.rake']
|
109
|
+
|
110
|
+
Bunchr::Packages.new do |t|
|
111
|
+
t.name = 'sensu'
|
112
|
+
t.version = ENV['SENSU_VERSION'] || '0.9.5'
|
113
|
+
t.iteration = ENV['BUILD_NUMBER'] || '1'
|
114
|
+
|
115
|
+
t.category = 'Monitoring'
|
116
|
+
t.license = 'MIT License'
|
117
|
+
t.vendor = 'Sonian Inc.'
|
118
|
+
t.url = 'https://github.com/sonian/sensu'
|
119
|
+
t.description = 'A monitoring framework that aims to be simple, malleable, and scalable. Publish/subscribe model.'
|
120
|
+
|
121
|
+
case t.ohai.platform_family
|
122
|
+
when 'debian'
|
123
|
+
t.scripts[:after_install] = 'pkg_scripts/deb/postinst'
|
124
|
+
t.scripts[:before_remove] = 'pkg_scripts/deb/prerm'
|
125
|
+
t.scripts[:after_remove] = 'pkg_scripts/deb/postrm'
|
126
|
+
when 'rhel', 'fedora'
|
127
|
+
t.scripts[:before_install] = 'pkg_scripts/rpm/pre'
|
128
|
+
t.scripts[:after_install] = 'pkg_scripts/rpm/post'
|
129
|
+
t.scripts[:before_remove] = 'pkg_scripts/rpm/preun'
|
130
|
+
end
|
131
|
+
|
132
|
+
t.include_software('ruby')
|
133
|
+
t.include_software('sensu')
|
134
|
+
t.include_software('sensu_dashboard')
|
135
|
+
t.include_software('sensu_configs')
|
136
|
+
t.include_software('sensu_bin_stubs')
|
137
|
+
|
138
|
+
t.files << Bunchr.install_dir # /opt/sensu
|
139
|
+
t.files << '/usr/share/sensu'
|
140
|
+
t.files << '/var/log/sensu'
|
141
|
+
|
142
|
+
t.files << '/etc/init.d/sensu-api'
|
143
|
+
t.files << '/etc/init.d/sensu-client'
|
144
|
+
t.files << '/etc/init.d/sensu-server'
|
145
|
+
t.files << '/etc/init.d/sensu-dashboard'
|
146
|
+
|
147
|
+
# need to enumerate config files for fpm
|
148
|
+
# these are installed from recipe/sensu_configs.rake
|
149
|
+
t.config_files << "/etc/sensu/handlers/default"
|
150
|
+
t.config_files << "/etc/sensu/conf.d/client.json"
|
151
|
+
t.config_files << "/etc/sensu/conf.d/checks.json"
|
152
|
+
t.config_files << "/etc/sensu/conf.d/handlers.json"
|
153
|
+
t.config_files << "/etc/sensu/config.json"
|
154
|
+
|
155
|
+
t.config_files << '/etc/logrotate.d/sensu'
|
156
|
+
end
|
157
|
+
|
158
|
+
# default task executed when `rake` is run with no args.
|
159
|
+
task :default => ['packages:sensu']
|
160
|
+
```
|
161
|
+
|
162
|
+
Let's break it all down:
|
163
|
+
|
164
|
+
* `Bunchr.build_dir` - Required. This variable is available to all
|
165
|
+
`Bunchr::Software` recipes specifying a temporary directory used for
|
166
|
+
downloading and compiling.
|
167
|
+
|
168
|
+
* `Bunchr.install_dir` - Required. This variable is available to all
|
169
|
+
`Bunchr::Software` recipes. It will typically be the base directory
|
170
|
+
where all software is installed.
|
171
|
+
|
172
|
+
The following variables are used to drive `fpm` when building packages:
|
173
|
+
|
174
|
+
* `t.name`, `t.version`, `t.iteration` - Required.
|
175
|
+
Used by `fpm` to construct the package names, ie:
|
176
|
+
`name-version-iteration-arch.rpm`
|
177
|
+
|
178
|
+
* `t.arch` - Optional. Can be used to override the default detected
|
179
|
+
architecture, eg: `all` or `noarch`.
|
180
|
+
|
181
|
+
* `t.category`, `t.license`, `t.vendor`, `t.url`, `t.description` -
|
182
|
+
Optional. Package metadata.
|
183
|
+
|
184
|
+
* `t.include_software(name)` - Optional. This is used to tell Bunchr what
|
185
|
+
`Software` components should be built and installed before creating
|
186
|
+
packages.
|
187
|
+
|
188
|
+
* `t.scripts` - Optional. A hash with keys: `:after_install`, `:before_install`,
|
189
|
+
`:after_remove`, and `:before_remove`. The specified files will be included
|
190
|
+
with the packages.
|
191
|
+
|
192
|
+
* `t.files` - Required. An array of files and directories to include.
|
193
|
+
|
194
|
+
* `t.config_files` - Optional. An array of files that will be marked as
|
195
|
+
configuration files (if supported by the underlying package type).
|
196
|
+
Config_files are automatically added to the `t.files` array.
|
197
|
+
|
198
|
+
NOTE: you must specify individual files, not directories.
|
199
|
+
|
200
|
+
All tasks created by a `Bunchr::Packages` object are prefixed into the
|
201
|
+
`packages:` namespace. To see the generated tasks:
|
202
|
+
|
203
|
+
```
|
204
|
+
$ rake -T packages
|
205
|
+
rake packages:sensu # Create bunchr packages for sensu 0.9.5-1
|
206
|
+
rake packages:sensu:build # Build all packages: sensu-0.9.5-1-x86_64
|
207
|
+
rake packages:sensu:build_deb # Build deb: sensu-0.9.5-1-x86_64
|
208
|
+
rake packages:sensu:build_rpm # Build RPM: sensu-0.9.5-1-x86_64
|
209
|
+
rake packages:sensu:build_tarball # Build tarball: sensu-0.9.5-1-x86_64.tar.gz
|
210
|
+
```
|
211
|
+
|
212
|
+
The main task is `packages:#{name}`. Exec this task to create all relevant
|
213
|
+
packages.
|
214
|
+
|
215
|
+
|
216
|
+
### Software DSL
|
217
|
+
|
218
|
+
* Example software recipes: https://github.com/joemiller/bunchr/tree/master/example_recipes
|
219
|
+
|
220
|
+
Example recipe for building and installing `ruby`:
|
221
|
+
|
222
|
+
```ruby
|
223
|
+
Bunchr::Software.new do |t|
|
224
|
+
t.name = 'ruby'
|
225
|
+
t.version = '1.9.3-p125'
|
226
|
+
|
227
|
+
t.depends_on('autoconf')
|
228
|
+
t.depends_on('zlib')
|
229
|
+
t.depends_on('openssl')
|
230
|
+
t.depends_on('libyaml')
|
231
|
+
|
232
|
+
install_prefix = "#{Bunchr.install_dir}/embedded"
|
233
|
+
|
234
|
+
os = t.ohai['os']
|
235
|
+
arch = t.ohai['kernel']['machine']
|
236
|
+
|
237
|
+
t.download_commands << "curl -O http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p125.tar.gz"
|
238
|
+
t.download_commands << "tar xfvz ruby-1.9.3-p125.tar.gz"
|
239
|
+
|
240
|
+
if os == 'darwin' && arch == 'x86_64'
|
241
|
+
t.build_environment['LDFLAGS'] = "-arch x86_64 -R#{install_prefix}/lib -L#{install_prefix}/lib -I#{install_prefix}/include"
|
242
|
+
t.build_environment['CFLAGS'] = "-arch x86_64 -m64 -L#{install_prefix}/lib -I#{install_prefix}/include"
|
243
|
+
elsif os == 'linux'
|
244
|
+
t.build_environment['LDFLAGS'] = "-Wl,-rpath #{install_prefix}/lib -L#{install_prefix}/lib -I#{install_prefix}/include"
|
245
|
+
t.build_environment['CFLAGS'] = "-L#{install_prefix}/lib -I#{install_prefix}/include"
|
246
|
+
elsif os == 'solaris2'
|
247
|
+
t.build_environment['LDFLAGS'] = "-R#{install_prefix}/lib -L#{install_prefix}/lib -I#{install_prefix}/include"
|
248
|
+
t.build_environment['CFLAGS'] = "-L#{install_prefix}/lib -I#{install_prefix}/include"
|
249
|
+
end
|
250
|
+
|
251
|
+
t.build_commands << "./configure --prefix=#{install_prefix} \
|
252
|
+
--with-opt-dir=#{install_prefix} \
|
253
|
+
--enable-shared \
|
254
|
+
--disable-install-doc"
|
255
|
+
t.build_commands << "make"
|
256
|
+
|
257
|
+
t.install_commands << "make install"
|
258
|
+
|
259
|
+
CLEAN << install_prefix
|
260
|
+
end
|
261
|
+
```
|
262
|
+
|
263
|
+
* `t.name` - Required. Name of the software component.
|
264
|
+
|
265
|
+
* `t.version` - Optional. Version of the software component.
|
266
|
+
|
267
|
+
* `t.depends_on(name)` - Optional. This is used to tell Bunchr that other
|
268
|
+
`Software` components should be built before this one.
|
269
|
+
|
270
|
+
* `t.ohai` - This provides access to the `Bunchr::Ohai` object which contains
|
271
|
+
Ohai data about the system. By default, only the `platform` and `os` plugins
|
272
|
+
are loaded. Since you have direct access to the Ohai object, other plugins
|
273
|
+
can be loaded by calling `t.ohai.require_plugin`
|
274
|
+
|
275
|
+
* `t.download_commands` - An array of shell commands used to download and
|
276
|
+
uncompress the source. You could also do a `git clone ..` here. These commands
|
277
|
+
are executed in the `download_dir` which is `#{Bunchr.build_dir}/#{t.name}`.
|
278
|
+
The `download_dir` cannot be changed.
|
279
|
+
|
280
|
+
* `t.build_commands` - An array of shell commands used to compile the downloaded
|
281
|
+
source. These commands are executed in the directory defined by
|
282
|
+
`t.work_dir` which will be automatically determined from:
|
283
|
+
1) `#{download_dir}/#{t.name}-#{t.version}` (common for most tarballs), or
|
284
|
+
2) `#{download_dir}/#{t.name}` (if no `t.version` set), or
|
285
|
+
3) explicitly set by calling `t.work_dir = '/some/absolute/path'`
|
286
|
+
|
287
|
+
* `t.install_commands` - An array of shell commands used to download and
|
288
|
+
uncompress the source. You could also do a `git clone ..` here. These commands
|
289
|
+
are executed in `t.work_dir` directory.
|
290
|
+
|
291
|
+
* `CLEAN` - Optional. This is an array of files and directories that should be deleted
|
292
|
+
when `rake clean` is executed.
|
293
|
+
|
294
|
+
`download_commands`, `build_commands`, and `install_commands` are all optional,
|
295
|
+
but unless one of them contains some commands your `Software` object won't be
|
296
|
+
doing anything useful.
|
297
|
+
|
298
|
+
If any of `download_commands`, `build_commands`, or `install_commands` exit
|
299
|
+
with a non-zero status, the entire Bunchr process will stop
|
300
|
+
and print any STDOUT or STDERR from the failed command to the Logger.
|
301
|
+
|
302
|
+
Bunchr will keep track of what has succeeded so that you can restart a failed
|
303
|
+
build after fixing an error. This can save quite a bit of time during package
|
304
|
+
development, but you should consider doing a full `rake clean` before building
|
305
|
+
any official packages.
|
306
|
+
|
307
|
+
|
308
|
+
All tasks created by a `Bunchr::Software` object are prefixed into the
|
309
|
+
`software:` namespace. To see the generated tasks:
|
310
|
+
|
311
|
+
```
|
312
|
+
$ rake -T software:ruby
|
313
|
+
rake software:ruby # Download, build, and install ruby 1.9.3-p125
|
314
|
+
rake software:ruby:build # Build ruby 1.9.3-p125
|
315
|
+
rake software:ruby:download # Download ruby 1.9.3-p125
|
316
|
+
rake software:ruby:install # Install ruby 1.9.3-p125
|
317
|
+
```
|
318
|
+
|
319
|
+
`Software` recipes can be defined directly in the Rakefile or they can
|
320
|
+
be separated into individual files and loaded via `Bunchr.load_recipes(files)`.
|
321
|
+
|
322
|
+
|
323
|
+
Integration with Vagrant
|
324
|
+
------------------------
|
325
|
+
|
326
|
+
* TODO. maybe link to sensu-bunchr here.
|
327
|
+
|
328
|
+
Other Examples
|
329
|
+
--------------
|
330
|
+
|
331
|
+
* TODO. maybe link to sensu-bunchr here, or a complete example of fpm
|
332
|
+
|
333
|
+
Author
|
334
|
+
------
|
335
|
+
|
336
|
+
* [Joe Miller](https://twitter.com/miller_joe) - http://joemiller.me / https://github.com/joemiller
|
337
|
+
|
338
|
+
License
|
339
|
+
-------
|
340
|
+
|
341
|
+
Author:: Joe Miller (<joeym@joeym.net>)
|
342
|
+
Copyright:: Copyright (c) 2012 Joe Miller
|
343
|
+
License:: Apache License, Version 2.0
|
344
|
+
|
345
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
346
|
+
you may not use this file except in compliance with the License.
|
347
|
+
You may obtain a copy of the License at
|
348
|
+
|
349
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
350
|
+
|
351
|
+
Unless required by applicable law or agreed to in writing, software
|
352
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
353
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
354
|
+
See the License for the specific language governing permissions and
|
355
|
+
limitations under the License.
|