vulcan 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/bin/vulcan ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "net/http/post/multipart"
4
+ require "tmpdir"
5
+ require "uri"
6
+ require "vulcan/cli"
7
+
8
+ Vulcan::CLI.start
9
+
data/lib/vulcan/cli.rb ADDED
@@ -0,0 +1,164 @@
1
+ require "digest/sha1"
2
+ require "net/http/post/multipart"
3
+ require "rest_client"
4
+ require "thor"
5
+ require "tmpdir"
6
+ require "uri"
7
+ require "vulcan"
8
+ require "yaml"
9
+
10
+ class Vulcan::CLI < Thor
11
+
12
+ desc "build [COMMAND]", <<-DESC
13
+ build a piece of software for the heroku cloud using COMMANd as a build command
14
+ if no COMMAND is specified, a sensible default will be chosen for you
15
+
16
+ DESC
17
+
18
+ method_option :command, :aliases => "-c", :desc => "the command to run for compilation"
19
+ method_option :name, :aliases => "-n", :desc => "the name of the library (defaults ot the directory name)"
20
+ method_option :output, :aliases => "-o", :desc => "output build artifacts to this file"
21
+ method_option :prefix, :aliases => "-p", :desc => "the build/install --prefix of the software"
22
+ method_option :source, :aliases => "-s", :desc => "the source directory to build from"
23
+ method_option :verbose, :aliases => "-v", :desc => "show the full build output", :type => :boolean
24
+
25
+ def build
26
+ app = read_config[:app] || "need a server first, use vulcan create"
27
+
28
+ command = options[:command] || "./configure --prefix #{prefix} && make install"
29
+ name = options[:name] || File.basename(Dir.pwd)
30
+ output = options[:output] || "/tmp/#{name}.tgz"
31
+ prefix = options[:prefix] || "/app/vendor/#{name}"
32
+ source = options[:source] || Dir.pwd
33
+ server = URI.parse(ENV["MAKE_SERVER"] || "http://#{app}.herokuapp.com")
34
+
35
+ Dir.mktmpdir do |dir|
36
+ puts ">> Packaging local directory"
37
+ %x{ cd #{source} && tar czvf #{dir}/input.tgz . 2>&1 }
38
+
39
+ puts ">> Uploading code for build"
40
+ File.open("#{dir}/input.tgz", "r") do |input|
41
+ request = Net::HTTP::Post::Multipart.new "/make",
42
+ "code" => UploadIO.new(input, "application/octet-stream", "input.tgz"),
43
+ "command" => command,
44
+ "prefix" => prefix
45
+
46
+ puts ">> Building with: #{command}"
47
+ response = Net::HTTP.start(server.host, server.port) do |http|
48
+ http.request(request) do |response|
49
+ response.read_body do |chunk|
50
+ print chunk if options[:verbose]
51
+ end
52
+ end
53
+ end
54
+
55
+ error "Unknown error, no build output given" unless response["X-Make-Id"]
56
+
57
+ puts ">> Downloading build artifacts to: #{output}"
58
+
59
+ File.open(output, "w") do |output|
60
+ begin
61
+ output.print RestClient.get("#{server}/output/#{response["X-Make-Id"]}")
62
+ rescue Exception => ex
63
+ puts ex.inspect
64
+ end
65
+ end
66
+ end
67
+ end
68
+ rescue Errno::EPIPE
69
+ error "Could not connect to build server: #{server}"
70
+ end
71
+
72
+ desc "create APP_NAME", <<-DESC
73
+ create a build server on Heroku
74
+
75
+ DESC
76
+
77
+ def create(name)
78
+ secret = Digest::SHA1.hexdigest("--#{rand(10000)}--#{Time.now}--")
79
+
80
+ Dir.mktmpdir do |dir|
81
+ Dir.chdir(dir) do
82
+ system "env BUNDLE_GEMFILE= heroku create #{name} -s cedar"
83
+ end
84
+ end
85
+ write_config :ap=> name, :host => "#{name}.herokuapp.com", :secret => secret
86
+ update
87
+ end
88
+
89
+
90
+ desc "update", <<-DESC
91
+ update the build server
92
+
93
+ DESC
94
+
95
+ def update
96
+ error "no apyet, create first" unless config[:app]
97
+
98
+ FileUtils.mkdir_p File.expand_path("~/.heroku/plugins/heroku-credentials")
99
+
100
+ File.open(File.expand_path("~/.heroku/plugins/heroku-credentials/init.rb"), "w") do |file|
101
+ file.puts <<-CONTENTS
102
+ class Heroku::Command::Credentials < Heroku::Command::Base
103
+ def index
104
+ puts Heroku::Auth.password
105
+ end
106
+ end
107
+ CONTENTS
108
+ end
109
+
110
+ Dir.mktmpdir do |dir|
111
+ Dir.chdir(dir) do
112
+ api_key = %x{ env BUNDLE_GEMFILE= heroku credentials }
113
+
114
+ system "git init"
115
+ system "git remote add heroku git@heroku.com:#{config[:app]}.git"
116
+ FileUtils.cp_r "#{server_path}/.", "."
117
+ File.open(".gitignore", "w") do |file|
118
+ file.puts ".env"
119
+ file.puts "node_modules"
120
+ end
121
+ system "ls -la"
122
+ system "git add ."
123
+ system "git commit -m commit"
124
+ system "git push heroku -f master"
125
+
126
+ %x{ env BUNDLE_GEMFILE= heroku config:add SECRET=#{config[:secret]} SPAWN_ENV=heroku HEROKU_APP=#{config[:app]} HEROKU_API_KEY=#{api_key} 2>&1 }
127
+ %x{ env BUNDLE_GEMFILE= heroku addons:add cloudant:oxygen }
128
+ end
129
+ end
130
+ end
131
+
132
+ private
133
+
134
+ def config_file
135
+ File.expand_path("~/.vulcan")
136
+ end
137
+
138
+ def config
139
+ read_config
140
+ end
141
+
142
+ def read_config
143
+ return {} unless File.exists?(config_file)
144
+ config = YAML.load_file(config_file)
145
+ config.is_a?(Hash) ? config : {}
146
+ end
147
+
148
+ def write_config(config)
149
+ full_config = read_config.merge(config)
150
+ File.open(config_file, "w") do |file|
151
+ file.puts YAML.dump(full_config)
152
+ end
153
+ end
154
+
155
+ def error(message)
156
+ puts "!! #{message}"
157
+ exit 1
158
+ end
159
+
160
+ def server_path
161
+ File.expand_path("../../../server", __FILE__)
162
+ end
163
+
164
+ end
@@ -0,0 +1,5 @@
1
+ module Vulcan
2
+
3
+ VERSION = "0.0.1"
4
+
5
+ end
data/lib/vulcan.rb ADDED
@@ -0,0 +1,2 @@
1
+ module Vulcan
2
+ end
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vulcan
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - David Dollar
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: multipart-post
16
+ requirement: &70228915628200 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.1.3
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70228915628200
25
+ - !ruby/object:Gem::Dependency
26
+ name: rest-client
27
+ requirement: &70228915627580 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 1.6.7
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70228915627580
36
+ - !ruby/object:Gem::Dependency
37
+ name: thor
38
+ requirement: &70228915626880 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 0.14.6
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70228915626880
47
+ description: Build software in the cloud
48
+ email: ddollar@gmail.com
49
+ executables:
50
+ - vulcan
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - bin/vulcan
55
+ - lib/vulcan/cli.rb
56
+ - lib/vulcan/version.rb
57
+ - lib/vulcan.rb
58
+ homepage: http://vulcan.com/
59
+ licenses: []
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubyforge_project:
78
+ rubygems_version: 1.8.10
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: Build software in the cloud
82
+ test_files: []