Compare commits

...
28 Commits
Author SHA1 Message Date
David Dollar 0da42cf7d2 0.63.0 2013-04-15 15:33:51 -04:00
David Dollar 23561b963c fix dotenv dependency 2013-04-15 15:32:27 -04:00
David Dollar cc51ab2cb1 fix up tests 2013-04-15 15:32:22 -04:00
David Dollar 403d40b277 Revert "Merge pull request #292 from andrewsmedina/master"
Does not pass tests

This reverts commit 17a8a316b8, reversing
changes made to 9e1d590734.
2013-04-15 15:31:38 -04:00
David Dollar f1c2347680 Merge pull request #317 from andymorris/fix_deleted_upstart_files
Prevent upstart export from deleting similarly named upstart files
2013-04-14 08:45:21 -07:00
David Dollar 80f8242b11 Merge pull request #316 from avtobiff/add-mit-license
Add MIT license text
2013-04-14 08:43:41 -07:00
David Dollar 383276bb79 Merge pull request #343 from steakknife/fix__issue_341__profile_not_found
Fixes #341 . .profile not found error
2013-04-14 08:41:58 -07:00
David Dollar 5a7692ff2c Merge pull request #326 from pje/patch-1
Update man/foreman.1
2013-04-14 08:40:50 -07:00
David Dollar 405a85bc86 Merge pull request #351 from GreenplumChorus/master
Remove posix-spawn dependency for JRuby
2013-04-14 08:40:10 -07:00
David Dollar bff554d554 Merge pull request #347 from bkeepers/dotenv
Replace Foreman::Env with dotenv
2013-04-14 08:37:31 -07:00
David Dollar eaed989c75 Merge pull request #329 from kentaro/permit-underscore-in-procfile
Permit hyphen for command name in Procfile
2013-04-14 08:32:24 -07:00
David Dollar 93daebbf1b Merge pull request #323 from dplummer/remove-tmux-from-man
Remove tmux option from man page
2013-04-14 08:31:40 -07:00
David Dollar 17a8a316b8 Merge pull request #292 from andrewsmedina/master
circus support
2013-04-14 08:30:17 -07:00
David Dollar 9e1d590734 Merge pull request #266 from messick/master
Use runlevels in upstart config so app starts after boot in Ubuntu 12.03
2013-04-14 08:28:08 -07:00
David Dollar 1cb1c8812a Merge pull request #352 from john-griffin/master
Restore ability to trap crtl+c
2013-04-11 07:59:52 -07:00
John Griffin 6786f4df39 Revert "Ensure foreman is the process group leader"
This reverts commit 44726e377e.

Conflicts:

	lib/foreman/engine.rb
