add support for process environments

This commit is contained in:
David Dollar
2011-05-13 12:02:13 -04:00
parent 8f0b14810c
commit 9193a675a3
7 changed files with 76 additions and 13 deletions
+1
View File
@@ -6,6 +6,7 @@ require "yaml"
class Foreman::CLI < Thor
class_option :env, :type => :string, :aliases => "-e"
class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: Procfile"
desc "start [PROCESS]", "Start the application, or a specific process"
+32 -5
View File
@@ -50,10 +50,12 @@ class Foreman::Engine
end
def start(options={})
environment = read_environment(options[:env])
proctitle "ruby: foreman master"
processes_in_order.each do |name, process|
fork process, options
fork process, options, environment
end
trap("TERM") { puts "SIGTERM received"; kill_all("TERM") }
@@ -63,7 +65,9 @@ class Foreman::Engine
end
def execute(name, options={})
fork processes[name], options
environment = read_environment(options[:env])
fork processes[name], options, environment
trap("TERM") { puts "SIGTERM received"; kill_all("TERM") }
trap("INT") { puts "SIGINT received"; kill_all("TERM") }
@@ -79,15 +83,17 @@ class Foreman::Engine
private ######################################################################
def fork(process, options={})
def fork(process, options={}, environment={})
concurrency = Foreman::Utils.parse_concurrency(options[:concurrency])
1.upto(concurrency[process.name]) do |num|
fork_individual(process, num, port_for(process, num, options[:port]))
fork_individual(process, num, port_for(process, num, options[:port]), environment)
end
end
def fork_individual(process, num, port)
def fork_individual(process, num, port, environment)
environment.each { |k,v| ENV[k] = v }
ENV["PORT"] = port.to_s
ENV["PS"] = "#{process.name}.#{num}"
@@ -136,6 +142,11 @@ private ######################################################################
puts
end
def error(message)
puts "ERROR: #{message}"
exit 1
end
def longest_process_name
@longest_process_name ||= begin
longest = processes.keys.map { |name| name.length }.sort.last
@@ -190,4 +201,20 @@ private ######################################################################
puts "!!! e.g. web: thin start"
end
def read_environment(filename)
error "No such file: #{filename}" if filename && !File.exists?(filename)
filename ||= ".env"
environment = {}
if File.exists?(filename)
File.read(filename).split("\n").each do |line|
if line =~ /\A([A-Za-z_]+)=(.*)\z/
environment[$1] = $2
end
end
end
environment
end
end