add support for process environments
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user