Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa46a605bb | ||
|
|
3077857ab7 | ||
|
|
08aa8f9d5d | ||
|
|
771489dec9 | ||
|
|
053ae8f0be | ||
|
|
af58af1c60 | ||
|
|
9075d93370 | ||
|
|
0c2e9df722 | ||
|
|
047f1ff5c4 | ||
|
|
26b54a62c5 | ||
|
|
7b85ad7c1a | ||
|
|
91a87049db | ||
|
|
f46408e8be | ||
|
|
93f04e42ac | ||
|
|
97c4582acc | ||
|
|
5689d75a87 | ||
|
|
1325b6750e | ||
|
|
638005403f | ||
|
|
55f274532f | ||
|
|
66f76c2036 | ||
|
|
865cabb525 | ||
|
|
7c3c4bc58f | ||
|
|
2dbe8c733b | ||
|
|
84352b82cc | ||
|
|
383c1f87af | ||
|
|
ce3003b026 | ||
|
|
e06f4b2f9e | ||
|
|
b721fd894e | ||
|
|
b8ea6fd4b3 | ||
|
|
dbda63263b | ||
|
|
93cdc31be0 | ||
|
|
4dfbe46690 | ||
|
|
0033f9caeb | ||
|
|
74839800a9 | ||
|
|
b75337e21e | ||
|
|
d94f941189 | ||
|
|
0b34f067cb | ||
|
|
dbe51832b0 | ||
|
|
3a2a53be95 | ||
|
|
b2bf95479e | ||
|
|
48f764e347 | ||
|
|
de62d0655e | ||
|
|
38aecff886 | ||
|
|
e4a3215257 | ||
|
|
c705b5fbef | ||
|
|
69216b4c5e | ||
|
|
5d2930745a | ||
|
|
8fc3d1ef24 | ||
|
|
d33e4fb0ed | ||
|
|
39b48b566f | ||
|
|
2f982ff9c7 | ||
|
|
1217ef1b56 | ||
|
|
c9943d70ec | ||
|
|
08dca57eb4 | ||
|
|
bb3377407a | ||
|
|
084b9493d1 | ||
|
|
279a251c78 | ||
|
|
a49ef286e8 | ||
|
|
0b3da59947 | ||
|
|
1f725dd68a | ||
|
|
2272f76479 | ||
|
|
cf4762071c | ||
|
|
d86b0bed1f | ||
|
|
12f825204b | ||
|
|
62c9d1db45 | ||
|
|
1127551369 | ||
|
|
8cb58b8517 | ||
|
|
d03e931b67 | ||
|
|
9ba2b32b36 | ||
|
|
cf5689a77a | ||
|
|
c23dbb79af | ||
|
|
7e55d8d3e2 | ||
|
|
d4f23d45a4 | ||
|
|
93fa1645e7 | ||
|
|
7bdada4a10 | ||
|
|
2b47d24ab7 | ||
|
|
24695348fb | ||
|
|
38b6482af5 | ||
|
|
501bc138c5 | ||
|
|
df8c05cd6c | ||
|
|
edcc4f3567 | ||
|
|
3759dbb463 | ||
|
|
b673931c05 | ||
|
|
137e43b040 | ||
|
|
79211d9bbf | ||
|
|
16d4b84a5d | ||
|
|
5ea4537046 | ||
|
|
d51433ff82 | ||
|
|
54ab74d305 | ||
|
|
e8b8f34f41 | ||
|
|
7535f1d3d8 | ||
|
|
3af0dfb4ae | ||
|
|
78547b8175 | ||
|
|
976fbc0bb0 | ||
|
|
28a9aa774f | ||
|
|
51f5ff3842 | ||
|
|
e1e18f62bb | ||
|
|
0a09117328 | ||
|
|
c3df12746f | ||
|
|
2ec6a23fb3 | ||
|
|
0d6b784de1 | ||
|
|
2dcd2c03db | ||
|
|
9d6d0bbb7d | ||
|
|
89c1314abe | ||
|
|
f33211d100 | ||
|
|
4317079bf3 | ||
|
|
c745c282c9 | ||
|
|
7dca45db57 | ||
|
|
de3c47fe21 | ||
|
|
a8a255db4a | ||
|
|
307d63b631 | ||
|
|
de54f6a5a5 | ||
|
|
0dff116340 | ||
|
|
e053dc8434 | ||
|
|
20f6ba1563 | ||
|
|
557a08ea77 | ||
|
|
8eccc819d6 | ||
|
|
347d4a0184 | ||
|
|
0147f5d284 | ||
|
|
1da034ce66 | ||
|
|
5fc7552572 | ||
|
|
083efe3ae9 | ||
|
|
9d2382a2d2 | ||
|
|
f731daae1a | ||
|
|
b7f0e3f573 | ||
|
|
e7c523dab7 | ||
|
|
9f4f15a29c | ||
|
|
b2dc89c50e | ||
|
|
389bf05800 | ||
|
|
a632a62efd | ||
|
|
2edf6e1c68 | ||
|
|
56158e881b | ||
|
|
6b5ed495d5 | ||
|
|
9652c285f1 | ||
|
|
ba171cc10d | ||
|
|
ebb191adba |
@@ -1,4 +1,5 @@
|
|||||||
/.bundle
|
/.bundle
|
||||||
|
/.rbenv-version
|
||||||
/coverage
|
/coverage
|
||||||
/example/log/*
|
/example/log/*
|
||||||
/man/*.html
|
/man/*.html
|
||||||
|
|||||||
+180
-169
@@ -1,190 +1,201 @@
|
|||||||
## 0.37.0.pre5 2012-01-24 9632227
|
## 0.45.0 (2012-04-26)
|
||||||
0.37.0.pre5 [David Dollar]
|
|
||||||
Merge pull request #142 from apollo13/master [David Dollar]
|
|
||||||
rename readme [David Dollar]
|
|
||||||
Fix the test for an empty string in bin/runner [Florian Apolloner]
|
|
||||||
|
|
||||||
## 0.37.0.pre4 2012-01-24 a040324
|
* create and chown log dir in upstart export. [Phil Hagelberg]
|
||||||
0.37.0.pre4 [David Dollar]
|
* remove parka from dist files [David Dollar]
|
||||||
Merge pull request #130 from clowder/foreman [David Dollar]
|
|
||||||
Don't expose the options hash. [Chris Lowder]
|
|
||||||
Simplify subclassing by adding all arguments to the initializer. Also, clean up the method signatures for existing exporters. [Chris Lowder]
|
|
||||||
Add ZenTest as a development dependency, there is an autotest folder but the gem is missing. [Chris Lowder]
|
|
||||||
Attempt to require the custom export class. [Chris Lowder]
|
|
||||||
Catching more than we need to. [Chris Lowder]
|
|
||||||
Extract commonality into the base class, make life easy for our plugin writers. [Chris Lowder]
|
|
||||||
Removing the hard coding of export formats allowing the user to 'plug-in' their own export format. [Chris Lowder]
|
|
||||||
Update README.markdown [David Dollar]
|
|
||||||
Revert "try on more rubies" [David Dollar]
|
|
||||||
try on more rubies [David Dollar]
|
|
||||||
fix webhook url [David Dollar]
|
|
||||||
Update README.markdown [David Dollar]
|
|
||||||
Update README.markdown [David Dollar]
|
|
||||||
ensure we have non-nil data, fixes #111 [David Dollar]
|
|
||||||
make sure error method exists. fixes #104 [David Dollar]
|
|
||||||
Merge pull request #136 from fnichol/foreman [David Dollar]
|
|
||||||
remove other from install instructions [David Dollar]
|
|
||||||
cleanup [David Dollar]
|
|
||||||
Revert "tweak authors" [David Dollar]
|
|
||||||
tweak authors [David Dollar]
|
|
||||||
fix authors [David Dollar]
|
|
||||||
readme tweaks [David Dollar]
|
|
||||||
readme tweaks [David Dollar]
|
|
||||||
fix up authors [David Dollar]
|
|
||||||
Update README.markdown [David Dollar]
|
|
||||||
fix up specs [David Dollar]
|
|
||||||
we're not chdiring any more [David Dollar]
|
|
||||||
use strings rather than symbols to better emulate the real thing [David Dollar]
|
|
||||||
Merge pull request #139 from brainopia/foreman [David Dollar]
|
|
||||||
Add specs for Foreman::Process#run [brainopia]
|
|
||||||
Implement Foreman::Process#kill,detach,alive?,dead? [brainopia]
|
|
||||||
- Use explicit fakefs tag in specs - Clean up trailing whitespace [brainopia]
|
|
||||||
Simplify Foreman::Process#with_environment [brainopia]
|
|
||||||
Add specs for options of Foreman::Process#run [brainopia]
|
|
||||||
Add specs for initialization of Foreman::Process [brainopia]
|
|
||||||
runit creates a full path to export directory. [Fletcher Nichol]
|
|
||||||
|
|
||||||
## 0.37.0.pre3 2012-01-22 51eee01
|
## 0.44.0 (2012-04-23)
|
||||||
0.37.0.pre3 [David Dollar]
|
|
||||||
normalize platform names [David Dollar]
|
|
||||||
windows support [David Dollar]
|
|
||||||
add windows support [David Dollar]
|
|
||||||
dont need pty [David Dollar]
|
|
||||||
fix specs [David Dollar]
|
|
||||||
|
|
||||||
## 0.37.0.pre2 2012-01-22 2995a60
|
* make var output order repeatable in supervisord export [David Dollar]
|
||||||
0.37.0.pre2 [David Dollar]
|
* make --procfile and --app-root influence each other in a more intuitive way [David Dollar]
|
||||||
0.37.0.pre1 [David Dollar]
|
* Look for .env and app_root in the same dir as the Procfile. [Phil Hagelberg]
|
||||||
remove unnecessary stdout/stderr flattening [David Dollar]
|
|
||||||
use PLATFORM=jruby instead of JRUBY=true [David Dollar]
|
|
||||||
|
|
||||||
## 0.37.0.pre1 2012-01-22 3e98170
|
## 0.43.0 (2012-04-20)
|
||||||
fix java build bug [David Dollar]
|
|
||||||
dont do rubygems/bundler in the Rakefile [David Dollar]
|
|
||||||
switch to posix-spawn for jruby [David Dollar]
|
|
||||||
add jruby build [David Dollar]
|
|
||||||
spork is in the gemspec now [David Dollar]
|
|
||||||
remove debugging [David Dollar]
|
|
||||||
move the spoon require into the jruby branch [David Dollar]
|
|
||||||
pass basedir along to the runner script [David Dollar]
|
|
||||||
beef up the runner script to allow a working directory to be set [David Dollar]
|
|
||||||
Merge pull request #140 from jc00ke/foreman [David Dollar]
|
|
||||||
Move spoon dep to Gemfile [jc00ke]
|
|
||||||
Using spoon for JRuby support [jc00ke]
|
|
||||||
use default bucket for storage [David Dollar]
|
|
||||||
Merge pull request #138 from technomancy/debian [David Dollar]
|
|
||||||
Add Debian packaging. [Phil Hagelberg]
|
|
||||||
Ignore vendor dir. [Phil Hagelberg]
|
|
||||||
|
|
||||||
## 0.36.1 2012-01-18 1485eeb
|
* wrap supervisord env vars in quotes [Raphael Randschau]
|
||||||
0.36.1 [David Dollar]
|
|
||||||
bump term-ansicolor in gemspec [David Dollar]
|
|
||||||
|
|
||||||
## 0.36.0 2012-01-17 a73dce5
|
## 0.42.0 (2012-04-18)
|
||||||
0.36.0 [David Dollar]
|
|
||||||
sync the writer stream [David Dollar]
|
|
||||||
capture stderr as well [David Dollar]
|
|
||||||
|
|
||||||
## 0.35.0 2012-01-16 2bfc065
|
* Move read_environment to a public class method. [Phil Hagelberg]
|
||||||
update rake [David Dollar]
|
* Drop parka dependency [Phil Hagelberg]
|
||||||
0.35.0 [David Dollar]
|
* add group support for supervisord [Raphael Randschau]
|
||||||
Merge pull request #132 from Viximo/feature/concurrency [David Dollar]
|
* fix enviroment export [Raphael Randschau]
|
||||||
Fix export specs [Matt Griffin]
|
|
||||||
Merge branch 'master' of https://github.com/michaeldwan/foreman into feature/concurrency [Matt Griffin]
|
|
||||||
default process concurrency is 0 when concurrency options specified, otherwise default concurrency is 1 [Michael Dwan]
|
|
||||||
|
|
||||||
## 0.34.1 2012-01-16 d4c2332
|
## 0.41.0 (2012-03-16)
|
||||||
0.34.1 [David Dollar]
|
|
||||||
fix missing start desc [David Dollar]
|
|
||||||
|
|
||||||
## 0.34.0 2012-01-16 a278755
|
* replace term-ansicolor with built-in colorization [David Dollar]
|
||||||
0.34.0 [David Dollar]
|
* supervisord export template [Raphael Randschau]
|
||||||
update man page [David Dollar]
|
|
||||||
update docs for -d [David Dollar]
|
|
||||||
Merge pull request #101 from ndbroadbent/foreman [David Dollar]
|
|
||||||
Wrap around to the first colour when all the colours are used [Craig R Webster]
|
|
||||||
run specs in random order [David Dollar]
|
|
||||||
update rspec [David Dollar]
|
|
||||||
pedantry [David Dollar]
|
|
||||||
Set executable bit on runit run scripts. [Matthijs Langenberg]
|
|
||||||
Merge pull request #114 from gburt/master [David Dollar]
|
|
||||||
add more colors [Gabriel Burt]
|
|
||||||
Added option to specify app_root, if executing a Procfile from a shared location [Nathan Broadbent]
|
|
||||||
|
|
||||||
## 0.33.1 2012-01-16 533139e
|
## 0.40.0 (2012-02-24)
|
||||||
0.33.1 [David Dollar]
|
|
||||||
Merge pull request #129 from fnichol/resolve-home-template [David Dollar]
|
|
||||||
Expand template path under user's home directory. [Fletcher Nichol]
|
|
||||||
|
|
||||||
## 0.33.0 2012-01-15 cf269c3
|
* support various quoting styles in .env [David Dollar]
|
||||||
0.33.0 [David Dollar]
|
* remove load_env! as it's made unnecessary by foreman run [David Dollar]
|
||||||
Revert "Merge pull request #125 from brainopia/master" [David Dollar]
|
* Provide a useful error if `foreman check` fails to find a Procfile [R. Tyler Croy]
|
||||||
|
* update docs [David Dollar]
|
||||||
|
|
||||||
## 0.32.0 2012-01-12 83748cb
|
## 0.39.0 (2012-02-07)
|
||||||
0.32.0 [David Dollar]
|
|
||||||
Merge pull request #125 from brainopia/master [David Dollar]
|
|
||||||
Merge pull request #121 from Viximo/feature/run [David Dollar]
|
|
||||||
Return some whitespace that was accidentally removed [Matt Griffin]
|
|
||||||
Steal the run method back from Thor so that it can be used in place for exec for running commands in the foreman environment. [Matt Griffin]
|
|
||||||
Remove old cruft [brainopia]
|
|
||||||
In case someone wants to use bin/runner directly [brainopia]
|
|
||||||
Fix for double fork [brainopia]
|
|
||||||
Use ruby exec which works with escaped cmd and replaces shell [brainopia]
|
|
||||||
Fix foreman to work with cmds containing pipes and redirects [brainopia]
|
|
||||||
Add "exec" action to allow execution of arbitrary commands with the app's environment. [Matt Griffin]
|
|
||||||
tweak readme [David Dollar]
|
|
||||||
|
|
||||||
## 0.31.0 2012-01-04 342d30b
|
* rename bin/runner to bin/foreman-runner [David Dollar]
|
||||||
0.31.0 [David Dollar]
|
* fix tgz release [David Dollar]
|
||||||
make fork more robust [David Dollar]
|
* bundle update hpricot [John Firebaugh]
|
||||||
remove unnecessary debug [David Dollar]
|
* touch up .pkg release tasks [David Dollar]
|
||||||
add more information when shutting down [David Dollar]
|
|
||||||
Merge pull request #110 from lstoll/master [David Dollar]
|
|
||||||
Use different port ranges for each process type [Lincoln Stoll]
|
|
||||||
|
|
||||||
## 0.30.1 2011-12-23 fcfa913
|
## 0.38.0 (2012-02-02)
|
||||||
0.30.1 [David Dollar]
|
|
||||||
require thread for mutex [David Dollar]
|
|
||||||
|
|
||||||
## 0.30.0 2011-12-22 fc95936
|
* bring back single process starting [David Dollar]
|
||||||
0.30.0 [David Dollar]
|
* more attempts at getting ci working with jruby [David Dollar]
|
||||||
compatibility with ruby 1.8 [David Dollar]
|
* ignore .rbenv-version [David Dollar]
|
||||||
|
* force to binary encoding if supported [David Dollar]
|
||||||
|
|
||||||
## 0.29.0 2011-12-22 356c61f
|
## 0.37.2 (2012-01-29)
|
||||||
0.29.0 [David Dollar]
|
|
||||||
|
|
||||||
## 0.28.0.pre2 2011-12-08 dcff4da
|
* handle directories with spaces in runner [David Dollar]
|
||||||
0.28.0.pre2 [David Dollar]
|
* update docs [David Dollar]
|
||||||
fix pipe error [David Dollar]
|
|
||||||
|
|
||||||
## 0.28.0.pre1 2011-12-08 c7b6b33
|
## 0.37.1 (2012-01-29)
|
||||||
0.28.0.pre1 [David Dollar]
|
|
||||||
Merge branch 'fork' [David Dollar]
|
|
||||||
wip [David Dollar]
|
|
||||||
wip [David Dollar]
|
|
||||||
wip [David Dollar]
|
|
||||||
wip [David Dollar]
|
|
||||||
wip [David Dollar]
|
|
||||||
|
|
||||||
## 0.27.0 2011-12-05 914a1ee
|
* use binary pipes to better handle UTF-8 data [David Dollar]
|
||||||
0.27.0 [David Dollar]
|
* set up example procfile with UTF-8 item [David Dollar]
|
||||||
add changelog [David Dollar]
|
* remove autotest [David Dollar]
|
||||||
Merge pull request #103 from csquared/load_env_from_irb [David Dollar]
|
* fix up authors generation [David Dollar]
|
||||||
refactor load_env to apply_environment [Chris Continanza]
|
* fix up packaging after moving tasks [David Dollar]
|
||||||
rename load! to load_env! [Chris Continanza]
|
* fix up changelog tasks [David Dollar]
|
||||||
use ./.env as default [Chris Continanza]
|
|
||||||
load contents from env file [Chris Continanza]
|
|
||||||
refactor engine to expose env methods [Chris Continanza]
|
|
||||||
disable email notifications [David Dollar]
|
|
||||||
add travis config [David Dollar]
|
|
||||||
|
|
||||||
## 0.26.1 2011-12-05 a5e0943
|
## 0.37.0 (2012-01-29)
|
||||||
|
|
||||||
Merge pull request #103 from csquared/load_env_from_irb [David Dollar]
|
* put an entire line of output inside a single mutex so we don't cross the streams [David Dollar]
|
||||||
refactor load_env to apply_environment [Chris Continanza]
|
* fix race condition with process termination [David Dollar]
|
||||||
rename load! to load_env! [Chris Continanza]
|
* allow external custom exporters [Chris Lowder]
|
||||||
use ./.env as default [Chris Continanza]
|
* fix the test for an empty string in bin/runner [Florian Apolloner]
|
||||||
load contents from env file [Chris Continanza]
|
* ensure we have non-nil data, fixes #111 [David Dollar]
|
||||||
refactor engine to expose env methods [Chris Continanza]
|
* make sure error method exists, fixes #104 [David Dollar]
|
||||||
disable email notifications [David Dollar]
|
* clean up chdir usage [David Dollar]
|
||||||
add travis config [David Dollar]
|
* normalize platform names [David Dollar]
|
||||||
|
* add windows support [David Dollar]
|
||||||
|
* add jruby support [David Dollar]
|
||||||
|
* pass basedir along to the runner script [David Dollar]
|
||||||
|
* harden runner script [David Dollar]
|
||||||
|
* add many missing specs [brainopia]
|
||||||
|
* clean up fakefs usage in specs [brainopia]
|
||||||
|
* runit creates a full path to export directory. [Fletcher Nichol]
|
||||||
|
|
||||||
|
## 0.36.1 (2012-01-18)
|
||||||
|
|
||||||
|
* 0.36.1 [David Dollar]
|
||||||
|
* bump term-ansicolor in gemspec [David Dollar]
|
||||||
|
|
||||||
|
## 0.36.0 (2012-01-17)
|
||||||
|
|
||||||
|
* 0.36.0 [David Dollar]
|
||||||
|
* sync the writer stream [David Dollar]
|
||||||
|
* capture stderr as well [David Dollar]
|
||||||
|
|
||||||
|
## 0.35.0 (2012-01-16)
|
||||||
|
|
||||||
|
* update rake [David Dollar]
|
||||||
|
* 0.35.0 [David Dollar]
|
||||||
|
* Merge pull request #132 from Viximo/feature/concurrency [David Dollar]
|
||||||
|
* Fix export specs [Matt Griffin]
|
||||||
|
* Merge branch 'master' of https://github.com/michaeldwan/foreman into feature/concurrency [Matt Griffin]
|
||||||
|
* default process concurrency is 0 when concurrency options specified, otherwise default concurrency is 1 [Michael Dwan]
|
||||||
|
|
||||||
|
## 0.34.1 (2012-01-16)
|
||||||
|
|
||||||
|
* 0.34.1 [David Dollar]
|
||||||
|
* fix missing start desc [David Dollar]
|
||||||
|
|
||||||
|
## 0.34.0 (2012-01-16)
|
||||||
|
|
||||||
|
* 0.34.0 [David Dollar]
|
||||||
|
* update man page [David Dollar]
|
||||||
|
* update docs for -d [David Dollar]
|
||||||
|
* Merge pull request #101 from ndbroadbent/foreman [David Dollar]
|
||||||
|
* Wrap around to the first colour when all the colours are used [Craig R Webster]
|
||||||
|
* run specs in random order [David Dollar]
|
||||||
|
* update rspec [David Dollar]
|
||||||
|
* pedantry [David Dollar]
|
||||||
|
* Set executable bit on runit run scripts. [Matthijs Langenberg]
|
||||||
|
* Merge pull request #114 from gburt/master [David Dollar]
|
||||||
|
* add more colors [Gabriel Burt]
|
||||||
|
* Added option to specify app_root, if executing a Procfile from a shared location [Nathan Broadbent]
|
||||||
|
|
||||||
|
## 0.33.1 (2012-01-16)
|
||||||
|
|
||||||
|
* 0.33.1 [David Dollar]
|
||||||
|
* Merge pull request #129 from fnichol/resolve-home-template [David Dollar]
|
||||||
|
* Expand template path under user's home directory. [Fletcher Nichol]
|
||||||
|
|
||||||
|
## 0.33.0 (2012-01-15)
|
||||||
|
|
||||||
|
* 0.33.0 [David Dollar]
|
||||||
|
* Revert "Merge pull request #125 from brainopia/master" [David Dollar]
|
||||||
|
|
||||||
|
## 0.32.0 (2012-01-12)
|
||||||
|
|
||||||
|
* 0.32.0 [David Dollar]
|
||||||
|
* Merge pull request #125 from brainopia/master [David Dollar]
|
||||||
|
* Merge pull request #121 from Viximo/feature/run [David Dollar]
|
||||||
|
* Return some whitespace that was accidentally removed [Matt Griffin]
|
||||||
|
* Steal the run method back from Thor so that it can be used in place for exec for running commands in the foreman environment. [Matt Griffin]
|
||||||
|
* Remove old cruft [brainopia]
|
||||||
|
* In case someone wants to use bin/runner directly [brainopia]
|
||||||
|
* Fix for double fork [brainopia]
|
||||||
|
* Use ruby exec which works with escaped cmd and replaces shell [brainopia]
|
||||||
|
* Fix foreman to work with cmds containing pipes and redirects [brainopia]
|
||||||
|
* Add "exec" action to allow execution of arbitrary commands with the app's environment. [Matt Griffin]
|
||||||
|
* tweak readme [David Dollar]
|
||||||
|
|
||||||
|
## 0.31.0 (2012-01-04)
|
||||||
|
|
||||||
|
* 0.31.0 [David Dollar]
|
||||||
|
* make fork more robust [David Dollar]
|
||||||
|
* remove unnecessary debug [David Dollar]
|
||||||
|
* add more information when shutting down [David Dollar]
|
||||||
|
* Merge pull request #110 from lstoll/master [David Dollar]
|
||||||
|
* Use different port ranges for each process type [Lincoln Stoll]
|
||||||
|
|
||||||
|
## 0.30.1 (2011-12-23)
|
||||||
|
|
||||||
|
* 0.30.1 [David Dollar]
|
||||||
|
* require thread for mutex [David Dollar]
|
||||||
|
|
||||||
|
## 0.30.0 (2011-12-22)
|
||||||
|
|
||||||
|
* 0.30.0 [David Dollar]
|
||||||
|
* compatibility with ruby 1.8 [David Dollar]
|
||||||
|
|
||||||
|
## 0.29.0 (2011-12-22)
|
||||||
|
|
||||||
|
* 0.29.0 [David Dollar]
|
||||||
|
* 0.28.0.pre2 [David Dollar]
|
||||||
|
* fix pipe error [David Dollar]
|
||||||
|
* 0.28.0.pre1 [David Dollar]
|
||||||
|
* Merge branch 'fork' [David Dollar]
|
||||||
|
* wip [David Dollar]
|
||||||
|
* wip [David Dollar]
|
||||||
|
* wip [David Dollar]
|
||||||
|
* wip [David Dollar]
|
||||||
|
* wip [David Dollar]
|
||||||
|
|
||||||
|
## 0.27.0 (2011-12-05)
|
||||||
|
|
||||||
|
* 0.27.0 [David Dollar]
|
||||||
|
* add changelog [David Dollar]
|
||||||
|
* Merge pull request #103 from csquared/load_env_from_irb [David Dollar]
|
||||||
|
* refactor load_env to apply_environment [Chris Continanza]
|
||||||
|
* rename load! to load_env! [Chris Continanza]
|
||||||
|
* use ./.env as default [Chris Continanza]
|
||||||
|
* load contents from env file [Chris Continanza]
|
||||||
|
* refactor engine to expose env methods [Chris Continanza]
|
||||||
|
* disable email notifications [David Dollar]
|
||||||
|
* add travis config [David Dollar]
|
||||||
|
|
||||||
|
## 0.26.1 2011-12-05
|
||||||
|
|
||||||
|
* Merge pull request #103 from csquared/load_env_from_irb [David Dollar]
|
||||||
|
* refactor load_env to apply_environment [Chris Continanza]
|
||||||
|
* rename load! to load_env! [Chris Continanza]
|
||||||
|
* use ./.env as default [Chris Continanza]
|
||||||
|
* load contents from env file [Chris Continanza]
|
||||||
|
* refactor engine to expose env methods [Chris Continanza]
|
||||||
|
* disable email notifications [David Dollar]
|
||||||
|
* add travis config [David Dollar]
|
||||||
|
|||||||
@@ -11,14 +11,11 @@ platform :jruby do
|
|||||||
end
|
end
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem 'parka'
|
gem 'aws-s3'
|
||||||
gem 'rake'
|
gem 'rake'
|
||||||
gem 'ronn'
|
gem 'ronn'
|
||||||
gem 'fakefs', '~> 0.3.2'
|
gem 'fakefs', '~> 0.3.2'
|
||||||
gem 'rr', '~> 1.0.2'
|
gem 'rr', '~> 1.0.2'
|
||||||
gem 'rspec', '~> 2.0'
|
gem 'rspec', '~> 2.0'
|
||||||
gem 'ZenTest'
|
|
||||||
gem 'aws-s3'
|
|
||||||
gem "rubyzip"
|
|
||||||
gem "simplecov", :require => false
|
gem "simplecov", :require => false
|
||||||
end
|
end
|
||||||
|
|||||||
+3
-17
@@ -1,36 +1,27 @@
|
|||||||
PATH
|
PATH
|
||||||
remote: .
|
remote: .
|
||||||
specs:
|
specs:
|
||||||
foreman (0.37.0)
|
foreman (0.45.0)
|
||||||
term-ansicolor (~> 1.0.7)
|
|
||||||
thor (>= 0.13.6)
|
thor (>= 0.13.6)
|
||||||
|
|
||||||
GEM
|
GEM
|
||||||
remote: http://rubygems.org/
|
remote: http://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
ZenTest (4.6.2)
|
|
||||||
aws-s3 (0.6.2)
|
aws-s3 (0.6.2)
|
||||||
builder
|
builder
|
||||||
mime-types
|
mime-types
|
||||||
xml-simple
|
xml-simple
|
||||||
builder (3.0.0)
|
builder (3.0.0)
|
||||||
crack (0.1.8)
|
|
||||||
diff-lcs (1.1.3)
|
diff-lcs (1.1.3)
|
||||||
fakefs (0.3.2)
|
fakefs (0.3.2)
|
||||||
hpricot (0.8.2)
|
hpricot (0.8.6)
|
||||||
hpricot (0.8.2-java)
|
hpricot (0.8.6-java)
|
||||||
mime-types (1.16)
|
mime-types (1.16)
|
||||||
multi_json (1.0.4)
|
multi_json (1.0.4)
|
||||||
mustache (0.11.2)
|
mustache (0.11.2)
|
||||||
parka (0.6.2)
|
|
||||||
crack
|
|
||||||
rest-client
|
|
||||||
thor
|
|
||||||
posix-spawn (0.3.6)
|
posix-spawn (0.3.6)
|
||||||
rake (0.9.2.2)
|
rake (0.9.2.2)
|
||||||
rdiscount (1.6.5)
|
rdiscount (1.6.5)
|
||||||
rest-client (1.6.1)
|
|
||||||
mime-types (>= 1.16)
|
|
||||||
ronn (0.7.3)
|
ronn (0.7.3)
|
||||||
hpricot (>= 0.8.2)
|
hpricot (>= 0.8.2)
|
||||||
mustache (>= 0.7.0)
|
mustache (>= 0.7.0)
|
||||||
@@ -44,12 +35,10 @@ GEM
|
|||||||
rspec-expectations (2.8.0)
|
rspec-expectations (2.8.0)
|
||||||
diff-lcs (~> 1.1.2)
|
diff-lcs (~> 1.1.2)
|
||||||
rspec-mocks (2.8.0)
|
rspec-mocks (2.8.0)
|
||||||
rubyzip (0.9.4)
|
|
||||||
simplecov (0.5.4)
|
simplecov (0.5.4)
|
||||||
multi_json (~> 1.0.3)
|
multi_json (~> 1.0.3)
|
||||||
simplecov-html (~> 0.5.3)
|
simplecov-html (~> 0.5.3)
|
||||||
simplecov-html (0.5.3)
|
simplecov-html (0.5.3)
|
||||||
term-ansicolor (1.0.7)
|
|
||||||
thor (0.14.6)
|
thor (0.14.6)
|
||||||
win32console (1.3.0-x86-mingw32)
|
win32console (1.3.0-x86-mingw32)
|
||||||
xml-simple (1.0.15)
|
xml-simple (1.0.15)
|
||||||
@@ -60,16 +49,13 @@ PLATFORMS
|
|||||||
x86-mingw32
|
x86-mingw32
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
ZenTest
|
|
||||||
aws-s3
|
aws-s3
|
||||||
fakefs (~> 0.3.2)
|
fakefs (~> 0.3.2)
|
||||||
foreman!
|
foreman!
|
||||||
parka
|
|
||||||
posix-spawn (~> 0.3.6)
|
posix-spawn (~> 0.3.6)
|
||||||
rake
|
rake
|
||||||
ronn
|
ronn
|
||||||
rr (~> 1.0.2)
|
rr (~> 1.0.2)
|
||||||
rspec (~> 2.0)
|
rspec (~> 2.0)
|
||||||
rubyzip
|
|
||||||
simplecov
|
simplecov
|
||||||
win32console (~> 1.3.0)
|
win32console (~> 1.3.0)
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ Manage Procfile-based applications
|
|||||||
|
|
||||||
* [man page](http://ddollar.github.com/foreman)
|
* [man page](http://ddollar.github.com/foreman)
|
||||||
* [wiki](http://github.com/ddollar/foreman/wiki)
|
* [wiki](http://github.com/ddollar/foreman/wiki)
|
||||||
|
* [changelog](https://github.com/ddollar/foreman/blob/master/Changelog.md)
|
||||||
|
|
||||||
## Authors
|
## Authors
|
||||||
|
|
||||||
@@ -32,7 +33,7 @@ Manage Procfile-based applications
|
|||||||
David Dollar
|
David Dollar
|
||||||
|
|
||||||
#### Patches contributed by
|
#### Patches contributed by
|
||||||
Adam Wiggins, Chris Continanza, Chris Lowder, Craig R Webster, Dan Farina, Dan Peterson, David Dollar, Fletcher Nichol, Gabriel Burt, Gamaliel Toro, Greg Reinacker, Hugues Le Gendre, Hunter Nield, Iain Hecker, Jay Zeschin, Keith Rarick, Khaja Minhajuddin, Lincoln Stoll, Marcos Muino Garcia, Mark McGranaghan, Matt Griffin, Matt Haynes, Matthijs Langenberg, Michael Dwan, Michael van Rooijen, Mike Javorski, Nathan Broadbent, Nathan L Smith, Nick Zadrozny, Phil Hagelberg, Ricardo Chimal, Jr, Thom May, Tom Ward, brainopia, clifff, jc00ke
|
[Contributor List](https://github.com/ddollar/foreman/contributors)
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
$:.unshift File.expand_path("../lib", __FILE__)
|
$:.unshift File.expand_path("../lib", __FILE__)
|
||||||
require "foreman"
|
require "foreman"
|
||||||
|
|
||||||
|
require "bundler/setup"
|
||||||
|
|
||||||
Dir[File.expand_path("../tasks/*.rake", __FILE__)].each do |task|
|
Dir[File.expand_path("../tasks/*.rake", __FILE__)].each do |task|
|
||||||
load task
|
load task
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
Autotest.add_discovery { "rspec2" }
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
#
|
#
|
||||||
#/ Usage: runner [-d <dir>] <command>
|
#/ Usage: foreman-runner [-d <dir>] <command>
|
||||||
#/
|
#/
|
||||||
#/ Run a command with exec, optionally changing directory first
|
#/ Run a command with exec, optionally changing directory first
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ usage() {
|
|||||||
|
|
||||||
while getopts ":hd:" OPT; do
|
while getopts ":hd:" OPT; do
|
||||||
case $OPT in
|
case $OPT in
|
||||||
d) cd $OPTARG ;;
|
d) cd "$OPTARG" ;;
|
||||||
h) usage ;;
|
h) usage ;;
|
||||||
\?) error "invalid option: -$OPTARG" ;;
|
\?) error "invalid option: -$OPTARG" ;;
|
||||||
:) error "option -$OPTARG requires an argument" ;;
|
:) error "option -$OPTARG requires an argument" ;;
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
ticker: ruby ./ticker $PORT
|
ticker: ruby ./ticker $PORT
|
||||||
error: ruby ./error
|
error: ruby ./error
|
||||||
|
utf8: ruby ./utf8
|
||||||
|
|||||||
Executable
+11
@@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
# encoding: BINARY
|
||||||
|
|
||||||
|
$stdout.sync = true
|
||||||
|
|
||||||
|
while true
|
||||||
|
puts "\u65e5\u672c\u8a9e\u6587\u5b57\u5217"
|
||||||
|
puts "\u0915\u0932\u094d\u0907\u0928\u0643\u0637\u0628\u041a\u0430\u043b\u0438\u043d\u0430"
|
||||||
|
puts "\xff\x03"
|
||||||
|
sleep 1
|
||||||
|
end
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<%
|
||||||
|
app_names = []
|
||||||
|
engine.procfile.entries.each do |process|
|
||||||
|
next if (conc = self.concurrency[process.name]) < 1
|
||||||
|
1.upto(self.concurrency[process.name]) do |num|
|
||||||
|
port = engine.port_for(process, num, self.port)
|
||||||
|
name = if (conc > 1); "#{process.name}-#{num}" else process.name; end
|
||||||
|
environment = (engine.environment.keys.sort.map{ |var| %{#{var.upcase}="#{engine.environment[var]}"} } + [%{PORT="#{port}"}])
|
||||||
|
app_name = "#{app}-#{name}"
|
||||||
|
app_names << app_name
|
||||||
|
%>
|
||||||
|
[program:<%= app_name %>]
|
||||||
|
command=<%= process.command %>
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stopsignal=QUIT
|
||||||
|
stdout_logfile=<%= log_root %>/<%=process.name%>-<%=num%>-out.log
|
||||||
|
stderr_logfile=<%= log_root %>/<%=process.name%>-<%=num%>-err.log
|
||||||
|
user=<%= user %>
|
||||||
|
directory=<%= engine.directory %>
|
||||||
|
environment=<%= environment.join(',') %><%
|
||||||
|
end
|
||||||
|
end
|
||||||
|
%>
|
||||||
|
|
||||||
|
[group:<%= app %>]
|
||||||
|
programs=<%= app_names.join(',') %>
|
||||||
Vendored
+1
-1
@@ -4,7 +4,7 @@ file pkg("/apt-#{version}/foreman-#{version}.deb") => distribution_files("deb")
|
|||||||
assemble_distribution
|
assemble_distribution
|
||||||
assemble_gems
|
assemble_gems
|
||||||
assemble resource("deb/foreman"), "bin/foreman", 0755
|
assemble resource("deb/foreman"), "bin/foreman", 0755
|
||||||
File.chmod 0755, "bin/runner"
|
File.chmod 0755, "bin/foreman-runner"
|
||||||
end
|
end
|
||||||
|
|
||||||
assemble resource("deb/control"), "control"
|
assemble resource("deb/control"), "control"
|
||||||
|
|||||||
Vendored
+1
-1
@@ -10,5 +10,5 @@ task "gem:clean" do
|
|||||||
end
|
end
|
||||||
|
|
||||||
task "gem:release" => "gem:build" do |t|
|
task "gem:release" => "gem:build" do |t|
|
||||||
sh "parka push -f #{pkg("foreman-#{version}.gem")}"
|
sh "gem push #{pkg("foreman-#{version}.gem")} || echo 'error'"
|
||||||
end
|
end
|
||||||
|
|||||||
Vendored
+4
-2
@@ -1,5 +1,7 @@
|
|||||||
file pkg("foreman-#{version}-jruby.gem") => distribution_files do |t|
|
file pkg("foreman-#{version}-jruby.gem") => distribution_files do |t|
|
||||||
sh "env PLATFORM=java gem build foreman.gemspec"
|
Bundler.with_clean_env do
|
||||||
|
sh "env PLATFORM=java gem build foreman.gemspec"
|
||||||
|
end
|
||||||
sh "mv foreman-#{version}-java.gem #{t.name}"
|
sh "mv foreman-#{version}-java.gem #{t.name}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -10,5 +12,5 @@ task "jruby:clean" do
|
|||||||
end
|
end
|
||||||
|
|
||||||
task "jruby:release" => "jruby:build" do |t|
|
task "jruby:release" => "jruby:build" do |t|
|
||||||
sh "parka push -f #{pkg("foreman-#{version}-jruby.gem")}"
|
sh "gem push #{pkg("foreman-#{version}-jruby.gem")} || echo 'error'"
|
||||||
end
|
end
|
||||||
|
|||||||
Vendored
+4
-2
@@ -1,5 +1,7 @@
|
|||||||
file pkg("foreman-#{version}-mingw32.gem") => distribution_files do |t|
|
file pkg("foreman-#{version}-mingw32.gem") => distribution_files do |t|
|
||||||
sh "env PLATFORM=mingw32 gem build foreman.gemspec"
|
Bundler.with_clean_env do
|
||||||
|
sh "env PLATFORM=mingw32 gem build foreman.gemspec"
|
||||||
|
end
|
||||||
sh "mv foreman-#{version}-mingw32.gem #{t.name}"
|
sh "mv foreman-#{version}-mingw32.gem #{t.name}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -10,5 +12,5 @@ task "mingw32:clean" do
|
|||||||
end
|
end
|
||||||
|
|
||||||
task "mingw32:release" => "mingw32:build" do |t|
|
task "mingw32:release" => "mingw32:build" do |t|
|
||||||
sh "parka push -f #{pkg("foreman-#{version}-mingw32.gem")}"
|
sh "gem push #{pkg("foreman-#{version}-mingw32.gem")} || echo 'error'"
|
||||||
end
|
end
|
||||||
|
|||||||
Vendored
+8
-7
@@ -13,7 +13,7 @@ file pkg("foreman-#{version}.pkg") => distribution_files do |t|
|
|||||||
|
|
||||||
mkdir_p "pkg"
|
mkdir_p "pkg"
|
||||||
mkdir_p "pkg/Resources"
|
mkdir_p "pkg/Resources"
|
||||||
mkdir_p "pkg/foreman-#{version}.pkg"
|
mkdir_p "pkg/foreman.pkg"
|
||||||
|
|
||||||
dist = File.read(resource("pkg/Distribution.erb"))
|
dist = File.read(resource("pkg/Distribution.erb"))
|
||||||
dist = ERB.new(dist).result(binding)
|
dist = ERB.new(dist).result(binding)
|
||||||
@@ -21,20 +21,21 @@ file pkg("foreman-#{version}.pkg") => distribution_files do |t|
|
|||||||
|
|
||||||
dist = File.read(resource("pkg/PackageInfo.erb"))
|
dist = File.read(resource("pkg/PackageInfo.erb"))
|
||||||
dist = ERB.new(dist).result(binding)
|
dist = ERB.new(dist).result(binding)
|
||||||
File.open("pkg/foreman-#{version}.pkg/PackageInfo", "w") { |f| f.puts dist }
|
File.open("pkg/foreman.pkg/PackageInfo", "w") { |f| f.puts dist }
|
||||||
|
|
||||||
mkdir_p "pkg/foreman-#{version}.pkg/Scripts"
|
mkdir_p "pkg/foreman.pkg/Scripts"
|
||||||
cp resource("pkg/postinstall"), "pkg/foreman-#{version}.pkg/Scripts/postinstall"
|
cp resource("pkg/postinstall"), "pkg/foreman.pkg/Scripts/postinstall"
|
||||||
chmod 0755, "pkg/foreman-#{version}.pkg/Scripts/postinstall"
|
chmod 0755, "pkg/foreman.pkg/Scripts/postinstall"
|
||||||
|
|
||||||
sh %{ mkbom -s foreman pkg/foreman-#{version}.pkg/Bom }
|
sh %{ mkbom -s foreman pkg/foreman.pkg/Bom }
|
||||||
|
|
||||||
Dir.chdir("foreman") do
|
Dir.chdir("foreman") do
|
||||||
sh %{ pax -wz -x cpio . > ../pkg/foreman-#{version}.pkg/Payload }
|
sh %{ pax -wz -x cpio . > ../pkg/foreman.pkg/Payload }
|
||||||
end
|
end
|
||||||
|
|
||||||
sh %{ pkgutil --flatten pkg foreman-#{version}.pkg }
|
sh %{ pkgutil --flatten pkg foreman-#{version}.pkg }
|
||||||
|
|
||||||
|
FileUtils.mkdir_p(File.dirname(t.name))
|
||||||
cp_r "foreman-#{version}.pkg", t.name
|
cp_r "foreman-#{version}.pkg", t.name
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Vendored
+3
-3
@@ -10,14 +10,14 @@
|
|||||||
]]></script>
|
]]></script>
|
||||||
<choices-outline>
|
<choices-outline>
|
||||||
<line choice="git"/>
|
<line choice="git"/>
|
||||||
<line choice="foreman-<%= version %>"/>
|
<line choice="foreman"/>
|
||||||
</choices-outline>
|
</choices-outline>
|
||||||
<choice id="git" title="git" start_selected="false" start_enabled="false" selected="needs_git()" enabled="needs_git()">
|
<choice id="git" title="git" start_selected="false" start_enabled="false" selected="needs_git()" enabled="needs_git()">
|
||||||
<pkg-ref id="git.pkg" />
|
<pkg-ref id="git.pkg" />
|
||||||
</choice>
|
</choice>
|
||||||
<choice id="foreman-<%= version %>" title="foreman">
|
<choice id="foreman" title="foreman">
|
||||||
<pkg-ref id="io.foreman.installer"/>
|
<pkg-ref id="io.foreman.installer"/>
|
||||||
</choice>
|
</choice>
|
||||||
<pkg-ref id="io.foreman.installer" installKBytes="<%= kbytes %>" version="<%= version %>" auth="Root">#foreman-<%= version %>.pkg</pkg-ref>
|
<pkg-ref id="io.foreman.installer" installKBytes="<%= kbytes %>" version="<%= version %>" auth="Root">#foreman.pkg</pkg-ref>
|
||||||
</installer-script>
|
</installer-script>
|
||||||
|
|
||||||
|
|||||||
Vendored
-1
@@ -4,4 +4,3 @@
|
|||||||
<postinstall file="./postinstall"/>
|
<postinstall file="./postinstall"/>
|
||||||
</scripts>
|
</scripts>
|
||||||
</pkg-info>
|
</pkg-info>
|
||||||
|
|
||||||
|
|||||||
Vendored
+1
-1
@@ -3,7 +3,7 @@ file pkg("foreman-#{version}.tgz") => distribution_files do |t|
|
|||||||
mkchdir("foreman") do
|
mkchdir("foreman") do
|
||||||
assemble_distribution
|
assemble_distribution
|
||||||
assemble_gems
|
assemble_gems
|
||||||
rm_rf "bin"
|
rm_f "bin/foreman"
|
||||||
assemble resource("tgz/foreman"), "foreman", 0755
|
assemble resource("tgz/foreman"), "foreman", 0755
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -16,8 +16,7 @@ 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.7'
|
gem.add_dependency 'thor', '>= 0.13.6'
|
||||||
gem.add_dependency 'thor', '>= 0.13.6'
|
|
||||||
|
|
||||||
if ENV["PLATFORM"] == "java"
|
if ENV["PLATFORM"] == "java"
|
||||||
gem.add_dependency "posix-spawn", "~> 0.3.6"
|
gem.add_dependency "posix-spawn", "~> 0.3.6"
|
||||||
|
|||||||
+1
-7
@@ -4,14 +4,8 @@ module Foreman
|
|||||||
|
|
||||||
class AppDoesNotExist < Exception; end
|
class AppDoesNotExist < Exception; end
|
||||||
|
|
||||||
# load contents of env_file into ENV
|
|
||||||
def self.load_env!(env_file = './.env')
|
|
||||||
require 'foreman/engine'
|
|
||||||
Foreman::Engine.load_env!(env_file)
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.runner
|
def self.runner
|
||||||
File.expand_path("../../bin/runner", __FILE__)
|
File.expand_path("../../bin/foreman-runner", __FILE__)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.jruby?
|
def self.jruby?
|
||||||
|
|||||||
+9
-3
@@ -10,7 +10,7 @@ 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", "Start the application"
|
desc "start [PROCESS]", "Start the application (or a specific PROCESS)"
|
||||||
|
|
||||||
class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: Procfile"
|
class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: Procfile"
|
||||||
class_option :app_root, :type => :string, :aliases => "-d", :desc => "Default: Procfile directory"
|
class_option :app_root, :type => :string, :aliases => "-d", :desc => "Default: Procfile directory"
|
||||||
@@ -27,8 +27,9 @@ class Foreman::CLI < Thor
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def start
|
def start(process=nil)
|
||||||
check_procfile!
|
check_procfile!
|
||||||
|
engine.options[:concurrency] = "#{process}=1" if process
|
||||||
engine.start
|
engine.start
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -53,6 +54,7 @@ class Foreman::CLI < Thor
|
|||||||
desc "check", "Validate your application's Procfile"
|
desc "check", "Validate your application's Procfile"
|
||||||
|
|
||||||
def check
|
def check
|
||||||
|
check_procfile!
|
||||||
error "no processes defined" unless engine.procfile.entries.length > 0
|
error "no processes defined" unless engine.procfile.entries.length > 0
|
||||||
puts "valid procfile detected (#{engine.procfile.process_names.join(', ')})"
|
puts "valid procfile detected (#{engine.procfile.process_names.join(', ')})"
|
||||||
end
|
end
|
||||||
@@ -81,7 +83,11 @@ private ######################################################################
|
|||||||
end
|
end
|
||||||
|
|
||||||
def procfile
|
def procfile
|
||||||
options[:procfile] || "Procfile"
|
case
|
||||||
|
when options[:procfile] then options[:procfile]
|
||||||
|
when options[:app_root] then File.expand_path(File.join(options[:app_root], "Procfile"))
|
||||||
|
else "Procfile"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def error(message)
|
def error(message)
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
require "foreman"
|
||||||
|
|
||||||
|
module Foreman::Color
|
||||||
|
|
||||||
|
ANSI = {
|
||||||
|
:reset => 0,
|
||||||
|
:black => 30,
|
||||||
|
:red => 31,
|
||||||
|
:green => 32,
|
||||||
|
:yellow => 33,
|
||||||
|
:blue => 34,
|
||||||
|
:magenta => 35,
|
||||||
|
:cyan => 36,
|
||||||
|
:white => 37,
|
||||||
|
:bright_black => 30,
|
||||||
|
:bright_red => 31,
|
||||||
|
:bright_green => 32,
|
||||||
|
:bright_yellow => 33,
|
||||||
|
:bright_blue => 34,
|
||||||
|
:bright_magenta => 35,
|
||||||
|
:bright_cyan => 36,
|
||||||
|
:bright_white => 37,
|
||||||
|
}
|
||||||
|
|
||||||
|
def self.enable(io)
|
||||||
|
io.extend(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
def color?
|
||||||
|
return false unless self.respond_to?(:isatty)
|
||||||
|
self.isatty && ENV["TERM"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def color(name)
|
||||||
|
return "" unless color?
|
||||||
|
return "" unless ansi = ANSI[name.to_sym]
|
||||||
|
"\e[#{ansi}m"
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
+60
-67
@@ -1,36 +1,33 @@
|
|||||||
require "foreman"
|
require "foreman"
|
||||||
|
require "foreman/color"
|
||||||
require "foreman/process"
|
require "foreman/process"
|
||||||
require "foreman/procfile"
|
require "foreman/procfile"
|
||||||
require "foreman/utils"
|
require "foreman/utils"
|
||||||
require "tempfile"
|
require "tempfile"
|
||||||
require "timeout"
|
require "timeout"
|
||||||
require "term/ansicolor"
|
|
||||||
require "fileutils"
|
require "fileutils"
|
||||||
require "thread"
|
require "thread"
|
||||||
|
|
||||||
class Foreman::Engine
|
class Foreman::Engine
|
||||||
|
|
||||||
|
attr_reader :environment
|
||||||
attr_reader :procfile
|
attr_reader :procfile
|
||||||
attr_reader :directory
|
attr_reader :directory
|
||||||
attr_reader :options
|
attr_reader :options
|
||||||
|
|
||||||
extend Term::ANSIColor
|
COLORS = %w( cyan yellow green magenta red blue intense_cyan intense_yellow
|
||||||
|
intense_green intense_magenta intense_red, intense_blue )
|
||||||
|
|
||||||
COLORS = [ cyan, yellow, green, magenta, red, blue,
|
Foreman::Color.enable($stdout)
|
||||||
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) if File.exists?(procfile)
|
||||||
@directory = options[:app_root] || File.expand_path(File.dirname(procfile))
|
@directory = options[:app_root] || File.expand_path(File.dirname(procfile))
|
||||||
@options = options
|
@options = options.dup
|
||||||
@environment = read_environment_files(options[:env])
|
|
||||||
@output_mutex = Mutex.new
|
@output_mutex = Mutex.new
|
||||||
end
|
|
||||||
|
|
||||||
def self.load_env!(env_file)
|
@options[:env] ||= default_env
|
||||||
@environment = read_environment_files(env_file)
|
@environment = read_environment_files(@options[:env])
|
||||||
apply_environment!
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def start
|
def start
|
||||||
@@ -52,13 +49,33 @@ class Foreman::Engine
|
|||||||
base_port.to_i + offset + num - 1
|
base_port.to_i + offset + num - 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def apply_environment!
|
||||||
|
environment.each { |k,v| ENV[k] = v }
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.read_environment(filename)
|
||||||
|
return {} unless File.exists?(filename)
|
||||||
|
|
||||||
|
File.read(filename).split("\n").inject({}) do |hash, line|
|
||||||
|
if line =~ /\A([A-Za-z_0-9]+)=(.*)\z/
|
||||||
|
key, val = [$1, $2]
|
||||||
|
case val
|
||||||
|
when /\A'(.*)'\z/ then hash[key] = $1
|
||||||
|
when /\A"(.*)"\z/ then hash[key] = $1.gsub(/\\(.)/, '\1')
|
||||||
|
else hash[key] = val
|
||||||
|
end
|
||||||
|
end
|
||||||
|
hash
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private ######################################################################
|
private ######################################################################
|
||||||
|
|
||||||
def spawn_processes
|
def spawn_processes
|
||||||
concurrency = Foreman::Utils.parse_concurrency(@options[:concurrency])
|
concurrency = Foreman::Utils.parse_concurrency(@options[:concurrency])
|
||||||
|
|
||||||
procfile.entries.each do |entry|
|
procfile.entries.each do |entry|
|
||||||
reader, writer = IO.pipe
|
reader, writer = (IO.method(:pipe).arity == 0 ? IO.pipe : IO.pipe("BINARY"))
|
||||||
entry.spawn(concurrency[entry.name], writer, @directory, @environment, port_for(entry, 1, base_port)).each do |process|
|
entry.spawn(concurrency[entry.name], writer, @directory, @environment, port_for(entry, 1, base_port)).each do |process|
|
||||||
running_processes[process.pid] = process
|
running_processes[process.pid] = process
|
||||||
readers[process] = reader
|
readers[process] = reader
|
||||||
@@ -94,19 +111,24 @@ private ######################################################################
|
|||||||
kill_all "SIGKILL"
|
kill_all "SIGKILL"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def poll_readers
|
||||||
|
rs, ws = IO.select(readers.values, [], [], 1)
|
||||||
|
(rs || []).each do |r|
|
||||||
|
data = r.gets
|
||||||
|
next unless data
|
||||||
|
data.force_encoding("BINARY") if data.respond_to?(:force_encoding)
|
||||||
|
ps, message = data.split(",", 2)
|
||||||
|
color = colors[ps.split(".").first]
|
||||||
|
info message, ps, color
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def watch_for_output
|
def watch_for_output
|
||||||
Thread.new do
|
Thread.new do
|
||||||
require "win32console" if Foreman.windows?
|
require "win32console" if Foreman.windows?
|
||||||
begin
|
begin
|
||||||
loop do
|
loop do
|
||||||
rs, ws = IO.select(readers.values, [], [], 1)
|
poll_readers
|
||||||
(rs || []).each do |r|
|
|
||||||
data = r.gets
|
|
||||||
next unless data
|
|
||||||
ps, message = data.split(",", 2)
|
|
||||||
color = colors[ps.split(".").first]
|
|
||||||
info message, ps, color
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
rescue Exception => ex
|
rescue Exception => ex
|
||||||
puts ex.message
|
puts ex.message
|
||||||
@@ -123,11 +145,11 @@ private ######################################################################
|
|||||||
rescue Errno::ECHILD
|
rescue Errno::ECHILD
|
||||||
end
|
end
|
||||||
|
|
||||||
def info(message, name="system", color=Term::ANSIColor.white)
|
def info(message, name="system", color=:white)
|
||||||
output = ""
|
output = ""
|
||||||
output += color
|
output += $stdout.color(color)
|
||||||
output += "#{Time.now.strftime("%H:%M:%S")} #{pad_process_name(name)} | "
|
output += "#{Time.now.strftime("%H:%M:%S")} #{pad_process_name(name)} | "
|
||||||
output += Term::ANSIColor.reset
|
output += $stdout.color(:reset)
|
||||||
output += message.chomp
|
output += message.chomp
|
||||||
puts output
|
puts output
|
||||||
end
|
end
|
||||||
@@ -177,8 +199,8 @@ private ######################################################################
|
|||||||
end
|
end
|
||||||
|
|
||||||
def assign_colors
|
def assign_colors
|
||||||
procfile.entries.each do |entry|
|
procfile.entries.each_with_index do |entry, idx|
|
||||||
colors[entry.name] = next_color
|
colors[entry.name] = COLORS[idx % COLORS.length]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -186,49 +208,20 @@ private ######################################################################
|
|||||||
readers.invert[reader]
|
readers.invert[reader]
|
||||||
end
|
end
|
||||||
|
|
||||||
def next_color
|
def read_environment_files(filenames)
|
||||||
@current_color ||= -1
|
environment = {}
|
||||||
@current_color += 1
|
|
||||||
@current_color = 0 if COLORS.length < @current_color
|
(filenames || "").split(",").map(&:strip).each do |filename|
|
||||||
COLORS[@current_color]
|
error "No such file: #{filename}" unless File.exists?(filename)
|
||||||
|
environment.merge!(Foreman::Engine.read_environment(filename))
|
||||||
|
end
|
||||||
|
|
||||||
|
environment
|
||||||
end
|
end
|
||||||
|
|
||||||
module Env
|
def default_env
|
||||||
attr_reader :environment
|
env = File.join(directory, ".env")
|
||||||
|
File.exists?(env) ? env : ""
|
||||||
def read_environment_files(filenames)
|
|
||||||
environment = {}
|
|
||||||
|
|
||||||
(filenames || "").split(",").map(&:strip).each do |filename|
|
|
||||||
error "No such file: #{filename}" unless File.exists?(filename)
|
|
||||||
environment.merge!(read_environment(filename))
|
|
||||||
end
|
|
||||||
|
|
||||||
environment.merge!(read_environment(".env")) unless filenames
|
|
||||||
environment
|
|
||||||
end
|
|
||||||
|
|
||||||
def read_environment(filename)
|
|
||||||
return {} unless File.exists?(filename)
|
|
||||||
|
|
||||||
File.read(filename).split("\n").inject({}) do |hash, line|
|
|
||||||
if line =~ /\A([A-Za-z_0-9]+)=(.*)\z/
|
|
||||||
hash[$1] = $2
|
|
||||||
end
|
|
||||||
hash
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def apply_environment!
|
|
||||||
@environment.each { |k,v| ENV[k] = v }
|
|
||||||
end
|
|
||||||
|
|
||||||
def error(message)
|
|
||||||
puts "ERROR: #{message}"
|
|
||||||
exit 1
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
include Env
|
|
||||||
extend Env
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -30,3 +30,5 @@ require "foreman/export/inittab"
|
|||||||
require "foreman/export/upstart"
|
require "foreman/export/upstart"
|
||||||
require "foreman/export/bluepill"
|
require "foreman/export/bluepill"
|
||||||
require "foreman/export/runit"
|
require "foreman/export/runit"
|
||||||
|
require "foreman/export/supervisord"
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
require "erb"
|
||||||
|
require "foreman/export"
|
||||||
|
|
||||||
|
class Foreman::Export::Supervisord < Foreman::Export::Base
|
||||||
|
|
||||||
|
def export
|
||||||
|
error("Must specify a location") unless location
|
||||||
|
|
||||||
|
FileUtils.mkdir_p location
|
||||||
|
|
||||||
|
app = self.app || File.basename(engine.directory)
|
||||||
|
user = self.user || app
|
||||||
|
log_root = self.log || "/var/log/#{app}"
|
||||||
|
template_root = self.template
|
||||||
|
|
||||||
|
Dir["#{location}/#{app}*.conf"].each do |file|
|
||||||
|
say "cleaning up: #{file}"
|
||||||
|
FileUtils.rm(file)
|
||||||
|
end
|
||||||
|
|
||||||
|
app_template = export_template("supervisord", "app.conf.erb", template_root)
|
||||||
|
app_config = ERB.new(app_template, 0, '<').result(binding)
|
||||||
|
write_file "#{location}/#{app}.conf", app_config
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -36,6 +36,8 @@ class Foreman::Export::Upstart < Foreman::Export::Base
|
|||||||
write_file "#{location}/#{app}-#{process.name}-#{num}.conf", process_config
|
write_file "#{location}/#{app}-#{process.name}-#{num}.conf", process_config
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
|
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}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+24
-4
@@ -13,8 +13,9 @@ class Foreman::Procfile
|
|||||||
|
|
||||||
attr_reader :entries
|
attr_reader :entries
|
||||||
|
|
||||||
def initialize(filename)
|
def initialize(filename=nil)
|
||||||
@entries = parse_procfile(filename)
|
@entries = []
|
||||||
|
load(filename) if filename
|
||||||
end
|
end
|
||||||
|
|
||||||
def [](name)
|
def [](name)
|
||||||
@@ -25,12 +26,31 @@ class Foreman::Procfile
|
|||||||
entries.map(&:name)
|
entries.map(&:name)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
def load(filename)
|
||||||
|
entries.clear
|
||||||
|
parse_procfile(filename)
|
||||||
|
end
|
||||||
|
|
||||||
|
def write(filename)
|
||||||
|
File.open(filename, 'w') do |io|
|
||||||
|
entries.each do |ent|
|
||||||
|
io.puts(ent)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def <<(entry)
|
||||||
|
entries << Foreman::ProcfileEntry.new(*entry)
|
||||||
|
self
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
def parse_procfile(filename)
|
def parse_procfile(filename)
|
||||||
File.read(filename).split("\n").map do |line|
|
File.read(filename).split("\n").map do |line|
|
||||||
if line =~ /^([A-Za-z0-9_]+):\s*(.+)$/
|
if line =~ /^([A-Za-z0-9_]+):\s*(.+)$/
|
||||||
Foreman::ProcfileEntry.new($1, $2)
|
self << [ $1, $2 ]
|
||||||
end
|
end
|
||||||
end.compact
|
end.compact
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -19,4 +19,8 @@ class Foreman::ProcfileEntry
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def to_s
|
||||||
|
"#{name}: #{command}"
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
module Foreman
|
module Foreman
|
||||||
|
|
||||||
VERSION = "0.37.0"
|
VERSION = "0.46.0"
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
+21
-3
@@ -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" "January 2012" "Foreman 0.33.1" "Foreman Manual"
|
.TH "FOREMAN" "1" "April 2012" "Foreman 0.45.0" "Foreman Manual"
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBforeman\fR \- manage Procfile\-based applications
|
\fBforeman\fR \- manage Procfile\-based applications
|
||||||
@@ -10,10 +10,13 @@
|
|||||||
\fBforeman start [process]\fR
|
\fBforeman start [process]\fR
|
||||||
.
|
.
|
||||||
.br
|
.br
|
||||||
|
\fBforeman run <command>\fR
|
||||||
|
.
|
||||||
|
.br
|
||||||
\fBforeman export <format> [location]\fR
|
\fBforeman export <format> [location]\fR
|
||||||
.
|
.
|
||||||
.SH "DESCRIPTION"
|
.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\.
|
Foreman 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"
|
.SH "RUNNING"
|
||||||
\fBforeman start\fR is used to run your application directly from the command line\.
|
\fBforeman start\fR is used to run your application directly from the command line\.
|
||||||
@@ -32,9 +35,20 @@ The following options control how the application is run:
|
|||||||
Specify the number of each process type to run\. The value passed in should be in the format \fBprocess=num,process=num\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
|
.TP
|
||||||
|
\fB\-e\fR, \fB\-\-env\fR
|
||||||
|
Specify one or more \.env files to load
|
||||||
|
.
|
||||||
|
.TP
|
||||||
|
\fB\-f\fR, \fB\-\-procfile\fR
|
||||||
|
Specify an alternate Procfile to load, implies \fB\-d\fR at the Procfile root\.
|
||||||
|
.
|
||||||
|
.TP
|
||||||
\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\.
|
||||||
.
|
.
|
||||||
|
.P
|
||||||
|
\fBforeman run\fR is used to run one\-off commands using the same environment as your defined processes\.
|
||||||
|
.
|
||||||
.SH "EXPORTING"
|
.SH "EXPORTING"
|
||||||
\fBforeman export\fR is used to export your application to another process management format\.
|
\fBforeman export\fR is used to export your application to another process management format\.
|
||||||
.
|
.
|
||||||
@@ -61,10 +75,14 @@ Specify the directory to place process logs in\.
|
|||||||
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
|
.TP
|
||||||
|
\fB\-t\fR, \fB\-\-template\fR
|
||||||
|
Specify an alternate template to use for creating export files\. See \fIhttps://github\.com/ddollar/foreman/tree/master/data/export\fR for examples\.
|
||||||
|
.
|
||||||
|
.TP
|
||||||
\fB\-u\fR, \fB\-\-user\fR
|
\fB\-u\fR, \fB\-\-user\fR
|
||||||
Specify the user the application should be run as\. Defaults to the app name
|
Specify the user the application should be run as\. Defaults to the app name
|
||||||
.
|
.
|
||||||
.SH "OPTIONS"
|
.SH "GLOBAL OPTIONS"
|
||||||
These options control all modes of foreman\'s operation\.
|
These options control all modes of foreman\'s operation\.
|
||||||
.
|
.
|
||||||
.TP
|
.TP
|
||||||
|
|||||||
+16
-2
@@ -4,11 +4,12 @@ foreman(1) -- manage Procfile-based applications
|
|||||||
## SYNOPSIS
|
## SYNOPSIS
|
||||||
|
|
||||||
`foreman start [process]`<br>
|
`foreman start [process]`<br>
|
||||||
|
`foreman run <command>`<br>
|
||||||
`foreman export <format> [location]`
|
`foreman export <format> [location]`
|
||||||
|
|
||||||
## DESCRIPTION
|
## DESCRIPTION
|
||||||
|
|
||||||
**Foreman** is a manager for Procfile-based applications. Its aim is to
|
Foreman 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
|
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
|
your application directly or export it to some other process management
|
||||||
format.
|
format.
|
||||||
@@ -29,10 +30,19 @@ The following options control how the application is run:
|
|||||||
Specify the number of each process type to run. The value passed in
|
Specify the number of each process type to run. The value passed in
|
||||||
should be in the format `process=num,process=num`
|
should be in the format `process=num,process=num`
|
||||||
|
|
||||||
|
* `-e`, `--env`:
|
||||||
|
Specify one or more .env files to load
|
||||||
|
|
||||||
|
* `-f`, `--procfile`:
|
||||||
|
Specify an alternate Procfile to load, implies `-d` at the Procfile root.
|
||||||
|
|
||||||
* `-p`, `--port`:
|
* `-p`, `--port`:
|
||||||
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.
|
||||||
|
|
||||||
|
`foreman run` is used to run one-off commands using the same environment
|
||||||
|
as your defined processes.
|
||||||
|
|
||||||
## EXPORTING
|
## EXPORTING
|
||||||
|
|
||||||
`foreman export` is used to export your application to another process
|
`foreman export` is used to export your application to another process
|
||||||
@@ -58,11 +68,15 @@ 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`, `--template`:
|
||||||
|
Specify an alternate template to use for creating export files.
|
||||||
|
See <https://github.com/ddollar/foreman/tree/master/data/export> for examples.
|
||||||
|
|
||||||
* `-u`, `--user`:
|
* `-u`, `--user`:
|
||||||
Specify the user the application should be run as. Defaults to the
|
Specify the user the application should be run as. Defaults to the
|
||||||
app name
|
app name
|
||||||
|
|
||||||
## OPTIONS
|
## GLOBAL OPTIONS
|
||||||
|
|
||||||
These options control all modes of foreman's operation.
|
These options control all modes of foreman's operation.
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ require "foreman/cli"
|
|||||||
|
|
||||||
describe "Foreman::CLI", :fakefs do
|
describe "Foreman::CLI", :fakefs do
|
||||||
subject { Foreman::CLI.new }
|
subject { Foreman::CLI.new }
|
||||||
|
let(:engine) { subject.send(:engine) }
|
||||||
|
let(:entries) { engine.procfile.entries.inject({}) { |h,e| h.update(e.name => e) } }
|
||||||
|
|
||||||
describe "start" do
|
describe "start" do
|
||||||
describe "with a non-existent Procfile" do
|
describe "with a non-existent Procfile" do
|
||||||
@@ -22,6 +24,24 @@ describe "Foreman::CLI", :fakefs do
|
|||||||
mock.instance_of(Foreman::Engine).start
|
mock.instance_of(Foreman::Engine).start
|
||||||
subject.start
|
subject.start
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "can run a single process" do
|
||||||
|
dont_allow(subject).error
|
||||||
|
stub(engine).watch_for_output
|
||||||
|
stub(engine).watch_for_termination
|
||||||
|
mock(entries["alpha"]).spawn(1, is_a(IO), engine.directory, {}, 5000) { [] }
|
||||||
|
mock(entries["bravo"]).spawn(0, is_a(IO), engine.directory, {}, 5100) { [] }
|
||||||
|
subject.start("alpha")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "with an alternate root" do
|
||||||
|
it "reads the Procfile from that root" do
|
||||||
|
write_procfile "/some/app/Procfile"
|
||||||
|
mock(Foreman::Procfile).new("/some/app/Procfile")
|
||||||
|
mock.instance_of(Foreman::Engine).start
|
||||||
|
foreman %{ start -d /some/app }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -109,6 +129,14 @@ describe "Foreman::CLI", :fakefs do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "without a Procfile" do
|
||||||
|
it "displays an error" do
|
||||||
|
mock_error(subject, "Procfile does not exist.") do
|
||||||
|
subject.check
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "run" do
|
describe "run" do
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
require "spec_helper"
|
||||||
|
require "foreman/color"
|
||||||
|
|
||||||
|
describe Foreman::Color do
|
||||||
|
|
||||||
|
let(:io) { Object.new }
|
||||||
|
|
||||||
|
it "should extend an object with colorization" do
|
||||||
|
Foreman::Color.enable(io)
|
||||||
|
io.should respond_to(:color)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should not colorize if the object does not respond to isatty" do
|
||||||
|
mock(io).respond_to?(:isatty) { false }
|
||||||
|
Foreman::Color.enable(io)
|
||||||
|
io.color(:white).should == ""
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should not colorize if the object is not a tty" do
|
||||||
|
mock(io).isatty { false }
|
||||||
|
Foreman::Color.enable(io)
|
||||||
|
io.color(:white).should == ""
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should colorize if the object is a tty" do
|
||||||
|
mock(io).isatty { true }
|
||||||
|
Foreman::Color.enable(io)
|
||||||
|
io.color(:white).should == "\e[37m"
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
+58
-13
@@ -4,13 +4,14 @@ require "foreman/engine"
|
|||||||
describe "Foreman::Engine", :fakefs do
|
describe "Foreman::Engine", :fakefs do
|
||||||
subject { Foreman::Engine.new("Procfile", {}) }
|
subject { Foreman::Engine.new("Procfile", {}) }
|
||||||
|
|
||||||
describe "initialize" do
|
before do
|
||||||
describe "without an existing Procfile" do
|
any_instance_of(Foreman::Engine) do |engine|
|
||||||
it "raises an error" do
|
stub(engine).proctitle
|
||||||
lambda { subject }.should raise_error
|
stub(engine).termtitle
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "initialize" do
|
||||||
describe "with a Procfile" do
|
describe "with a Procfile" do
|
||||||
before { write_procfile }
|
before { write_procfile }
|
||||||
|
|
||||||
@@ -42,18 +43,28 @@ describe "Foreman::Engine", :fakefs do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "directories" do
|
||||||
|
it "has the directory default relative to the Procfile" do
|
||||||
|
write_procfile "/some/app/Procfile"
|
||||||
|
engine = Foreman::Engine.new("/some/app/Procfile")
|
||||||
|
engine.directory.should == "/some/app"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "environment" do
|
describe "environment" do
|
||||||
before(:each) do
|
before(:each) do
|
||||||
write_procfile
|
write_procfile
|
||||||
stub(Process).fork
|
stub(Process).fork
|
||||||
|
any_instance_of(Foreman::Engine) do |engine|
|
||||||
|
stub(engine).info
|
||||||
|
stub(engine).spawn_processes
|
||||||
|
stub(engine).watch_for_termination
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should read if specified" do
|
it "should read if specified" do
|
||||||
File.open("/tmp/env", "w") { |f| f.puts("FOO=baz") }
|
File.open("/tmp/env", "w") { |f| f.puts("FOO=baz") }
|
||||||
engine = Foreman::Engine.new("Procfile", :env => "/tmp/env")
|
engine = Foreman::Engine.new("Procfile", :env => "/tmp/env")
|
||||||
stub(engine).info
|
|
||||||
mock(engine).spawn_processes
|
|
||||||
mock(engine).watch_for_termination
|
|
||||||
engine.environment.should == {"FOO"=>"baz"}
|
engine.environment.should == {"FOO"=>"baz"}
|
||||||
engine.start
|
engine.start
|
||||||
end
|
end
|
||||||
@@ -62,13 +73,21 @@ describe "Foreman::Engine", :fakefs do
|
|||||||
File.open("/tmp/env1", "w") { |f| f.puts("FOO=bar") }
|
File.open("/tmp/env1", "w") { |f| f.puts("FOO=bar") }
|
||||||
File.open("/tmp/env2", "w") { |f| f.puts("BAZ=qux") }
|
File.open("/tmp/env2", "w") { |f| f.puts("BAZ=qux") }
|
||||||
engine = Foreman::Engine.new("Procfile", :env => "/tmp/env1,/tmp/env2")
|
engine = Foreman::Engine.new("Procfile", :env => "/tmp/env1,/tmp/env2")
|
||||||
stub(engine).info
|
|
||||||
mock(engine).spawn_processes
|
|
||||||
mock(engine).watch_for_termination
|
|
||||||
engine.environment.should == { "FOO"=>"bar", "BAZ"=>"qux" }
|
engine.environment.should == { "FOO"=>"bar", "BAZ"=>"qux" }
|
||||||
engine.start
|
engine.start
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "should handle quoted values" do
|
||||||
|
File.open("/tmp/env", "w") do |f|
|
||||||
|
f.puts 'FOO=bar'
|
||||||
|
f.puts 'BAZ="qux"'
|
||||||
|
f.puts "FRED='barney'"
|
||||||
|
f.puts 'OTHER="escaped\"quote"'
|
||||||
|
end
|
||||||
|
engine = Foreman::Engine.new("Procfile", :env => "/tmp/env")
|
||||||
|
engine.environment.should == { "FOO" => "bar", "BAZ" => "qux", "FRED" => "barney", "OTHER" => 'escaped"quote' }
|
||||||
|
end
|
||||||
|
|
||||||
it "should fail if specified and doesnt exist" do
|
it "should fail if specified and doesnt exist" do
|
||||||
mock.instance_of(Foreman::Engine).error("No such file: /tmp/env")
|
mock.instance_of(Foreman::Engine).error("No such file: /tmp/env")
|
||||||
engine = Foreman::Engine.new("Procfile", :env => "/tmp/env")
|
engine = Foreman::Engine.new("Procfile", :env => "/tmp/env")
|
||||||
@@ -77,10 +96,36 @@ describe "Foreman::Engine", :fakefs do
|
|||||||
it "should read .env if none specified" do
|
it "should read .env if none specified" do
|
||||||
File.open(".env", "w") { |f| f.puts("FOO=qoo") }
|
File.open(".env", "w") { |f| f.puts("FOO=qoo") }
|
||||||
engine = Foreman::Engine.new("Procfile")
|
engine = Foreman::Engine.new("Procfile")
|
||||||
mock(engine).spawn_processes
|
engine.environment.should == {"FOO"=>"qoo"}
|
||||||
mock(engine).watch_for_termination
|
engine.start
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should be loaded relative to the Procfile" do
|
||||||
|
FileUtils.mkdir_p "/some/app"
|
||||||
|
File.open("/some/app/.env", "w") { |f| f.puts("FOO=qoo") }
|
||||||
|
write_procfile "/some/app/Procfile"
|
||||||
|
engine = Foreman::Engine.new("/some/app/Procfile")
|
||||||
engine.environment.should == {"FOO"=>"qoo"}
|
engine.environment.should == {"FOO"=>"qoo"}
|
||||||
engine.start
|
engine.start
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "utf8" do
|
||||||
|
before(:each) do
|
||||||
|
File.open("Procfile", "w") do |file|
|
||||||
|
file.puts "utf8: #{resource_path("bin/utf8")}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should spawn" do
|
||||||
|
stub(subject).watch_for_output
|
||||||
|
stub(subject).watch_for_termination
|
||||||
|
subject.start
|
||||||
|
Process.waitall
|
||||||
|
mock(subject).info(/started with pid \d+/, "utf8.1", anything)
|
||||||
|
mock(subject).info("\xff\x03\n", "utf8.1", anything)
|
||||||
|
subject.send(:poll_readers)
|
||||||
|
subject.send(:poll_readers)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
require "spec_helper"
|
||||||
|
require "foreman/engine"
|
||||||
|
require "foreman/export/supervisord"
|
||||||
|
require "tmpdir"
|
||||||
|
|
||||||
|
describe Foreman::Export::Supervisord, :fakefs do
|
||||||
|
let(:procfile) { FileUtils.mkdir_p("/tmp/app"); write_procfile("/tmp/app/Procfile") }
|
||||||
|
let(:engine) { Foreman::Engine.new(procfile) }
|
||||||
|
let(:options) { Hash.new }
|
||||||
|
let(:supervisord) { Foreman::Export::Supervisord.new("/tmp/init", engine, options) }
|
||||||
|
|
||||||
|
before(:each) { load_export_templates_into_fakefs("supervisord") }
|
||||||
|
before(:each) { stub(supervisord).say }
|
||||||
|
|
||||||
|
it "exports to the filesystem" do
|
||||||
|
supervisord.export
|
||||||
|
|
||||||
|
File.read("/tmp/init/app.conf").should == example_export_file("supervisord/app.conf")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "cleans up if exporting into an existing dir" do
|
||||||
|
mock(FileUtils).rm("/tmp/init/app.conf")
|
||||||
|
supervisord.export
|
||||||
|
supervisord.export
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with concurrency" do
|
||||||
|
let(:options) { Hash[:concurrency => "alpha=2"] }
|
||||||
|
|
||||||
|
it "exports to the filesystem with concurrency" do
|
||||||
|
supervisord.export
|
||||||
|
File.read("/tmp/init/app.conf").should == example_export_file("supervisord/app-alpha-2.conf")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with alternate templates" do
|
||||||
|
let(:template_root) { "/tmp/alternate" }
|
||||||
|
let(:supervisord) { Foreman::Export::Supervisord.new("/tmp/init", engine, :template => template_root) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
FileUtils.mkdir_p template_root
|
||||||
|
File.open("#{template_root}/app.conf.erb", "w") { |f| f.puts "alternate_template" }
|
||||||
|
end
|
||||||
|
|
||||||
|
it "can export with alternate template files" do
|
||||||
|
supervisord.export
|
||||||
|
File.read("/tmp/init/app.conf").should == "alternate_template\n"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with alternate templates from home dir" do
|
||||||
|
let(:default_template_root) {File.expand_path("#{ENV['HOME']}/.foreman/templates")}
|
||||||
|
|
||||||
|
before do
|
||||||
|
ENV['_FOREMAN_SPEC_HOME'] = ENV['HOME']
|
||||||
|
ENV['HOME'] = "/home/appuser"
|
||||||
|
FileUtils.mkdir_p default_template_root
|
||||||
|
File.open("#{default_template_root}/app.conf.erb", "w") { |f| f.puts "default_alternate_template" }
|
||||||
|
end
|
||||||
|
|
||||||
|
after do
|
||||||
|
ENV['HOME'] = ENV.delete('_FOREMAN_SPEC_HOME')
|
||||||
|
end
|
||||||
|
|
||||||
|
it "can export with alternate template files" do
|
||||||
|
supervisord.export
|
||||||
|
File.read("/tmp/init/app.conf").should == "default_alternate_template\n"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "environment export" do
|
||||||
|
it "correctly translates environment when exporting" do
|
||||||
|
File.open("/tmp/supervisord_env", "w") { |f| f.puts("QUEUE=fastqueue,slowqueue\nVERBOSE=1") }
|
||||||
|
|
||||||
|
engine = Foreman::Engine.new(procfile,:env => "/tmp/supervisord_env")
|
||||||
|
supervisor = Foreman::Export::Supervisord.new("/tmp/init", engine, options)
|
||||||
|
stub(supervisor).say
|
||||||
|
|
||||||
|
supervisor.export
|
||||||
|
|
||||||
|
File.read("/tmp/init/app.conf").should == example_export_file("supervisord/app-env-with-comma.conf")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -36,6 +36,7 @@ describe Foreman::Process do
|
|||||||
def run_file(executable, code)
|
def run_file(executable, code)
|
||||||
file = File.open("#{basedir}/script", 'w') {|it| it << code }
|
file = File.open("#{basedir}/script", 'w') {|it| it << code }
|
||||||
run "#{executable} #{file.path}"
|
run "#{executable} #{file.path}"
|
||||||
|
sleep 1
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'options' do
|
context 'options' do
|
||||||
@@ -98,7 +99,6 @@ describe Foreman::Process do
|
|||||||
trap "TERM", "IGNORE"
|
trap "TERM", "IGNORE"
|
||||||
loop { sleep 1 }
|
loop { sleep 1 }
|
||||||
CODE
|
CODE
|
||||||
sleep 1 # wait for ruby to start
|
|
||||||
subject.should be_alive
|
subject.should be_alive
|
||||||
subject.kill 'TERM'
|
subject.kill 'TERM'
|
||||||
subject.should be_alive
|
subject.should be_alive
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
require 'spec_helper'
|
||||||
|
require 'foreman/procfile_entry'
|
||||||
|
require 'pathname'
|
||||||
|
require 'tmpdir'
|
||||||
|
|
||||||
|
describe Foreman::ProcfileEntry do
|
||||||
|
subject { described_class.new('alpha', './alpha') }
|
||||||
|
|
||||||
|
it "stringifies as a Procfile line" do
|
||||||
|
subject.to_s.should == 'alpha: ./alpha'
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
require 'spec_helper'
|
||||||
|
require 'foreman/procfile'
|
||||||
|
require 'pathname'
|
||||||
|
require 'tmpdir'
|
||||||
|
|
||||||
|
describe Foreman::Procfile do
|
||||||
|
subject { described_class.new }
|
||||||
|
|
||||||
|
let(:testdir) { Pathname(Dir.tmpdir) }
|
||||||
|
let(:procfile) { testdir + 'Procfile' }
|
||||||
|
|
||||||
|
it "can have a process appended to it" do
|
||||||
|
subject << ['alpha', './alpha']
|
||||||
|
subject['alpha'].should be_a(Foreman::ProcfileEntry)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "can write itself out to a file" do
|
||||||
|
subject << ['alpha', './alpha']
|
||||||
|
subject.write(procfile)
|
||||||
|
procfile.read.should == "alpha: ./alpha\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "can re-read entries from a file" do
|
||||||
|
procfile.open('w') { |io| io.puts "gamma: ./radiation", "theta: ./rate" }
|
||||||
|
subject << ['alpha', './alpha']
|
||||||
|
subject.load(procfile)
|
||||||
|
subject.process_names.should have(2).members
|
||||||
|
subject.process_names.should include('gamma', 'theta')
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -8,24 +8,6 @@ describe Foreman do
|
|||||||
it { should be_a String }
|
it { should be_a String }
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "::load_env!(env_file)", :fakefs do
|
|
||||||
after do
|
|
||||||
ENV['FOO'] = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
it "should load env_file into ENV" do
|
|
||||||
File.open("/tmp/env1", "w") { |f| f.puts("FOO=bar") }
|
|
||||||
Foreman.load_env!("/tmp/env1")
|
|
||||||
ENV['FOO'].should == 'bar'
|
|
||||||
end
|
|
||||||
|
|
||||||
it "should assume env_file in ./.env" do
|
|
||||||
File.open("./.env", "w") { |f| f.puts("FOO=bar") }
|
|
||||||
Foreman.load_env!
|
|
||||||
ENV['FOO'].should == 'bar'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "runner" do
|
describe "runner" do
|
||||||
it "should exist" do
|
it "should exist" do
|
||||||
File.exists?(Foreman.runner).should == true
|
File.exists?(Foreman.runner).should == true
|
||||||
|
|||||||
Executable
+2
@@ -0,0 +1,2 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
puts "\xff\x03"
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
[program:app-alpha-1]
|
||||||
|
command=./alpha
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stopsignal=QUIT
|
||||||
|
stdout_logfile=/var/log/app/alpha-1-out.log
|
||||||
|
stderr_logfile=/var/log/app/alpha-1-err.log
|
||||||
|
user=app
|
||||||
|
directory=/tmp/app
|
||||||
|
environment=PORT="5000"
|
||||||
|
[program:app-alpha-2]
|
||||||
|
command=./alpha
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stopsignal=QUIT
|
||||||
|
stdout_logfile=/var/log/app/alpha-2-out.log
|
||||||
|
stderr_logfile=/var/log/app/alpha-2-err.log
|
||||||
|
user=app
|
||||||
|
directory=/tmp/app
|
||||||
|
environment=PORT="5001"
|
||||||
|
|
||||||
|
[group:app]
|
||||||
|
programs=app-alpha-1,app-alpha-2
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
[program:app-alpha]
|
||||||
|
command=./alpha
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stopsignal=QUIT
|
||||||
|
stdout_logfile=/var/log/app/alpha-1-out.log
|
||||||
|
stderr_logfile=/var/log/app/alpha-1-err.log
|
||||||
|
user=app
|
||||||
|
directory=/tmp/app
|
||||||
|
environment=QUEUE="fastqueue,slowqueue",VERBOSE="1",PORT="5000"
|
||||||
|
[program:app-bravo]
|
||||||
|
command=./bravo
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stopsignal=QUIT
|
||||||
|
stdout_logfile=/var/log/app/bravo-1-out.log
|
||||||
|
stderr_logfile=/var/log/app/bravo-1-err.log
|
||||||
|
user=app
|
||||||
|
directory=/tmp/app
|
||||||
|
environment=QUEUE="fastqueue,slowqueue",VERBOSE="1",PORT="5100"
|
||||||
|
|
||||||
|
[group:app]
|
||||||
|
programs=app-alpha,app-bravo
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
|
||||||
|
[program:app-alpha]
|
||||||
|
command=./alpha
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stopsignal=QUIT
|
||||||
|
stdout_logfile=/var/log/app/alpha-1-out.log
|
||||||
|
stderr_logfile=/var/log/app/alpha-1-err.log
|
||||||
|
user=app
|
||||||
|
directory=/tmp/app
|
||||||
|
environment=FOO="bar",PORT="5000"
|
||||||
|
[program:app-bravo]
|
||||||
|
command=./bravo
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stopsignal=QUIT
|
||||||
|
stdout_logfile=/var/log/app/bravo-1-out.log
|
||||||
|
stderr_logfile=/var/log/app/bravo-1-err.log
|
||||||
|
user=app
|
||||||
|
directory=/tmp/app
|
||||||
|
environment=FOO="bar",PORT="5100"
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
[program:app-alpha]
|
||||||
|
command=./alpha
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stopsignal=QUIT
|
||||||
|
stdout_logfile=/var/log/app/alpha-1-out.log
|
||||||
|
stderr_logfile=/var/log/app/alpha-1-err.log
|
||||||
|
user=app
|
||||||
|
directory=/tmp/app
|
||||||
|
environment=PORT="5000"
|
||||||
|
[program:app-bravo]
|
||||||
|
command=./bravo
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
stopsignal=QUIT
|
||||||
|
stdout_logfile=/var/log/app/bravo-1-out.log
|
||||||
|
stderr_logfile=/var/log/app/bravo-1-err.log
|
||||||
|
user=app
|
||||||
|
directory=/tmp/app
|
||||||
|
environment=PORT="5100"
|
||||||
|
|
||||||
|
[group:app]
|
||||||
|
programs=app-alpha,app-bravo
|
||||||
+5
-1
@@ -68,9 +68,13 @@ def load_export_templates_into_fakefs(type)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def resource_path(filename)
|
||||||
|
File.expand_path("../resources/#{filename}", __FILE__)
|
||||||
|
end
|
||||||
|
|
||||||
def example_export_file(filename)
|
def example_export_file(filename)
|
||||||
FakeFS.deactivate!
|
FakeFS.deactivate!
|
||||||
data = File.read(File.expand_path("../resources/export/#{filename}", __FILE__))
|
data = File.read(File.expand_path(resource_path("export/#{filename}"), __FILE__))
|
||||||
FakeFS.activate!
|
FakeFS.activate!
|
||||||
data
|
data
|
||||||
end
|
end
|
||||||
|
|||||||
+5
-6
@@ -21,7 +21,7 @@ end
|
|||||||
GEM_BLACKLIST = %w( bundler foreman )
|
GEM_BLACKLIST = %w( bundler foreman )
|
||||||
|
|
||||||
def assemble_gems(target_dir=Dir.pwd)
|
def assemble_gems(target_dir=Dir.pwd)
|
||||||
lines = %x{ bundle show }.strip.split("\n")
|
lines = %x{ cd #{project_root} && bundle show }.strip.split("\n")
|
||||||
raise "error running bundler" unless $?.success?
|
raise "error running bundler" unless $?.success?
|
||||||
|
|
||||||
%x{ env BUNDLE_WITHOUT="development:test" bundle show }.split("\n").each do |line|
|
%x{ env BUNDLE_WITHOUT="development:test" bundle show }.split("\n").each do |line|
|
||||||
@@ -47,8 +47,7 @@ def distribution_files(type=nil)
|
|||||||
require "foreman/distribution"
|
require "foreman/distribution"
|
||||||
base_files = Foreman::Distribution.files
|
base_files = Foreman::Distribution.files
|
||||||
type_files = type ?
|
type_files = type ?
|
||||||
Dir[File.expand_path("../dist/resources/#{type}/**/*", __FILE__)] :
|
Dir[File.expand_path("../../dist/resources/#{type}/**/*", __FILE__)] : []
|
||||||
[]
|
|
||||||
base_files.concat(type_files)
|
base_files.concat(type_files)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -60,15 +59,15 @@ def mkchdir(dir)
|
|||||||
end
|
end
|
||||||
|
|
||||||
def pkg(filename)
|
def pkg(filename)
|
||||||
File.expand_path("../pkg/#{filename}", __FILE__)
|
File.expand_path("../../pkg/#{filename}", __FILE__)
|
||||||
end
|
end
|
||||||
|
|
||||||
def project_root
|
def project_root
|
||||||
File.dirname(__FILE__)
|
File.expand_path("../..", __FILE__)
|
||||||
end
|
end
|
||||||
|
|
||||||
def resource(name)
|
def resource(name)
|
||||||
File.expand_path("../dist/resources/#{name}", __FILE__)
|
File.expand_path("../../dist/resources/#{name}", __FILE__)
|
||||||
end
|
end
|
||||||
|
|
||||||
def s3_connect
|
def s3_connect
|
||||||
|
|||||||
+21
-36
@@ -9,8 +9,8 @@ end
|
|||||||
|
|
||||||
desc "Commit the manual to git"
|
desc "Commit the manual to git"
|
||||||
task "man:commit" => :man do
|
task "man:commit" => :man do
|
||||||
sh "git add README.markdown"
|
sh "git add README.md"
|
||||||
sh "git commit -m 'update readme' || echo 'nothing to commit'"
|
sh "git commit -am 'update docs' || echo 'nothing to commit'"
|
||||||
end
|
end
|
||||||
|
|
||||||
desc "Generate the Github docs"
|
desc "Generate the Github docs"
|
||||||
@@ -27,55 +27,40 @@ task :pages => "man:commit" do
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
desc "Generate an authors list"
|
|
||||||
task :authors do
|
|
||||||
authors = %x{ git log --pretty=format:"%an" | sort -u }.split("\n")
|
|
||||||
puts authors.join(", ")
|
|
||||||
end
|
|
||||||
|
|
||||||
def latest_release
|
def latest_release
|
||||||
latest = File.read("Changelog.md").split("\n").first.split(" ").last
|
latest = File.read("Changelog.md").split("\n").first.split(" ")[1]
|
||||||
end
|
end
|
||||||
|
|
||||||
def newer_release
|
def newer_release
|
||||||
release = %x{ git tag --contains #{latest_release} }.split("\n")[1]
|
tags = %x{ git tag --contains v#{latest_release} }.split("\n").sort_by do |tag|
|
||||||
|
Gem::Version.new(tag[1..-1])
|
||||||
|
end
|
||||||
|
tags.reject { |tag| Gem::Version.new(tag[1..-1]).prerelease? }[1]
|
||||||
end
|
end
|
||||||
|
|
||||||
desc "Generate a Changelog"
|
desc "Generate a Changelog"
|
||||||
task :changelog do
|
task :changelog do
|
||||||
while release = newer_release
|
while release = newer_release
|
||||||
entry = %x{ git show --format="%h %cd" #{release} | head -n 1 }
|
entry = %x{ git show --format="%cd" #{release} | head -n 1 }
|
||||||
commit, date_raw = entry.split(" ", 2)
|
date = Time.parse(entry.chomp).strftime("%Y-%m-%d")
|
||||||
date = Time.parse(date_raw).strftime("%Y-%m-%d")
|
|
||||||
|
|
||||||
message = "## #{release[1..-1]} #{date} #{commit}\n"
|
message = "## #{release[1..-1]} (#{date})\n\n"
|
||||||
message += %x{ git log --format="%s [%an]" #{latest_release}..#{release} }
|
message += %x{ git log --format="* %s [%an]" v#{latest_release}..#{release} }
|
||||||
|
|
||||||
changelog = File.read("Changelog.md")
|
changelog = File.read("Changelog.md")
|
||||||
changelog = message + "\n" + changelog
|
changelog = message + "\n" + changelog
|
||||||
|
|
||||||
|
puts release
|
||||||
|
|
||||||
File.open("Changelog.md", "w") do |file|
|
File.open("Changelog.md", "w") do |file|
|
||||||
file.puts changelog
|
file.print changelog
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# date =
|
desc "Cut a release"
|
||||||
# message = "## #{release[1..-1]}
|
task :release do
|
||||||
# timestamp = Time.now.utc.strftime('%m/%d/%Y')
|
Rake::Task["authors"].invoke
|
||||||
# sha = `git log | head -1`.split(' ').last
|
Rake::Task["changelog"].invoke
|
||||||
# changelog = ["#{version} #{timestamp} #{sha}"]
|
Rake::Task["pages"].invoke
|
||||||
# changelog << ('=' * changelog[0].length)
|
|
||||||
# changelog << ''
|
|
||||||
|
|
||||||
# last_sha = `cat Changelog | head -1`.split(' ').last
|
|
||||||
# shortlog = `git log #{last_sha}..HEAD --pretty=format:'%s [%an]'`
|
|
||||||
# changelog << shortlog.split("\n")
|
|
||||||
# changelog.concat ['', '', '']
|
|
||||||
|
|
||||||
# old_changelog = File.read('Changelog')
|
|
||||||
# File.open('Changelog', 'w') do |file|
|
|
||||||
# file.write(changelog.join("\n"))
|
|
||||||
# file.write(old_changelog)
|
|
||||||
# end
|
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user