Compare commits

..

51 Commits

Author SHA1 Message Date
David Dollar
e5828f8442 0.12.0 2011-04-01 15:23:31 -04:00
David Dollar
f121d04bf6 autorequire foreman/version 2011-03-25 19:30:47 -04:00
David Dollar
3dc113fcd4 add man page to repository 2011-03-25 19:30:04 -04:00
David Dollar
22ad6c5dd8 0.12.0.pre1 2011-03-25 19:29:11 -04:00
David Dollar
b117ef5b08 remove parka, relax thor version 2011-03-25 19:25:27 -04:00
David Dollar
35474ad1a5 0.11.1 2011-03-08 12:17:44 -05:00
David Dollar
fc5e86b269 describe .foreman in man page 2011-03-08 12:17:03 -05:00
David Dollar
7f8ca7da39 support .foreman file for default options 2011-03-08 12:14:48 -05:00
David Dollar
31239d98d0 ignore ctags file 2011-01-30 16:18:12 -08:00
David Dollar
472395edf8 0.11.0 2011-01-27 16:15:26 -08:00
David Dollar
6b7d5e5161 deprecate colon-less syntax, add check command 2011-01-27 16:14:43 -08:00
David Dollar
977c80ffdd add json export 2011-01-27 16:13:44 -08:00
David Dollar
2804316bbb 0.10.1 2010-12-22 13:56:13 -05:00
David Dollar
26859c2ec2 dont need a log dir 2010-12-22 13:55:51 -05:00
David Dollar
27152b0e76 docs pedantry 2010-12-13 18:13:11 -05:00
David Dollar
160945b499 doc the rake task so it shows in -T 2010-12-13 18:12:28 -05:00
David Dollar
f2be566051 update man page 2010-12-13 18:11:36 -05:00
David Dollar
a504a59f0b add a colon to the mock Procfile 2010-12-13 18:08:40 -05:00
David Dollar
e6b61801b1 0.10.0 2010-12-13 18:05:41 -05:00
David Dollar
dc231f072b allow optional colon after process name 2010-12-13 18:05:06 -05:00
David Dollar
b77b23b306 declare license 2010-11-16 17:47:53 -05:00
David Dollar
185617dddc 0.9.2 2010-11-09 13:42:18 -05:00
David Dollar
9e4cc02827 upgrade dependencies 2010-11-09 13:41:18 -05:00
David Dollar
8b6e2481f4 ruby 1.8.6 compatibility 2010-11-09 13:41:08 -05:00
David Dollar
79f376368c 0.9.1 2010-11-03 15:00:59 -07:00
David Dollar
3576ae82af use process order to determine port assignments 2010-11-03 15:00:35 -07:00
David Dollar
303d54155f uniq the order for safety 2010-11-03 14:13:06 -07:00
David Dollar
2e36cbf045 0.9.0 2010-11-03 14:11:37 -07:00
David Dollar
d3059ca563 always run processes in order they are defined in the procfile 2010-11-03 14:11:30 -07:00
David Dollar
9e42dfb253 change back to Procfile 2010-11-03 14:05:06 -07:00
David Dollar
eca48170a5 fixing specs 2010-10-15 17:26:18 -07:00
David Dollar
86e3cd12dd using Psfile 2010-10-15 17:25:12 -07:00
David Dollar
efd5a786f5 showing PORT here can be confusing 2010-10-15 16:29:40 -07:00
David Dollar
7e9117812f 0.9.0.beta.1 2010-10-15 16:18:54 -07:00
David Dollar
55f405a2b4 catch some common error cases 2010-10-15 16:17:55 -07:00
David Dollar
615bb0d4ba pass ENV["PS"] through to child processes (worker.1) and use it for display output 2010-10-15 16:08:33 -07:00
David Dollar
0ae144e468 better handling of Interrupt rescues 2010-10-15 16:06:06 -07:00
David Dollar
0c2b2a4ac2 prevent double interrupt 2010-10-15 15:55:53 -07:00
David Dollar
e68946f186 change to Pstypes 2010-10-15 15:53:43 -07:00
David Dollar
52edb7fd28 move data under data 2010-10-15 15:53:27 -07:00
David Dollar
8446528f5a change to Pstypes 2010-10-15 15:50:40 -07:00
David Dollar
d41a8726bd update dependencies 2010-10-15 15:50:19 -07:00
David Dollar
7bb1e58879 0.8.0 2010-09-20 16:22:31 -04:00
David Dollar
62b6cac741 print message when signal received 2010-09-20 16:22:13 -04:00
Keith Rarick
2a7dadc2b2 Wait cleanly for child processes to exit.
Signed-off-by: David Dollar <ddollar@gmail.com>
2010-09-20 16:21:41 -04:00
David Dollar
9cd772ac0f 0.7.5 2010-09-17 09:31:24 -04:00
David Dollar
2b27d0a51a include files from export in the gem 2010-09-17 09:31:08 -04:00
Keith Rarick
99204d7c1d Wait for descendant processes to exit. 2010-09-17 21:28:01 +08:00
Ricardo Chimal, Jr
e9b5ed81b8 bugfix upstart export erb templates 2010-09-17 21:27:29 +08:00
David Dollar
7d751470d2 0.7.3 2010-08-24 17:41:36 -04:00
David Dollar
68c1a01f15 add executable and man page to gem release 2010-08-24 17:41:22 -04:00
27 changed files with 444 additions and 64 deletions

