Compare commits

...
25 Commits
Author SHA1 Message Date
David Dollar 1485eeb859 0.36.1 2012-01-18 11:18:39 -05:00
David Dollar e0b5928e88 bump term-ansicolor in gemspec 2012-01-18 11:18:33 -05:00
David Dollar a73dce5405 0.36.0 2012-01-17 22:21:36 -05:00
David Dollar 2abddb42b3 sync the writer stream 2012-01-17 22:21:16 -05:00
David Dollar d961a32cfe capture stderr as well 2012-01-17 22:20:25 -05:00
David Dollar 2bfc065c1d update rake 2012-01-16 18:35:06 -05:00
David Dollar fbe3d4ec69 0.35.0 2012-01-16 18:34:36 -05:00
David Dollar 631187e0d8 Merge pull request #132 from Viximo/feature/concurrency
Change default concurrency to 0 when concurrency is provided
2012-01-16 15:13:27 -08:00
Matt Griffin 92d1a4d367 Fix export specs 2012-01-16 17:39:21 -05:00
Matt Griffin f4123f4ae1 Merge branch 'master' of https://github.com/michaeldwan/foreman into feature/concurrency
Conflicts:
	spec/foreman/engine_spec.rb
	spec/foreman/export/bluepill_spec.rb
	spec/resources/export/bluepill/app.pill
2012-01-16 17:18:14 -05:00
David Dollar d4c2332c59 0.34.1 2012-01-16 09:53:56 -05:00
David Dollar e257fc89c1 fix missing start desc 2012-01-16 09:53:43 -05:00
David Dollar a278755ae4 0.34.0 2012-01-16 09:42:07 -05:00
David Dollar 3367a060a7 update man page 2012-01-16 09:41:36 -05:00
David Dollar ac7e0743ac update docs for -d 2012-01-16 09:39:54 -05:00
David Dollar e574880814 Merge pull request #101 from ndbroadbent/foreman
---

I just discovered the LiveReload gem, and wanted to use foreman to help me set up my development environments.

I didnt want to check in my custom development Procfiles, so I needed to alter the behaviour of:

> [The Procfiles] containing directory will be assumed to be the root directory of the application.

Ive set up some shared `Procfiles` for development, such as `Rails3Dev`, `Rails31Dev`, `JekyllDev`, etc.

Then I set up a bash alias for each of these Procfiles, such as:

```bash
alias rd31="foreman start -d . -f ~/dev/procfiles/Rails31Dev"
```

The only thing missing was the `-d` flag.

My `Rails31Dev` file looks like this:

```yaml
compass: compass watch --sass-dir app/assets/stylesheets --css-dir public/assets
livereload: livereload
passenger: passenger start
```

Thanks!

Conflicts:
	lib/foreman/cli.rb
