vulcan 0.4.0 → 0.5.0
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 +80 -1
- data/lib/vulcan/cli.rb +4 -1
- data/lib/vulcan/version.rb +1 -1
- data/server/bin/make +33 -1
- data/server/package.json +8 -8
- data/server/web.js +10 -10
- metadata +10 -10
data/README.md
CHANGED
@@ -1 +1,80 @@
|
|
1
|
-
|
1
|
+
# Vulcan
|
2
|
+
|
3
|
+
A build server in the cloud.
|
4
|
+
|
5
|
+
## Usage
|
6
|
+
|
7
|
+
$ vulcan help
|
8
|
+
Tasks:
|
9
|
+
vulcan build # build a piece of software for the heroku cloud using COMMAND as a build command if no COMMAND is...
|
10
|
+
vulcan create APP_NAME # create a build server on Heroku
|
11
|
+
vulcan help [TASK] # Describe available tasks or one specific task
|
12
|
+
vulcan update # update the build server
|
13
|
+
|
14
|
+
$ vulcan help build
|
15
|
+
Usage:
|
16
|
+
vulcan build
|
17
|
+
|
18
|
+
Options:
|
19
|
+
-c, [--command=COMMAND] # the command to run for compilation
|
20
|
+
-n, [--name=NAME] # the name of the library (defaults ot the directory name)
|
21
|
+
-o, [--output=OUTPUT] # output build artifacts to this file
|
22
|
+
-p, [--prefix=PREFIX] # the build/install --prefix of the software
|
23
|
+
-s, [--source=SOURCE] # the source directory to build from
|
24
|
+
-v, [--verbose] # show the full build output
|
25
|
+
|
26
|
+
build a piece of software for the heroku cloud using COMMAND as a build command
|
27
|
+
if no COMMAND is specified, a sensible default will be chosen for you
|
28
|
+
|
29
|
+
## Examples
|
30
|
+
|
31
|
+
### Create a Build Server
|
32
|
+
|
33
|
+
$ vulcan create vulcan-david
|
34
|
+
Creating vulcan-david... done, stack is cedar
|
35
|
+
http://vulcan-david.herokuapp.com/ | git@heroku.com:vulcan-david.git
|
36
|
+
...
|
37
|
+
|
38
|
+
### Build
|
39
|
+
|
40
|
+
$ vulcan build -s ~/Code/memcached -p /tmp/memcached -c "./autogen.sh && ./configure --prefix=/tmp/memcached && make install"
|
41
|
+
>> Packaging local directory
|
42
|
+
>> Uploading code for build
|
43
|
+
>> Building with: ./autogen.sh && ./configure --prefix=/tmp/memcached && make install
|
44
|
+
>> Downloading build artifacts to: /tmp/memcached.tgz
|
45
|
+
|
46
|
+
$ tar tvf /tmp/memcached.tgz
|
47
|
+
drwx------ 0 u24714 24714 0 Sep 21 20:25 bin/
|
48
|
+
-rwxr-xr-x 0 u24714 24714 273082 Sep 21 20:25 bin/memcached
|
49
|
+
drwx------ 0 u24714 24714 0 Sep 21 20:25 include/
|
50
|
+
drwx------ 0 u24714 24714 0 Sep 21 20:25 include/memcached/
|
51
|
+
-rw-r--r-- 0 u24714 24714 14855 Sep 21 20:25 include/memcached/protocol_binary.h
|
52
|
+
drwx------ 0 u24714 24714 0 Sep 21 20:25 share/
|
53
|
+
drwx------ 0 u24714 24714 0 Sep 21 20:25 share/man/
|
54
|
+
drwx------ 0 u24714 24714 0 Sep 21 20:25 share/man/man1/
|
55
|
+
-rw-r--r-- 0 u24714 24714 5304 Sep 21 20:25 share/man/man1/memcached.1
|
56
|
+
|
57
|
+
### Keep the Build Server Updated
|
58
|
+
|
59
|
+
$ vulcan update
|
60
|
+
Initialized empty Git repository in /private/var/folders/rm/qksq9jk15vx0xcjxkqc8yg5w0000gn/T/d20110921-70016-1iksqwy/.git/
|
61
|
+
Counting objects: 176, done.
|
62
|
+
Delta compression using up to 8 threads.
|
63
|
+
Compressing objects: 100% (156/156), done.
|
64
|
+
Writing objects: 100% (176/176), 326.86 KiB, done.
|
65
|
+
Total 176 (delta 5), reused 0 (delta 0)
|
66
|
+
|
67
|
+
-----> Heroku receiving push
|
68
|
+
-----> Node.js app detected
|
69
|
+
-----> Vendoring node 0.4.7
|
70
|
+
-----> Installing dependencies with npm 1.0.27
|
71
|
+
|
72
|
+
Dependencies installed
|
73
|
+
-----> Discovering process types
|
74
|
+
Procfile declares types -> web
|
75
|
+
-----> Compiled slug size is 5.5MB
|
76
|
+
-----> Launching... done, v5
|
77
|
+
http://vulcan-david.herokuapp.com deployed to Heroku
|
78
|
+
|
79
|
+
To git@heroku.com:vulcan-david.git
|
80
|
+
+ 2e69a42...eddcb91 master -> master (forced update)
|
data/lib/vulcan/cli.rb
CHANGED
@@ -25,6 +25,7 @@ if no COMMAND is specified, a sensible default will be chosen for you
|
|
25
25
|
method_option :output, :aliases => "-o", :desc => "output build artifacts to this file"
|
26
26
|
method_option :prefix, :aliases => "-p", :desc => "the build/install --prefix of the software"
|
27
27
|
method_option :source, :aliases => "-s", :desc => "the source directory to build from"
|
28
|
+
method_option :deps, :aliases => "-d", :desc => "other vulcan compiled libraries to build with"
|
28
29
|
method_option :verbose, :aliases => "-v", :desc => "show the full build output", :type => :boolean
|
29
30
|
|
30
31
|
def build
|
@@ -35,6 +36,7 @@ if no COMMAND is specified, a sensible default will be chosen for you
|
|
35
36
|
output = options[:output] || "/tmp/#{name}.tgz"
|
36
37
|
prefix = options[:prefix] || "/app/vendor/#{name}"
|
37
38
|
command = options[:command] || "./configure --prefix #{prefix} && make install"
|
39
|
+
deps = options[:deps] || ""
|
38
40
|
server = URI.parse(ENV["MAKE_SERVER"] || "http://#{app}.herokuapp.com")
|
39
41
|
|
40
42
|
Dir.mktmpdir do |dir|
|
@@ -47,7 +49,8 @@ if no COMMAND is specified, a sensible default will be chosen for you
|
|
47
49
|
"code" => UploadIO.new(input, "application/octet-stream", "input.tgz"),
|
48
50
|
"command" => command,
|
49
51
|
"prefix" => prefix,
|
50
|
-
"secret" => config[:secret]
|
52
|
+
"secret" => config[:secret],
|
53
|
+
"deps" => deps
|
51
54
|
|
52
55
|
puts ">> Building with: #{command}"
|
53
56
|
response = Net::HTTP.start(server.host, server.port) do |http|
|
data/lib/vulcan/version.rb
CHANGED
data/server/bin/make
CHANGED
@@ -10,7 +10,8 @@ id = ARGV.shift
|
|
10
10
|
require "couchrest"
|
11
11
|
require "fileutils"
|
12
12
|
require "tmpdir"
|
13
|
-
|
13
|
+
require "rest_client"
|
14
|
+
|
14
15
|
db = CouchRest.database!(ENV["CLOUDANT_URL"] + "/make")
|
15
16
|
|
16
17
|
Dir.mktmpdir do |dir|
|
@@ -19,11 +20,42 @@ Dir.mktmpdir do |dir|
|
|
19
20
|
|
20
21
|
command = doc["command"]
|
21
22
|
prefix = doc["prefix"]
|
23
|
+
deps = doc["deps"] || ""
|
22
24
|
|
23
25
|
File.open("input.tgz", "wb") do |file|
|
24
26
|
file.print doc.fetch_attachment("input")
|
25
27
|
end
|
26
28
|
|
29
|
+
deps.split(",").each_with_index do |dep, index|
|
30
|
+
puts "downloading #{dep}"
|
31
|
+
File.open("dep_#{index}.tgz", "wb") do |file|
|
32
|
+
begin
|
33
|
+
file.print RestClient.get(dep)
|
34
|
+
rescue Exception => ex
|
35
|
+
puts ex.inspect
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
FileUtils.mkdir_p "deps"
|
41
|
+
|
42
|
+
Dir.chdir("deps") do
|
43
|
+
deps.split(",").each_with_index do |dep, index|
|
44
|
+
%x{ tar xzf ../dep_#{index}.tgz 2>&1 }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
unless deps.empty?
|
49
|
+
ENV["LDFLAGS"] ||= ""
|
50
|
+
ENV["LDFLAGS"] += " -L%s/deps/lib" % dir
|
51
|
+
|
52
|
+
ENV["CFLAGS"] ||= ""
|
53
|
+
ENV["CFLAGS"] += " -I%s/deps/include" % dir
|
54
|
+
|
55
|
+
ENV["CXXFLAGS"] ||= ""
|
56
|
+
ENV["CXXFLAGS"] += " -I%s/deps/include" % dir
|
57
|
+
end
|
58
|
+
|
27
59
|
FileUtils.mkdir_p "input"
|
28
60
|
|
29
61
|
Dir.chdir("input") do
|
data/server/package.json
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
{
|
2
2
|
"name": "heroku-make",
|
3
3
|
"version": "0.0.1",
|
4
|
-
"dependencies":
|
5
|
-
"connect-form",
|
6
|
-
"cradle",
|
7
|
-
"express",
|
8
|
-
"knox",
|
9
|
-
"node-uuid",
|
10
|
-
"restler"
|
11
|
-
|
4
|
+
"dependencies": {
|
5
|
+
"connect-form": "0.2.x",
|
6
|
+
"cradle": "0.6.x",
|
7
|
+
"express": "2.x.x",
|
8
|
+
"knox": "0.0.x",
|
9
|
+
"node-uuid": "1.x.x",
|
10
|
+
"restler": "2.x.x"
|
11
|
+
},
|
12
12
|
"engines": {
|
13
13
|
"node": "0.6.x"
|
14
14
|
}
|
data/server/web.js
CHANGED
@@ -26,7 +26,7 @@ var couchdb_options = couchdb_url.auth ?
|
|
26
26
|
{ auth: { username: couchdb_url.auth.split(':')[0], password: couchdb_url.auth.split(':')[1] } } :
|
27
27
|
{ }
|
28
28
|
var db = new(cradle.Connection)(couchdb_url.hostname, couchdb_url.port || 5984, couchdb_options).database('make');
|
29
|
-
db.create();
|
29
|
+
db.create(function(){});
|
30
30
|
|
31
31
|
// POST /make starts a build
|
32
32
|
app.post('/make', function(request, response, next) {
|
@@ -53,20 +53,20 @@ app.post('/make', function(request, response, next) {
|
|
53
53
|
var id = uuid();
|
54
54
|
var command = fields.command;
|
55
55
|
var prefix = fields.prefix;
|
56
|
+
var deps = fields.deps;
|
56
57
|
|
57
58
|
// create a couchdb documents for this build
|
58
59
|
log_action(id, 'saving to couchdb');
|
59
|
-
db.save(id, { command:command, prefix:prefix }, function(err, doc) {
|
60
|
+
db.save(id, { command:command, prefix:prefix, deps:deps }, function(err, doc) {
|
60
61
|
if (err) { log_error(id, util.inspect(err)); return next(err); }
|
61
62
|
|
62
63
|
// save the input tarball as an attachment
|
63
64
|
log_action(id, 'saving attachment - [id:' + doc.id + ', rev:' + doc.rev + ']')
|
64
|
-
db.saveAttachment(
|
65
|
-
doc.id,
|
66
|
-
|
67
|
-
'input',
|
68
|
-
'application/octet-stream',
|
69
|
-
fs.createReadStream(files.code.path),
|
65
|
+
fs.createReadStream(files.code.path).pipe(db.saveAttachment(
|
66
|
+
{id: doc.id,
|
67
|
+
rev: doc.rev},
|
68
|
+
{name:'input',
|
69
|
+
'Content-Type': 'application/octet-stream'},
|
70
70
|
function(err, data) {
|
71
71
|
if (err) {
|
72
72
|
// work around temporary problem with cloudant and document
|
@@ -99,7 +99,7 @@ app.post('/make', function(request, response, next) {
|
|
99
99
|
response.end();
|
100
100
|
});
|
101
101
|
}
|
102
|
-
);
|
102
|
+
));
|
103
103
|
|
104
104
|
// return the build id as a header
|
105
105
|
response.header('X-Make-Id', id);
|
@@ -114,7 +114,7 @@ app.post('/make', function(request, response, next) {
|
|
114
114
|
app.get('/output/:id', function(request, response, next) {
|
115
115
|
|
116
116
|
// from couchdb
|
117
|
-
var stream = db.getAttachment(request.params.id, 'output');
|
117
|
+
var stream = db.getAttachment(request.params.id, 'output', function(){});
|
118
118
|
|
119
119
|
stream.on('error', function(err) {
|
120
120
|
console.log('download error: ' + err);
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vulcan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-03-
|
12
|
+
date: 2012-03-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: heroku
|
16
|
-
requirement: &
|
16
|
+
requirement: &70318115078740 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 2.20.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70318115078740
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: multipart-post
|
27
|
-
requirement: &
|
27
|
+
requirement: &70318115075980 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.1.3
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70318115075980
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rest-client
|
38
|
-
requirement: &
|
38
|
+
requirement: &70318115073940 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.6.7
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70318115073940
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: thor
|
49
|
-
requirement: &
|
49
|
+
requirement: &70318115072520 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: 0.14.6
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70318115072520
|
58
58
|
description: Build software in the cloud
|
59
59
|
email: ddollar@gmail.com
|
60
60
|
executables:
|