2013-04-09 17:05:16 +01:00
Andrew Brown & Corey Downing 0be08a0651 remove posix-spawn dependency as it does not work in jruby 1.7.3 2013-04-04 17:27:31 -07:00
Brandon Keepers 3abe10e5ab Replace Foreman::Env with dotenv 2013-03-22 10:38:58 -04:00
Barry Allard 66ab0f08e7 [foreman-runner] fix sourcing as . is rarely in PATH 2013-03-16 00:04:57 -07:00
David Dollar 7be4375168 changelog 2013-03-08 14:53:56 -05:00
Kentaro Kuribayashi 8d1e3a849f Fixed specs to pass. 2013-02-21 11:52:37 +09:00
Kentaro Kuribayashi 5ef8bbdbe3 Permit underscore for command name in Procfile. 2013-02-21 11:30:59 +09:00
Patrick Ellis 8cf5896c3e Update man/foreman.1
fix man example typo: Procfile flag is `-f`, not `-p`
2013-02-05 16:29:38 -08:00
Donald Plummer 5f8032cac8 Remove tmux option from man page
Not well supported at this time. See issue #242
2013-01-30 09:29:16 -08:00
Andy Morris 9f3b903085 Prevent upstart export from deleting similarly named upstart files 2013-01-25 00:24:04 -06:00
Per Andersson 69d278d864 Add MIT license text 2013-01-22 10:10:41 +01:00
Andrews Medina 9325f2ca6d add circus support 2012-11-29 00:15:01 -02:00
Nick Messick 9a91e5df44 use "start|stop\ on runlevel [x]" for upstart config 2012-09-24 18:18:05 -07:00
22 changed files with 131 additions and 70 deletions
+12 -1
View File
@@ -1,6 +1,17 @@
## 0.62.0 (2013-03-08)
* Merge pull request #334 from ged/reentrant_signal_handlers [David Dollar]
* Merge pull request #335 from ged/20_encoding_fix [David Dollar]
* Try to allow children to shut down gracefully [Michael Granger]
* Add deferred signal-handling (fixes #332). [Michael Granger]
* Fix spec encoding problem under Ruby 2.0.0. [Michael Granger]
* add ruby 2.0 to travis [David Dollar]
* Merge pull request #327 from patheticpat/master [David Dollar]
* Fixed a typo in cli options description [Michael Kaiser]
* handled by mingw now [David Dollar]
## 0.61.0 (2013-01-14) ## 0.61.0 (2013-01-14)
* 0.61.0 [David Dollar]
* Fix bug in color definitons [nseo] * Fix bug in color definitons [nseo]
* Fix for high CPU load when processes close output [Pavel Forkert] * Fix for high CPU load when processes close output [Pavel Forkert]
* Ensure foreman is the process group leader [Christos Trochalakis] * Ensure foreman is the process group leader [Christos Trochalakis]
+3 -1
View File
@@ -1,7 +1,8 @@
PATH PATH
remote: . remote: .
specs: specs:
foreman (0.62.0) foreman (0.63.0)
dotenv (>= 0.7)
thor (>= 0.13.6) thor (>= 0.13.6)
GEM GEM
@@ -13,6 +14,7 @@ GEM
xml-simple xml-simple
builder (3.0.0) builder (3.0.0)
diff-lcs (1.1.3) diff-lcs (1.1.3)
dotenv (0.7.0)
fakefs (0.3.2) fakefs (0.3.2)
hpricot (0.8.6) hpricot (0.8.6)
hpricot (0.8.6-java) hpricot (0.8.6-java)
+19
View File
@@ -0,0 +1,19 @@
Copyright (c) 2012 David Dollar
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+3 -1
View File
@@ -43,4 +43,6 @@ David Dollar
## License ## License
MIT Foreman is licensed under the MIT license.
See LICENSE for the full license text.
+1 -1
View File
@@ -34,7 +34,7 @@ shift $((OPTIND-1))
if [ "$read_profile" = "1" ]; then if [ "$read_profile" = "1" ]; then
if [ -f .profile ]; then if [ -f .profile ]; then
. .profile . ./.profile
fi fi
fi fi
+2 -6
View File
@@ -7,10 +7,6 @@ EOF
end script end script
start on (started network-interface start on runlevel [2345]
or started network-manager
or started networking)
stop on (stopping network-interface stop on runlevel [016]
or stopping network-manager
or stopping networking)
+1 -1
View File
@@ -18,9 +18,9 @@ Gem::Specification.new do |gem|
gem.files << "man/foreman.1" gem.files << "man/foreman.1"
gem.add_dependency 'thor', '>= 0.13.6' gem.add_dependency 'thor', '>= 0.13.6'
gem.add_dependency 'dotenv', '>= 0.7'
if ENV["PLATFORM"] == "java" if ENV["PLATFORM"] == "java"
gem.add_dependency "posix-spawn", "~> 0.3.6"
gem.platform = Gem::Platform.new("java") gem.platform = Gem::Platform.new("java")
end end
+3 -8
View File
@@ -1,7 +1,7 @@
require "foreman" require "foreman"
require "foreman/env"
require "foreman/process" require "foreman/process"
require "foreman/procfile" require "foreman/procfile"
require "dotenv"
require "tempfile" require "tempfile"
require "timeout" require "timeout"
require "fileutils" require "fileutils"
@@ -52,9 +52,6 @@ class Foreman::Engine
# Start the processes registered to this +Engine+ # Start the processes registered to this +Engine+
# #
def start def start
# Make sure foreman is the process group leader.
Process.setpgrp unless Foreman.windows?
register_signal_handlers register_signal_handlers
startup startup
spawn_processes spawn_processes
@@ -172,9 +169,7 @@ class Foreman::Engine
# @param [String] filename A .env file to load into the environment # @param [String] filename A .env file to load into the environment
# #
def load_env(filename) def load_env(filename)
Foreman::Env.new(filename).entries do |name, value| @env.update Dotenv::Environment.new(filename)
@env[name] = value
end
end end
# Send a signal to all processes started by this +Engine+ # Send a signal to all processes started by this +Engine+
@@ -207,7 +202,7 @@ class Foreman::Engine
kill_children(signal) kill_children(signal)
else else
begin begin
Process.kill "-#{signal}", Process.getpgrp Process.kill "-#{signal}", Process.pid
rescue Errno::ESRCH, Errno::EPERM rescue Errno::ESRCH, Errno::EPERM
end end
end end
-29
View File
@@ -1,29 +0,0 @@
require "foreman"
class Foreman::Env
attr_reader :entries
def initialize(filename)
@entries = File.read(filename).gsub("\r\n","\n").split("\n").inject({}) do |ax, line|
if line =~ /\A([A-Za-z_0-9]+)=(.*)\z/
key = $1
case val = $2
# Remove single quotes
when /\A'(.*)'\z/ then ax[key] = $1
# Remove double quotes and unescape string preserving newline characters
when /\A"(.*)"\z/ then ax[key] = $1.gsub('\n', "\n").gsub(/\\(.)/, '\1')
else ax[key] = val
end
end
ax
end
end
def entries
@entries.each do |key, value|
yield key, value
end
end
end
+1 -1
View File
@@ -6,7 +6,7 @@ class Foreman::Export::Upstart < Foreman::Export::Base
def export def export
super super
Dir["#{location}/#{app}*.conf"].each do |file| (Dir["#{location}/#{app}-*.conf"] << "#{location}/#{app}.conf").each do |file|
clean file clean file
end end
+1 -1
View File
@@ -83,7 +83,7 @@ private
def parse(filename) def parse(filename)
File.read(filename).gsub("\r\n","\n").split("\n").map do |line| File.read(filename).gsub("\r\n","\n").split("\n").map do |line|
if line =~ /^([A-Za-z0-9_]+):\s*(.+)$/ if line =~ /^([A-Za-z0-9_-]+):\s*(.+)$/
[$1, $2] [$1, $2]
end end
end.compact end.compact
+1 -1
View File
@@ -1,5 +1,5 @@
module Foreman module Foreman
VERSION = "0.62.0" VERSION = "0.63.0"
end end
+1 -5
View File
@@ -46,10 +46,6 @@ Specify an alternate Procfile to load, implies \fB\-d\fR at the Procfile root\.
\fB\-p\fR, \fB\-\-port\fR \fB\-p\fR, \fB\-\-port\fR
Specify which port to use as the base for this application\. Should be a multiple of 1000\. Specify which port to use as the base for this application\. Should be a multiple of 1000\.
. .
.TP
\fB\-t\fR, \fB\-\-tmux\fR
Runs the processes in a tmux session\. Creates one window for each process and an extra window containing the output of each window (requires gawk)\.
.
.P .P
\fBforeman run\fR is used to run one\-off commands using the same environment as your defined processes\. \fBforeman run\fR is used to run one\-off commands using the same environment as your defined processes\.
. .
@@ -234,7 +230,7 @@ Run one process type from the application defined in a specific Procfile:
. .
.nf .nf
$ foreman start alpha \-p ~/myapp/Procfile $ foreman start alpha \-f ~/myapp/Procfile
. .
.fi .fi
. .
-4
View File
@@ -40,10 +40,6 @@ The following options control how the application is run:
Specify which port to use as the base for this application. Should be Specify which port to use as the base for this application. Should be
a multiple of 1000. a multiple of 1000.
* `-t`, `--tmux`:
Runs the processes in a tmux session. Creates one window for each process
and an extra window containing the output of each window (requires gawk).
`foreman run` is used to run one-off commands using the same environment `foreman run` is used to run one-off commands using the same environment
as your defined processes. as your defined processes.
+1 -1
View File
@@ -50,7 +50,7 @@ describe "Foreman::CLI", :fakefs do
describe "check" do describe "check" do
it "with a valid Procfile displays the jobs" do it "with a valid Procfile displays the jobs" do
write_procfile write_procfile
foreman("check").should == "valid procfile detected (alpha, bravo)\n" foreman("check").should == "valid procfile detected (alpha, bravo, foo_bar, foo-bar)\n"
end end
it "with a blank Procfile displays an error" do it "with a blank Procfile displays an error" do
+16
View File
@@ -29,11 +29,27 @@ describe Foreman::Export::Upstart, :fakefs do
mock(FileUtils).rm("/tmp/init/app-alpha-1.conf") mock(FileUtils).rm("/tmp/init/app-alpha-1.conf")
mock(FileUtils).rm("/tmp/init/app-bravo.conf") mock(FileUtils).rm("/tmp/init/app-bravo.conf")
mock(FileUtils).rm("/tmp/init/app-bravo-1.conf") mock(FileUtils).rm("/tmp/init/app-bravo-1.conf")
mock(FileUtils).rm("/tmp/init/app-foo-bar.conf")
mock(FileUtils).rm("/tmp/init/app-foo-bar-1.conf")
mock(FileUtils).rm("/tmp/init/app-foo_bar.conf")
mock(FileUtils).rm("/tmp/init/app-foo_bar-1.conf")
upstart.export upstart.export
upstart.export upstart.export
end end
it "does not delete exported files for similarly named applications" do
FileUtils.mkdir_p "/tmp/init"
["app2", "app2-alpha", "app2-alpha-1"].each do |name|
path = "/tmp/init/#{name}.conf"
FileUtils.touch(path)
dont_allow(FileUtils).rm(path)
end
upstart.export
end
it "quotes and escapes environment variables" do it "quotes and escapes environment variables" do
engine.env['KEY'] = 'd"\|d' engine.env['KEY'] = 'd"\|d'
upstart.export upstart.export
+4 -2
View File
@@ -16,8 +16,10 @@ describe Foreman::Procfile, :fakefs do
it "loads a passed-in Procfile" do it "loads a passed-in Procfile" do
write_procfile write_procfile
procfile = Foreman::Procfile.new("Procfile") procfile = Foreman::Procfile.new("Procfile")
procfile["alpha"].should == "./alpha" procfile["alpha"].should == "./alpha"
procfile["bravo"].should == "./bravo" procfile["bravo"].should == "./bravo"
procfile["foo-bar"].should == "./foo-bar"
procfile["foo_bar"].should == "./foo_bar"
end end
it "can have a process appended to it" do it "can have a process appended to it" do
+35
View File
@@ -42,5 +42,40 @@ Bluepill.application("app", :foreground => false, :log_file => "/var/log/bluepil
process.group = "app-bravo" process.group = "app-bravo"
end end
app.process("foo_bar-1") do |process|
process.start_command = "./foo_bar"
process.working_dir = "/tmp/app"
process.daemonize = true
process.environment = {"PORT"=>"5200"}
process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
process.stop_grace_time = 45.seconds
process.stdout = process.stderr = "/var/log/app/app-foo_bar-1.log"
process.monitor_children do |children|
children.stop_command "kill {{PID}}"
end
process.group = "app-foo_bar"
end
app.process("foo-bar-1") do |process|
process.start_command = "./foo-bar"
process.working_dir = "/tmp/app"
process.daemonize = true
process.environment = {"PORT"=>"5300"}
process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill]
process.stop_grace_time = 45.seconds
process.stdout = process.stderr = "/var/log/app/app-foo-bar-1.log"
process.monitor_children do |children|
children.stop_command "kill {{PID}}"
end
process.group = "app-foo-bar"
end
end end
@@ -1,4 +1,6 @@
# ----- foreman app processes ----- # ----- foreman app processes -----
AP01:4:respawn:/bin/su - app -c 'cd /tmp/app;export PORT=5000;./alpha >> /var/log/app/alpha-1.log 2>&1' AP01:4:respawn:/bin/su - app -c 'cd /tmp/app;export PORT=5000;./alpha >> /var/log/app/alpha-1.log 2>&1'
AP02:4:respawn:/bin/su - app -c 'cd /tmp/app;export PORT=5100;./bravo >> /var/log/app/bravo-1.log 2>&1' AP02:4:respawn:/bin/su - app -c 'cd /tmp/app;export PORT=5100;./bravo >> /var/log/app/bravo-1.log 2>&1'
AP03:4:respawn:/bin/su - app -c 'cd /tmp/app;export PORT=5200;./foo_bar >> /var/log/app/foo_bar-1.log 2>&1'
AP04:4:respawn:/bin/su - app -c 'cd /tmp/app;export PORT=5300;./foo-bar >> /var/log/app/foo-bar-1.log 2>&1'
# ----- end foreman app processes ----- # ----- end foreman app processes -----
@@ -19,6 +19,26 @@ stderr_logfile=/var/log/app/bravo-1.error.log
user=app user=app
directory=/tmp/app directory=/tmp/app
environment=PORT=5100 environment=PORT=5100
[program:app-foo_bar-1]
command=./foo_bar
autostart=true
autorestart=true
stopsignal=QUIT
stdout_logfile=/var/log/app/foo_bar-1.log
stderr_logfile=/var/log/app/foo_bar-1.error.log
user=app
directory=/tmp/app
environment=PORT=5200
[program:app-foo-bar-1]
command=./foo-bar
autostart=true
autorestart=true
stopsignal=QUIT
stdout_logfile=/var/log/app/foo-bar-1.log
stderr_logfile=/var/log/app/foo-bar-1.error.log
user=app
directory=/tmp/app
environment=PORT=5300
[group:app] [group:app]
programs=app-alpha-1,app-bravo-1 programs=app-alpha-1,app-bravo-1,app-foo_bar-1,app-foo-bar-1
+2 -6
View File
@@ -7,10 +7,6 @@ EOF
end script end script
start on (started network-interface start on runlevel [2345]
or started network-manager
or started networking)
stop on (stopping network-interface stop on runlevel [016]
or stopping network-manager
or stopping networking)
+2
View File
@@ -79,6 +79,8 @@ def write_procfile(procfile="Procfile", alpha_env="")
file.puts "alpha: ./alpha" + " #{alpha_env}".rstrip file.puts "alpha: ./alpha" + " #{alpha_env}".rstrip
file.puts "\n" file.puts "\n"
file.puts "bravo:\t./bravo" file.puts "bravo:\t./bravo"
file.puts "foo_bar:\t./foo_bar"
file.puts "foo-bar:\t./foo-bar"
end end
File.expand_path(procfile) File.expand_path(procfile)
end end