2012-01-16 09:38:25 -05:00
Craig R Webster 7132cacbf6 Wrap around to the first colour when all the colours are used 2012-01-16 09:35:51 -05:00
David Dollar c1f279aa6f run specs in random order 2012-01-16 09:33:34 -05:00
David Dollar 34cfe9ef9d update rspec 2012-01-16 09:33:34 -05:00
David Dollar 79fc3b8029 pedantry 2012-01-16 09:33:34 -05:00
Matthijs Langenberg 91140638e1 Set executable bit on runit run scripts. 2012-01-16 09:33:34 -05:00
David Dollar 48cc60c30f Merge pull request #114 from gburt/master
add more colors
2012-01-16 06:21:28 -08:00
Gabriel Burt 5de1bd18ac add more colors 2011-12-30 13:55:46 -06:00
Nathan Broadbent 8bc8cb4b2e Added option to specify app_root, if executing a Procfile from a shared location 2011-12-03 15:16:06 +08:00
Michael Dwan 33aa1efc90 default process concurrency is 0 when concurrency options specified, otherwise default concurrency is 1 2011-11-07 13:10:18 -07:00
18 changed files with 119 additions and 55 deletions
+1 -1
View File
@@ -9,7 +9,7 @@ group :development do
gem 'fakefs', '~> 0.3.2' gem 'fakefs', '~> 0.3.2'
gem 'rcov', '~> 0.9.8' gem 'rcov', '~> 0.9.8'
gem 'rr', '~> 1.0.2' gem 'rr', '~> 1.0.2'
gem 'rspec', '~> 2.6.0' gem 'rspec', '~> 2.0'
gem 'aws-s3' gem 'aws-s3'
gem "rubyzip" gem "rubyzip"
end end
+12 -12
View File
@@ -1,8 +1,8 @@
PATH PATH
remote: . remote: .
specs: specs:
foreman (0.33.1) foreman (0.36.1)
term-ansicolor (~> 1.0.5) term-ansicolor (~> 1.0.7)
thor (>= 0.13.6) thor (>= 0.13.6)
GEM GEM
@@ -14,7 +14,7 @@ GEM
xml-simple xml-simple
builder (3.0.0) builder (3.0.0)
crack (0.1.8) crack (0.1.8)
diff-lcs (1.1.2) diff-lcs (1.1.3)
fakefs (0.3.2) fakefs (0.3.2)
hpricot (0.8.2) hpricot (0.8.2)
mime-types (1.16) mime-types (1.16)
@@ -23,7 +23,7 @@ GEM
crack crack
rest-client rest-client
thor thor
rake (0.9.2) rake (0.9.2.2)
rcov (0.9.8) rcov (0.9.8)
rdiscount (1.6.5) rdiscount (1.6.5)
rest-client (1.6.1) rest-client (1.6.1)
@@ -33,14 +33,14 @@ GEM
mustache (>= 0.7.0) mustache (>= 0.7.0)
rdiscount (>= 1.5.8) rdiscount (>= 1.5.8)
rr (1.0.2) rr (1.0.2)
rspec (2.6.0) rspec (2.8.0)
rspec-core (~> 2.6.0) rspec-core (~> 2.8.0)
rspec-expectations (~> 2.6.0) rspec-expectations (~> 2.8.0)
rspec-mocks (~> 2.6.0) rspec-mocks (~> 2.8.0)
rspec-core (2.6.4) rspec-core (2.8.0)
rspec-expectations (2.6.0) rspec-expectations (2.8.0)
diff-lcs (~> 1.1.2) diff-lcs (~> 1.1.2)
rspec-mocks (2.6.0) rspec-mocks (2.8.0)
rubyzip (0.9.4) rubyzip (0.9.4)
term-ansicolor (1.0.7) term-ansicolor (1.0.7)
thor (0.14.6) thor (0.14.6)
@@ -58,5 +58,5 @@ DEPENDENCIES
rcov (~> 0.9.8) rcov (~> 0.9.8)
ronn ronn
rr (~> 1.0.2) rr (~> 1.0.2)
rspec (~> 2.6.0) rspec (~> 2.0)
rubyzip rubyzip
+1 -1
View File
@@ -16,6 +16,6 @@ Gem::Specification.new do |gem|
gem.files = Dir["**/*"].select { |d| d =~ %r{^(README|bin/|data/|ext/|lib/|spec/|test/)} } gem.files = Dir["**/*"].select { |d| d =~ %r{^(README|bin/|data/|ext/|lib/|spec/|test/)} }
gem.files << "man/foreman.1" gem.files << "man/foreman.1"
gem.add_dependency 'term-ansicolor', '~> 1.0.5' gem.add_dependency 'term-ansicolor', '~> 1.0.7'
gem.add_dependency 'thor', '>= 0.13.6' gem.add_dependency 'thor', '>= 0.13.6'
end end
+3 -2
View File
@@ -6,10 +6,11 @@ require "yaml"
class Foreman::CLI < Thor class Foreman::CLI < Thor
class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: Procfile"
desc "start", "Start the application" desc "start", "Start the application"
class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: Procfile"
class_option :app_root, :type => :string, :aliases => "-d", :desc => "Default: Procfile directory"
method_option :env, :type => :string, :aliases => "-e", :desc => "Specify an environment file to load, defaults to .env" method_option :env, :type => :string, :aliases => "-e", :desc => "Specify an environment file to load, defaults to .env"
method_option :port, :type => :numeric, :aliases => "-p" method_option :port, :type => :numeric, :aliases => "-p"
method_option :concurrency, :type => :string, :aliases => "-c", :banner => '"alpha=5,bar=3"' method_option :concurrency, :type => :string, :aliases => "-c", :banner => '"alpha=5,bar=3"'
+6 -3
View File
@@ -17,11 +17,13 @@ class Foreman::Engine
extend Term::ANSIColor extend Term::ANSIColor
COLORS = [ cyan, yellow, green, magenta, red ] COLORS = [ cyan, yellow, green, magenta, red, blue,
intense_cyan, intense_yellow, intense_green, intense_magenta,
intense_red, intense_blue ]
def initialize(procfile, options={}) def initialize(procfile, options={})
@procfile = Foreman::Procfile.new(procfile) @procfile = Foreman::Procfile.new(procfile)
@directory = File.expand_path(File.dirname(procfile)) @directory = options[:app_root] || File.expand_path(File.dirname(procfile))
@options = options @options = options
@environment = read_environment_files(options[:env]) @environment = read_environment_files(options[:env])
@output_mutex = Mutex.new @output_mutex = Mutex.new
@@ -182,7 +184,8 @@ private ######################################################################
def next_color def next_color
@current_color ||= -1 @current_color ||= -1
@current_color += 1 @current_color += 1
@current_color >= COLORS.length ? "" : COLORS[@current_color] @current_color = 0 if COLORS.length < @current_color
COLORS[@current_color]
end end
module Env module Env
+2 -1
View File
@@ -29,6 +29,7 @@ class Foreman::Export::Runit < Foreman::Export::Base
run = ERB.new(run_template).result(binding) run = ERB.new(run_template).result(binding)
write_file "#{process_directory}/run", run write_file "#{process_directory}/run", run
FileUtils.chmod 0755, "#{process_directory}/run"
port = engine.port_for(process, num, options[:port]) port = engine.port_for(process, num, options[:port])
environment_variables = {'PORT' => port}. environment_variables = {'PORT' => port}.
@@ -41,7 +42,7 @@ class Foreman::Export::Runit < Foreman::Export::Base
log_run = ERB.new(log_run_template).result(binding) log_run = ERB.new(log_run_template).result(binding)
write_file "#{process_log_directory}/run", log_run write_file "#{process_log_directory}/run", log_run
FileUtils.chmod 0755, "#{process_log_directory}/run"
end end
end end
+2
View File
@@ -31,7 +31,9 @@ private
reader, writer = IO.pipe reader, writer = IO.pipe
pid = fork do pid = fork do
trap("INT", "IGNORE") trap("INT", "IGNORE")
writer.sync = true
$stdout.reopen writer $stdout.reopen writer
$stderr.reopen writer
reader.close reader.close
exec Foreman.runner, replace_command_env(command) exec Foreman.runner, replace_command_env(command)
end end
+4 -1
View File
@@ -5,7 +5,10 @@ class Foreman::Utils
def self.parse_concurrency(concurrency) def self.parse_concurrency(concurrency)
begin begin
pairs = concurrency.to_s.gsub(/\s/, "").split(",") pairs = concurrency.to_s.gsub(/\s/, "").split(",")
pairs.inject(Hash.new(1)) do |hash, pair|
default = concurrency.nil? ? 1 : 0
pairs.inject(Hash.new(default)) do |hash, pair|
process, amount = pair.split("=") process, amount = pair.split("=")
hash.update(process => amount.to_i) hash.update(process => amount.to_i)
end end
+1 -1
View File
@@ -1,5 +1,5 @@
module Foreman module Foreman
VERSION = "0.33.1" VERSION = "0.36.1"
end end
+5 -1
View File
@@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3 .\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3
. .
.TH "FOREMAN" "1" "November 2011" "Foreman 0.26.0" "Foreman Manual" .TH "FOREMAN" "1" "January 2012" "Foreman 0.33.1" "Foreman Manual"
. .
.SH "NAME" .SH "NAME"
\fBforeman\fR \- manage Procfile\-based applications \fBforeman\fR \- manage Procfile\-based applications
@@ -68,6 +68,10 @@ Specify the user the application should be run as\. Defaults to the app name
These options control all modes of foreman\'s operation\. These options control all modes of foreman\'s operation\.
. .
.TP .TP
\fB\-d\fR, \fB\-\-directory\fR
Specify an alternate application root\. This defaults to the directory containing the Procfile\.
.
.TP
\fB\-e\fR, \fB\-\-env\fR \fB\-e\fR, \fB\-\-env\fR
Specify an alternate environment file\. You can specify more than one file by using: \fB\-\-env file1,file2\fR\. Specify an alternate environment file\. You can specify more than one file by using: \fB\-\-env file1,file2\fR\.
. .
+4
View File
@@ -66,6 +66,10 @@ The following options control how the application is run:
These options control all modes of foreman's operation. These options control all modes of foreman's operation.
* `-d`, `--directory`:
Specify an alternate application root. This defaults to the directory
containing the Procfile.
* `-e`, `--env`: * `-e`, `--env`:
Specify an alternate environment file. You can specify more than one Specify an alternate environment file. You can specify more than one
file by using: `--env file1,file2`. file by using: `--env file1,file2`.
+1 -1
View File
@@ -35,7 +35,7 @@ describe "Foreman::Engine" do
write_procfile write_procfile
engine = Foreman::Engine.new("Procfile",:concurrency => "alpha=2") engine = Foreman::Engine.new("Procfile",:concurrency => "alpha=2")
mock.instance_of(Foreman::Process).run_process("./alpha", is_a(IO)).twice mock.instance_of(Foreman::Process).run_process("./alpha", is_a(IO)).twice
mock.instance_of(Foreman::Process).run_process("./bravo", is_a(IO)) mock.instance_of(Foreman::Process).run_process("./bravo", is_a(IO)).never
mock(engine).watch_for_output mock(engine).watch_for_output
mock(engine).watch_for_termination mock(engine).watch_for_termination
engine.start engine.start
+7 -2
View File
@@ -12,8 +12,13 @@ describe Foreman::Export::Bluepill do
before(:each) { stub(bluepill).say } before(:each) { stub(bluepill).say }
it "exports to the filesystem" do it "exports to the filesystem" do
bluepill.export("/tmp/init", :concurrency => "alpha=2") bluepill.export("/tmp/init")
File.read("/tmp/init/app.pill").should == example_export_file("bluepill/app.pill") normalize_space(File.read("/tmp/init/app.pill")).should == normalize_space(example_export_file("bluepill/app.pill"))
end end
it "exports to the filesystem with concurrency" do
bluepill.export("/tmp/init", :concurrency => "alpha=2")
normalize_space(File.read("/tmp/init/app.pill")).should == normalize_space(example_export_file("bluepill/app-concurrency.pill"))
end
end end
+2 -1
View File
@@ -10,10 +10,11 @@ describe Foreman::Export::Runit do
before(:each) { load_export_templates_into_fakefs("runit") } before(:each) { load_export_templates_into_fakefs("runit") }
before(:each) { stub(runit).say } before(:each) { stub(runit).say }
before(:each) { stub(FakeFS::FileUtils).chmod }
it "exports to the filesystem" do it "exports to the filesystem" do
FileUtils.mkdir_p('/tmp/init') FileUtils.mkdir_p('/tmp/init')
runit.export('/tmp/init', :concurrency => 'alpha=2') runit.export('/tmp/init', :concurrency => "alpha=2,bravo=1")
File.read("/tmp/init/app-alpha-1/run").should == example_export_file('runit/app-alpha-1-run') File.read("/tmp/init/app-alpha-1/run").should == example_export_file('runit/app-alpha-1-run')
File.read("/tmp/init/app-alpha-1/log/run").should == File.read("/tmp/init/app-alpha-1/log/run").should ==
+11 -2
View File
@@ -12,14 +12,23 @@ describe Foreman::Export::Upstart do
before(:each) { stub(upstart).say } before(:each) { stub(upstart).say }
it "exports to the filesystem" do it "exports to the filesystem" do
upstart.export("/tmp/init")
File.read("/tmp/init/app.conf").should == example_export_file("upstart/app.conf")
File.read("/tmp/init/app-alpha.conf").should == example_export_file("upstart/app-alpha.conf")
File.read("/tmp/init/app-alpha-1.conf").should == example_export_file("upstart/app-alpha-1.conf")
File.read("/tmp/init/app-bravo.conf").should == example_export_file("upstart/app-bravo.conf")
File.read("/tmp/init/app-bravo-1.conf").should == example_export_file("upstart/app-bravo-1.conf")
end
it "exports to the filesystem with concurrency" do
upstart.export("/tmp/init", :concurrency => "alpha=2") upstart.export("/tmp/init", :concurrency => "alpha=2")
File.read("/tmp/init/app.conf").should == example_export_file("upstart/app.conf") File.read("/tmp/init/app.conf").should == example_export_file("upstart/app.conf")
File.read("/tmp/init/app-alpha.conf").should == example_export_file("upstart/app-alpha.conf") File.read("/tmp/init/app-alpha.conf").should == example_export_file("upstart/app-alpha.conf")
File.read("/tmp/init/app-alpha-1.conf").should == example_export_file("upstart/app-alpha-1.conf") File.read("/tmp/init/app-alpha-1.conf").should == example_export_file("upstart/app-alpha-1.conf")
File.read("/tmp/init/app-alpha-2.conf").should == example_export_file("upstart/app-alpha-2.conf") File.read("/tmp/init/app-alpha-2.conf").should == example_export_file("upstart/app-alpha-2.conf")
File.read("/tmp/init/app-bravo.conf").should == example_export_file("upstart/app-bravo.conf") File.exists?("/tmp/init/app-bravo-1.conf").should == false
File.read("/tmp/init/app-bravo-1.conf").should == example_export_file("upstart/app-bravo-1.conf")
end end
context "with alternate templates" do context "with alternate templates" do
@@ -0,0 +1,47 @@
Bluepill.application("app", :foreground => false, :log_file => "/var/log/bluepill.log") do |app|
app.uid = "app"
app.gid = "app"
app.process("alpha-1") do |process|
process.start_command = "./alpha"
process.working_dir = "/tmp/app"
process.daemonize = true
process.environment = {"PORT" => "5000"}
process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
process.stdout = process.stderr = "/var/log/app/app-alpha-1.log"
process.monitor_children do |children|
children.stop_command "kill -QUIT {{PID}}"
end
process.group = "app-alpha"
end
app.process("alpha-2") do |process|
process.start_command = "./alpha"
process.working_dir = "/tmp/app"
process.daemonize = true
process.environment = {"PORT" => "5001"}
process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
process.stdout = process.stderr = "/var/log/app/app-alpha-2.log"
process.monitor_children do |children|
children.stop_command "kill -QUIT {{PID}}"
end
process.group = "app-alpha"
end
end
-21
View File
@@ -23,27 +23,6 @@ Bluepill.application("app", :foreground => false, :log_file => "/var/log/bluepil
process.group = "app-alpha" process.group = "app-alpha"
end end
app.process("alpha-2") do |process|
process.start_command = "./alpha"
process.working_dir = "/tmp/app"
process.daemonize = true
process.environment = {"PORT" => "5001"}
process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
process.stdout = process.stderr = "/var/log/app/app-alpha-2.log"
process.monitor_children do |children|
children.stop_command "kill -QUIT {{PID}}"
end
process.group = "app-alpha"
end
app.process("bravo-1") do |process| app.process("bravo-1") do |process|
process.start_command = "./bravo" process.start_command = "./bravo"
+5
View File
@@ -73,8 +73,13 @@ def preserving_env
end end
end end
def normalize_space(s)
s.gsub(/\n[\n\s]*/, "\n")
end
RSpec.configure do |config| RSpec.configure do |config|
config.color_enabled = true config.color_enabled = true
config.order = 'rand'
config.include FakeFS::SpecHelpers config.include FakeFS::SpecHelpers
config.mock_with :rr config.mock_with :rr
end end