3
.gitignore vendored
View File

@@ -1,7 +1,8 @@
.bundle
coverage
example/log/*
man/*.?
man/*.html
man/*.markdown
pkg
tags

View File

@@ -3,14 +3,16 @@ source "http://rubygems.org"
group :development do
gem 'parka'
gem 'rake'
gem 'ronn'
end
group :test do
gem 'fakefs', '~> 0.2.1'
gem 'rcov', '~> 0.9.8'
gem 'rr', '~> 0.10.11'
gem 'rspec', '~> 2.0.0.beta.19'
gem 'rr', '~> 1.0.2'
gem 'rspec', '~> 2.0.0'
end
gem 'json', '~> 1.5.1'
gem 'term-ansicolor', '~> 1.0.5'
gem 'thor', '~> 0.13.6'
gem 'thor', '>= 0.13.6'

View File

@@ -3,35 +3,47 @@ GEM
specs:
diff-lcs (1.1.2)
fakefs (0.2.1)
hpricot (0.8.2)
json (1.5.1)
mime-types (1.16)
mustache (0.11.2)
parka (0.3.1)
rest-client
thor
rake (0.8.7)
rcov (0.9.8)
rdiscount (1.6.5)
rest-client (1.6.0)
mime-types (>= 1.16)
rr (0.10.11)
rspec (2.0.0.beta.19)
rspec-core (= 2.0.0.beta.19)
rspec-expectations (= 2.0.0.beta.19)
rspec-mocks (= 2.0.0.beta.19)
rspec-core (2.0.0.beta.19)
rspec-expectations (2.0.0.beta.19)
ronn (0.7.3)
hpricot (>= 0.8.2)
mustache (>= 0.7.0)
rdiscount (>= 1.5.8)
rr (1.0.2)
rspec (2.0.1)
rspec-core (~> 2.0.1)
rspec-expectations (~> 2.0.1)
rspec-mocks (~> 2.0.1)
rspec-core (2.0.1)
rspec-expectations (2.0.1)
diff-lcs (>= 1.1.2)
rspec-mocks (2.0.0.beta.19)
rspec-mocks (2.0.1)
rspec-core (~> 2.0.1)
rspec-expectations (~> 2.0.1)
term-ansicolor (1.0.5)
thor (0.13.8)
thor (0.14.6)
PLATFORMS
ruby
DEPENDENCIES
fakefs (~> 0.2.1)
json (~> 1.5.1)
parka
rake
rcov (~> 0.9.8)
rr (~> 0.10.11)
rspec (~> 2.0.0.beta.19)
ronn
rr (~> 1.0.2)
rspec (~> 2.0.0)
term-ansicolor (~> 1.0.5)
thor (~> 0.13.6)
thor (>= 0.13.6)

View File

@@ -1,4 +1,9 @@
Foreman
=======
# Foreman
## Manual
See the [man page](http://ddollar.github.com/foreman) for usage.
## License
MIT

View File

@@ -25,7 +25,7 @@ end
Rspec::Core::RakeTask.new("rcov:build") do |t|
t.pattern = 'spec/**/*_spec.rb'
t.rcov = true
t.rcov_opts = [ "--exclude", Gem.default_dir , "--exclude", "spec" ]
t.rcov_opts = [ "--exclude", ".bundle", "--exclude", "spec" ]
end
desc 'Build the manual'
@@ -37,6 +37,7 @@ task :man do
sh "git commit -m 'update readme' || echo 'nothing to commit'"
end
desc "Generate the Github docs"
task :pages => :man do
sh %{
cp man/foreman.1.html /tmp/foreman.1.html

2
data/example/Procfile Normal file
View File

@@ -0,0 +1,2 @@
ticker: ./ticker $PORT
error : ./error

View File

@@ -0,0 +1,4 @@
tick
tick
./never_die:6:in `sleep': Interrupt
from ./never_die:6

View File

@@ -3,4 +3,4 @@ stop on stopping <%= app %>-<%= process.name %>
respawn
chdir <%= engine.directory %>
exec su <%= user %> -c "PORT=<%= port %> <%= process.command %> >> <%= log_root %>/<%=process.name%>-<%=num%>.log 2>&1"
exec su - <%= user %> -c 'export PORT=<%= port %>; <%= process.command %> >> <%= log_root %>/<%=process.name%>-<%=num%>.log 2>&1'

View File

@@ -1,9 +1,29 @@
require "rubygems"
require "parka/specification"
$:.unshift File.expand_path("../lib", __FILE__)
require "foreman/version"
Parka::Specification.new do |gem|
Gem::Specification.new do |gem|
gem.name = "foreman"
gem.version = Foreman::VERSION
gem.summary = "Process manager for applications with multiple components"
gem.author = "David Dollar"
gem.email = "ddollar@gmail.com"
gem.homepage = "http://github.com/ddollar/foreman"
gem.summary = "Process manager for applications with multiple components"
gem.description = gem.summary
gem.executables = "foreman"
gem.files = Dir["**/*"].select { |d| d =~ %r{^(README|bin/|data/|ext/|lib/|spec/|test/)} }
gem.files << "man/foreman.1"
gem.add_dependency 'json', '~> 1.5.1'
gem.add_dependency 'term-ansicolor', '~> 1.0.5'
gem.add_dependency 'thor', '>= 0.13.6'
gem.add_development_dependency 'rake'
gem.add_development_dependency 'ronn'
gem.add_development_dependency 'fakefs', '~> 0.2.1'
gem.add_development_dependency 'rcov', '~> 0.9.8'
gem.add_development_dependency 'rr', '~> 1.0.2'
gem.add_development_dependency 'rspec', '~> 2.0.0'
end

View File

@@ -1,6 +1,6 @@
module Foreman
require "foreman/version"
VERSION = "0.7.2"
module Foreman
class AppDoesNotExist < Exception; end

View File

@@ -5,7 +5,7 @@ require "thor"
class Foreman::CLI < Thor
class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: ./Procfile"
class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: Procfile"
desc "start [PROCESS]", "Start the application, or a specific process"
@@ -36,8 +36,9 @@ class Foreman::CLI < Thor
check_procfile!
formatter = case format
when "upstart" then Foreman::Export::Upstart
when "json" then Foreman::Export::JSON
when "inittab" then Foreman::Export::Inittab
when "upstart" then Foreman::Export::Upstart
else error "Unknown export format: #{format}."
end
@@ -47,10 +48,18 @@ class Foreman::CLI < Thor
error ex.message
end
desc "check", "Validate your application's Procfile"
def check
processes = engine.processes_in_order.map { |p| p.first }
error "no processes defined" unless processes.length > 0
display "valid procfile detected (#{processes.join(', ')})"
end
private ######################################################################
def check_procfile!
error("Procfile does not exist.") unless File.exist?(procfile)
error("#{procfile} does not exist.") unless File.exist?(procfile)
end
def engine
@@ -58,10 +67,12 @@ private ######################################################################
end
def procfile
options[:procfile] || "./Procfile"
options[:procfile] || "Procfile"
end
private ######################################################################
def display(message)
puts message
end
def error(message)
puts "ERROR: #{message}"
@@ -72,4 +83,11 @@ private ######################################################################
File.exist?(procfile)
end
def options
original_options = super
return original_options unless File.exists?(".foreman")
defaults = YAML::load_file(".foreman")
Thor::CoreExt::HashWithIndifferentAccess.new(defaults.merge(original_options))
end
end

View File

@@ -22,25 +22,42 @@ class Foreman::Engine
def processes
@processes ||= begin
@order = []
procfile.split("\n").inject({}) do |hash, line|
next if line.strip == ""
name, command = line.split(" ", 2)
name, command = line.split(/ *: +/, 2)
unless command
warn_deprecated_procfile!
name, command = line.split(/ +/, 2)
end
process = Foreman::Process.new(name, command)
process.color = next_color
@order << process.name
hash.update(process.name => process)
end
end
end
def process_order
processes
@order.uniq
end
def processes_in_order
process_order.map do |name|
[name, processes[name]]
end
end
def start(options={})
proctitle "ruby: foreman master"
processes.each do |name, process|
processes_in_order.each do |name, process|
fork process, options
end
trap("TERM") { kill_and_exit("TERM") }
trap("INT") { kill_and_exit("INT") }
trap("TERM") { puts "SIGTERM received"; kill_all("TERM") }
trap("INT") { puts "SIGINT received"; kill_all("INT") }
watch_for_termination
end
@@ -48,15 +65,15 @@ class Foreman::Engine
def execute(name, options={})
fork processes[name], options
trap("TERM") { kill_and_exit("TERM") }
trap("INT") { kill_and_exit("INT") }
trap("TERM") { puts "SIGTERM received"; kill_all("TERM") }
trap("INT") { puts "SIGINT received"; kill_all("INT") }
watch_for_termination
end
def port_for(process, num, base_port=nil)
base_port ||= 5000
offset = processes.keys.sort.index(process.name) * 100
offset = processes_in_order.map { |p| p.first }.index(process.name) * 100
base_port.to_i + offset + num - 1
end
@@ -66,12 +83,13 @@ private ######################################################################
concurrency = Foreman::Utils.parse_concurrency(options[:concurrency])
1.upto(concurrency[process.name]) do |num|
fork_individual(process, port_for(process, num, options[:port]))
fork_individual(process, num, port_for(process, num, options[:port]))
end
end
def fork_individual(process, port)
def fork_individual(process, num, port)
ENV["PORT"] = port.to_s
ENV["PS"] = "#{process.name}.#{num}"
pid = Process.fork do
run(process)
@@ -81,32 +99,33 @@ private ######################################################################
running_processes[pid] = process
end
def run(process, log_to_file=true)
def run(process)
proctitle "ruby: foreman #{process.name}"
Dir.chdir directory do
FileUtils.mkdir_p "log"
command = process.command
begin
Dir.chdir directory do
command = process.command
begin
PTY.spawn("#{process.command} 2>&1") do |stdin, stdout, pid|
until stdin.eof?
info stdin.gets, process
end
end
rescue PTY::ChildExited, Interrupt
end
rescue PTY::ChildExited, Interrupt
begin
info "process exiting", process
rescue Interrupt
end
end
end
def kill_and_exit(signal="TERM")
def kill_all(signal="TERM")
info "terminating"
running_processes.each do |pid, process|
info "killing #{process.name} in pid #{pid}"
Process.kill(signal, pid)
end
exit 0
end
def info(message, process=nil)
@@ -126,8 +145,8 @@ private ######################################################################
end
def pad_process_name(process)
name = process ? "#{process.name}:#{ENV["PORT"]}" : "system"
name.ljust(longest_process_name + 6) # add 6 for port padding
name = process ? "#{ENV["PS"]}" : "system"
name.ljust(longest_process_name + 3) # add 3 for process number padding
end
def print_info
@@ -149,7 +168,8 @@ private ######################################################################
pid, status = Process.wait2
process = running_processes.delete(pid)
info "process terminated", process
kill_and_exit
kill_all
Process.waitall
end
def running_processes
@@ -162,4 +182,12 @@ private ######################################################################
@current_color >= COLORS.length ? "" : COLORS[@current_color]
end
def warn_deprecated_procfile!
return if @already_warned_deprecated
@already_warned_deprecated = true
puts "!!! This format of Procfile is deprecated, and will not work starting in v0.12"
puts "!!! Use a colon to separate the process name from the command"
puts "!!! e.g. web: thin start"
end
end

View File

@@ -4,5 +4,6 @@ module Foreman::Export
class Exception < ::Exception; end
end
require "foreman/export/upstart"
require "foreman/export/json"
require "foreman/export/inittab"
require "foreman/export/upstart"

View File

@@ -24,7 +24,7 @@ private ######################################################################
end
def export_template(name)
File.read(File.expand_path("../../../../export/#{name}", __FILE__))
File.read(File.expand_path("../../../../data/export/#{name}", __FILE__))
end
def write_file(filename, contents)

View File

@@ -27,8 +27,8 @@ class Foreman::Export::Inittab < Foreman::Export::Base
inittab = inittab.join("\n") + "\n"
if fname
FileUtils.mkdir_p(log_root)
FileUtils.chown(user, nil, log_root)
FileUtils.mkdir_p(log_root) rescue error "could not create #{log_root}"
FileUtils.chown(user, nil, log_root) rescue error "could not chown #{log_root} to #{user}"
write_file(fname, inittab)
else
puts inittab

View File

@@ -0,0 +1,13 @@
require "foreman/export/base"
require "json"
class Foreman::Export::JSON < Foreman::Export::Base
def export(fname=nil, options={})
processes = engine.processes.values.inject({}) do |hash, process|
hash.update(process.name => { "command" => process.command })
end
puts processes.to_json
end
end

5
lib/foreman/version.rb Normal file
View File

@@ -0,0 +1,5 @@
module Foreman
VERSION = "0.12.0"
end

210
man/foreman.1 Normal file
View File

@@ -0,0 +1,210 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "FOREMAN" "1" "March 2011" "Foreman 0.12.0.pre1" "Foreman Manual"
.
.SH "NAME"
\fBforeman\fR \- manage Procfile\-based applications
.
.SH "SYNOPSIS"
\fBforeman start [process]\fR
.
.br
\fBforeman export <format> [location]\fR
.
.SH "DESCRIPTION"
\fBForeman\fR is a manager for Procfile\-based applications\. Its aim is to abstract away the details of the Procfile format, and allow you to either run your application directly or export it to some other process management format\.
.
.SH "RUNNING"
\fBforeman start\fR is used to run your application directly from the command line\.
.
.P
If no additional parameters are passed, foreman will run one instance of each type of process defined in your Procfile\.
.
.P
If a parameter is passed, foreman will run one instance of the specified application type\.
.
.P
The following options control how the application is run:
.
.TP
\fB\-c\fR, \fB\-\-concurrency\fR
Specify the number of each process type to run\. The value passed in should be in the format \fBprocess=num,process=num\fR
.
.TP
\fB\-p\fR, \fB\-\-port\fR
Specify which port to use as the base for this application\. Should be a multiple of 1000\.
.
.SH "EXPORTING"
\fBforeman export\fR is used to export your application to another process management format\.
.
.P
An location to export can be passed as an argument\. This argument may be either required or optional depending on the export format\.
.
.P
The following options control how the application is run:
.
.TP
\fB\-a\fR, \fB\-\-app\fR
Use this name rather than the application\'s root directory name as the name of the application when exporting\.
.
.TP
\fB\-c\fR, \fB\-\-concurrency\fR
Specify the number of each process type to run\. The value passed in should be in the format \fBprocess=num,process=num\fR
.
.TP
\fB\-l\fR, \fB\-\-log\fR
Specify the directory to place process logs in\.
.
.TP
\fB\-p\fR, \fB\-\-port\fR
Specify which port to use as the base for this application\. Should be a multiple of 1000\.
.
.TP
\fB\-u\fR, \fB\-\-user\fR
Specify the user the application should be run as\. Defaults to the app name
.
.SH "OPTIONS"
These options control all modes of foreman\'s operation\.
.
.TP
\fB\-f\fR, \fB\-\-procfile\fR
Specify an alternate location for the application\'s Procfile\. This file\'s containing directory will be assumed to be the root directory of the application\.
.
.SH "EXPORT FORMATS"
foreman currently supports the following output formats:
.
.IP "\(bu" 4
json
.
.IP "\(bu" 4
inittab
.
.IP "\(bu" 4
upstart
.
.IP "" 0
.
.SH "JSON EXPORT"
Will export your processes as JSON:
.
.IP "" 4
.
.nf
{ "web": { "command": "bundle exec thin start" } }
.
.fi
.
.IP "" 0
.
.SH "INITTAB EXPORT"
Will export a chunk of inittab\-compatible configuration:
.
.IP "" 4
.
.nf
# \-\-\-\-\- foreman example processes \-\-\-\-\-
EX01:4:respawn:/bin/su \- example \-c \'PORT=5000 bundle exec thin start >> /var/log/web\-1\.log 2>&1\'
EX02:4:respawn:/bin/su \- example \-c \'PORT=5100 bundle exec rake jobs:work >> /var/log/job\-1\.log 2>&1\'
# \-\-\-\-\- end foreman example processes \-\-\-\-\-
.
.fi
.
.IP "" 0
.
.SH "UPSTART EXPORT"
Will create a series of upstart scripts in the location you specify\. Scripts will be structured to make the following commands valid:
.
.P
\fBstart appname\fR
.
.P
\fBstop appname\-processname\fR
.
.P
\fBrestart appname\-processname\-3\fR
.
.SH "PROCFILE"
A Procfile should contain both a name for the process and the command used to run it\.
.
.IP "" 4
.
.nf
web: bundle exec thin start
job: bundle exec rake jobs:work
.
.fi
.
.IP "" 0
.
.P
You can validate your Procfile format using the \fBcheck\fR command
.
.IP "" 4
.
.nf
$ foreman check
.
.fi
.
.IP "" 0
.
.SH "DEFAULT OPTIONS"
If a \fB\.foreman\fR file exists in the current directory, default options will be read from it\. This file should be in YAML format with the long option name as keys\. Example:
.
.IP "" 4
.
.nf
concurrency: alpha=0
port: 15000
.
.fi
.
.IP "" 0
.
.SH "EXAMPLES"
Start one instance of each process type, interleave the output on stdout:
.
.IP "" 4
.
.nf
$ foreman start
.
.fi
.
.IP "" 0
.
.P
Export the application in upstart format:
.
.IP "" 4
.
.nf
$ foreman export upstart /etc/init
.
.fi
.
.IP "" 0
.
.P
Run one process type from the application defined in a specific Procfile:
.
.IP "" 4
.
.nf
$ foreman start alpha \-p ~/myapp/Procfile
.
.fi
.
.IP "" 0
.
.SH "COPYRIGHT"
Foreman is Copyright (C) 2010 David Dollar \fIhttp://daviddollar\.org\fR

View File

@@ -75,10 +75,18 @@ These options control all modes of foreman's operation.
foreman currently supports the following output formats:
* json
* inittab
* upstart
## JSON EXPORT
Will export your processes as JSON:
{ "web": { "command": "bundle exec thin start" } }
## INITTAB EXPORT
Will export a chunk of inittab-compatible configuration:
@@ -104,8 +112,21 @@ will be structured to make the following commands valid:
A Procfile should contain both a name for the process and the command used
to run it.
web bundle exec thin start
job bundle exec rake jobs:work
web: bundle exec thin start
job: bundle exec rake jobs:work
You can validate your Procfile format using the `check` command
$ foreman check
## DEFAULT OPTIONS
If a `.foreman` file exists in the current directory, default options will
be read from it. This file should be in YAML format with the long option
name as keys. Example:
concurrency: alpha=0
port: 15000
## EXAMPLES
@@ -119,7 +140,7 @@ Export the application in upstart format:
Run one process type from the application defined in a specific Procfile:
$ foreman start alpha -p ~/app/Procfile
$ foreman start alpha -p ~/myapp/Procfile
## COPYRIGHT

View File

@@ -58,4 +58,27 @@ describe "Foreman::CLI" do
end
end
describe "check" do
describe "with a valid Procfile" do
before { write_procfile }
it "displays the jobs" do
mock(subject).display("valid procfile detected (alpha, bravo)")
subject.check
end
end
describe "with a blank Procfile" do
before do
FileUtils.touch("Procfile")
end
it "displays an error" do
mock_error(subject, "no processes defined") do
subject.check
end
end
end
end
end

View File

@@ -12,12 +12,26 @@ describe "Foreman::Engine" do
end
describe "with a Procfile" do
before { write_procfile }
it "reads the processes" do
write_procfile
subject.processes["alpha"].command.should == "./alpha"
subject.processes["bravo"].command.should == "./bravo"
end
end
describe "with a deprecated Procfile" do
before do
File.open("Procfile", "w") do |file|
file.puts "name command"
end
end
it "should print a deprecation warning" do
mock(subject).warn_deprecated_procfile!
subject.processes.length.should == 1
end
end
end
describe "start" do
@@ -31,9 +45,9 @@ describe "Foreman::Engine" do
it "handles concurrency" do
write_procfile
mock(subject).fork_individual(subject.processes["alpha"], 5000)
mock(subject).fork_individual(subject.processes["alpha"], 5001)
mock(subject).fork_individual(subject.processes["bravo"], 5100)
mock(subject).fork_individual(subject.processes["alpha"], 1, 5000)
mock(subject).fork_individual(subject.processes["alpha"], 2, 5001)
mock(subject).fork_individual(subject.processes["bravo"], 1, 5100)
mock(subject).watch_for_termination
subject.start(:concurrency => "alpha=2")
end

View File

@@ -26,8 +26,8 @@ end
def write_procfile(procfile="Procfile")
File.open(procfile, "w") do |file|
file.puts "alpha ./alpha"
file.puts "bravo ./bravo"
file.puts "alpha: ./alpha"
file.puts "bravo: ./bravo"
end
end