gordon 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +30 -24
- data/gordon.gemspec +3 -2
- data/lib/gordon/application/factory.rb +12 -0
- data/lib/gordon/application/templates/ruby_web_app.rb +20 -23
- data/lib/gordon/application/types.rb +0 -8
- data/lib/gordon/cli.rb +24 -31
- data/lib/gordon/cooker.rb +46 -32
- data/lib/gordon/cookery/application_user.rb +41 -0
- data/lib/gordon/cookery/common.rb +17 -7
- data/lib/gordon/cookery/http_server.rb +14 -0
- data/lib/gordon/cookery/init.rb +9 -13
- data/lib/gordon/cookery/ruby/common.rb +18 -0
- data/lib/gordon/env_vars.rb +36 -0
- data/lib/gordon/options.rb +5 -4
- data/lib/gordon/recipe.rb +2 -6
- data/lib/gordon/skeleton/factory.rb +12 -0
- data/lib/gordon/skeleton/types.rb +1 -9
- data/lib/gordon/version.rb +1 -1
- data/lib/gordon.rb +6 -2
- metadata +25 -6
- data/lib/gordon/cookery/webserver.rb +0 -14
- data/lib/gordon/skeleton/info.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8807e453ec5c7d49cef487a753959d7a88e53a46
|
4
|
+
data.tar.gz: 3ed6815c1615d8c5a39ee20c862dd509c8b63056
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d25d8c05b10dd34c1e7ef11cc7adf9695897f6930efebe2afbee1949e0a636a5fe636c84713e0a7fae07c58ff0ab06052f11a1e92c823fd43c6e6c0eb29c25a
|
7
|
+
data.tar.gz: 9c5fd2889928bb9a481d785c7900e4739021c4bfbc52a07f13820add8bae277f722d9ba4c6a343fb88c4d64d91d247a77fa3a1619b6b7fb29c55b62066b16bc9
|
data/README.md
CHANGED
@@ -6,20 +6,25 @@ Of course, [fpm](https://github.com/jordansissel/fpm) is a awesome tool to abstr
|
|
6
6
|
|
7
7
|
Of course, [fpm-cookery](https://github.com/bernd/fpm-cookery) is another great tool to approach building as a simple recipe.
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
Of course, [foreman](https://github.com/ddollar/foreman) is a great tool to handle Procfile-based applications and have the amazing feature of export to init files (systemd, runit, inittab).
|
10
|
+
|
11
|
+
But, unfortunately, create fpm-cookery recipes for each application can be boring and repetitious. You need to create init files (inittab, systemd, etc) for each project and, if a webserver changes (example: from Thin to Unicorn) you need to change script again, again and again.
|
11
12
|
|
12
13
|
And when you are in front with a web application that breaks Nginx or Apache conventions? Do you remember that feel, bro?
|
13
14
|
|
14
|
-
Gordon is a try to automagically create init files using Foreman and build artifacts using
|
15
|
+
Gordon is a try to automagically create init files using Foreman and build artifacts using fpm-cookery, on the shoulder of conventions. Make developers free to develop, while you have apps under a minimal control in ops side of view.
|
15
16
|
|
16
17
|
## How it works?
|
17
18
|
|
18
|
-
Gordon have a lot of restrictions
|
19
|
+
Gordon have a lot of restrictions, because they are liberating. These restrictions are a result of years packaging apps, since code generation to minimal security & ops conventions.
|
20
|
+
|
21
|
+
Per example: create a user that will run app with credentials, whose $HOME is the directory of application, is a good practice. Therefore, any web app will follow this rule with Gordon. Period.
|
22
|
+
|
23
|
+
## How are the options?
|
19
24
|
|
20
25
|
* Web Servers: Nginx or Apache (Tomcat soon);
|
21
|
-
* Init scripts: all generated by Foreman;
|
22
|
-
* Apps supported: at this time, Ruby. Java soon and others
|
26
|
+
* Init scripts: Systemd (all generated by Foreman soon);
|
27
|
+
* Apps supported: at this time, Ruby Web App. Java soon and others when needed.
|
23
28
|
|
24
29
|
## Installation
|
25
30
|
|
@@ -39,30 +44,33 @@ Or install it yourself as:
|
|
39
44
|
|
40
45
|
A simple example to build a Ruby Web App that runs Nginx and uses Systemd as init process:
|
41
46
|
|
42
|
-
$ ruby -S gordon
|
43
|
-
--app-
|
44
|
-
--app-
|
45
|
-
--app-
|
46
|
-
--app-
|
47
|
-
--app-
|
48
|
-
--
|
49
|
-
--
|
50
|
-
--
|
51
|
-
--
|
52
|
-
--
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
It will generate a RPM package with the following structure:
|
47
|
+
$ ruby -S gordon \
|
48
|
+
--app-name $APP_NAME \
|
49
|
+
--app-desc $APP_DESC \
|
50
|
+
--app-repo $APP_REPO \
|
51
|
+
--app-version $APP_VERSION \
|
52
|
+
--app-source-dir . \
|
53
|
+
--app-type ruby_web_app \
|
54
|
+
--http-server-type nginx \
|
55
|
+
--init-type systemd \
|
56
|
+
--package-type rpm \
|
57
|
+
--output pkg
|
58
|
+
|
59
|
+
It will generate a RPM package in pkg/ with the following structure:
|
57
60
|
|
58
61
|
* /usr/share/nginx/html/*all-app-stuff*
|
59
62
|
* /usr/lib/systemd/system/*app-name*/*all-systemd-stuff*
|
60
63
|
|
64
|
+
Due for conventions, remember:
|
65
|
+
|
66
|
+
* /usr/share/nginx/html is $HOME of user *app-name*
|
67
|
+
* Systemd will run app using user *app-name*
|
68
|
+
|
61
69
|
Sounds good?
|
62
70
|
|
63
71
|
## Why you not use Omnibus or Heroku buildpacks?
|
64
72
|
|
65
|
-
Because I want to create a tool that can be used as a transition step.
|
73
|
+
Because I want to create a tool that can be used as a transition step for building apps.
|
66
74
|
|
67
75
|
## Why you use fpm-cookery templates instead of fpm?
|
68
76
|
|
@@ -76,10 +84,8 @@ Because I like Gordon Ramsay.
|
|
76
84
|
|
77
85
|
* Very unstable, need to fix it
|
78
86
|
* Validate outputs
|
79
|
-
* Fix annoying --package-dir OptionParser::InvalidOption error
|
80
87
|
* Add a way to map package dependencies
|
81
88
|
* Adapt to use Debian and other OS conventions for Nginx and Apache
|
82
|
-
* Create a better way to handle env vars than injecting a lot of global variables in fpm-cookery ruby-web-app template
|
83
89
|
* Tests
|
84
90
|
|
85
91
|
## Contributing
|
data/gordon.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Gordon::VERSION
|
9
9
|
spec.authors = ["Marcelo Pinheiro"]
|
10
10
|
spec.email = ["salizzar@gmail.com"]
|
11
|
-
spec.description = %q{Gordon is a tool to create
|
12
|
-
spec.summary = %q{A tool to create application
|
11
|
+
spec.description = %q{Gordon is a tool to create OS packages using fpm-cookery and foreman, based on a lot of conventions.}
|
12
|
+
spec.summary = %q{A tool to create application OS packages}
|
13
13
|
spec.homepage = "https://github.com/salizzar/gordon"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "debugger"
|
23
24
|
|
24
25
|
spec.add_dependency "fpm-cookery"
|
25
26
|
spec.add_dependency "foreman"
|
@@ -1,41 +1,38 @@
|
|
1
|
-
$app_name = ENV['GORDON_APP_NAME']
|
2
|
-
$app_desc = ENV['GORDON_APP_DESC']
|
3
|
-
$app_repo = ENV['GORDON_APP_REPO']
|
4
|
-
$app_version = ENV['GORDON_APP_VERSION']
|
5
|
-
#app_depends = ENV['GORDON_APP_DEPENDS']
|
6
|
-
$app_source_dir = ENV['GORDON_APP_SOURCE_DIR']
|
7
|
-
|
8
|
-
$skeleton_type = ENV['GORDON_SKELETON_TYPE']
|
9
|
-
$skeleton_files = ENV['GORDON_SKELETON_FILES']
|
10
|
-
|
11
|
-
$init_type = ENV['GORDON_INIT_TYPE']
|
12
|
-
$init_build_dir = ENV['GORDON_INIT_BUILD_DIR']
|
13
|
-
|
14
1
|
path = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'lib'))
|
15
2
|
$LOAD_PATH.unshift path
|
16
3
|
|
17
4
|
require 'gordon'
|
18
5
|
|
6
|
+
$env_vars = Gordon::EnvVars.load
|
7
|
+
|
19
8
|
class RubyWebApp < FPM::Cookery::Recipe
|
20
9
|
include Gordon::Cookery::Common,
|
21
10
|
Gordon::Cookery::Init,
|
22
|
-
Gordon::Cookery::
|
11
|
+
Gordon::Cookery::ApplicationUser,
|
12
|
+
Gordon::Cookery::HttpServer,
|
13
|
+
Gordon::Cookery::Ruby::Common
|
23
14
|
|
24
|
-
name $app_name
|
25
|
-
description $app_desc
|
26
|
-
version $app_version
|
27
|
-
homepage $app_repo
|
15
|
+
name $env_vars.app_name
|
16
|
+
description $env_vars.app_desc
|
17
|
+
version $env_vars.app_version
|
18
|
+
homepage $env_vars.app_repo
|
28
19
|
|
29
|
-
source $app_source_dir, with: :local_path
|
30
|
-
# depends $app_depends
|
20
|
+
source $env_vars.app_source_dir, with: :local_path
|
31
21
|
|
32
22
|
def build
|
33
|
-
|
23
|
+
home_path = get_skeleton_path_from_type($env_vars.http_server_type)
|
24
|
+
|
25
|
+
create_user_and_group(home_path)
|
26
|
+
setup_user_permissions(home_path)
|
27
|
+
|
28
|
+
create_init
|
29
|
+
|
30
|
+
ruby_vendor_gems
|
34
31
|
end
|
35
32
|
|
36
33
|
def install
|
37
|
-
|
38
|
-
|
34
|
+
install_init
|
35
|
+
install_http_server_files(RUBY_BLACKLIST_FILES)
|
39
36
|
end
|
40
37
|
end
|
41
38
|
|
@@ -28,14 +28,6 @@ module Gordon
|
|
28
28
|
def get_template ; 'java_standalone_app' ; end
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
32
|
-
class Factory
|
33
|
-
def self.create(application_type)
|
34
|
-
namespace = "Application::Types"
|
35
|
-
|
36
|
-
::Gordon::Factory.create_instance(namespace, application_type)
|
37
|
-
end
|
38
|
-
end
|
39
31
|
end
|
40
32
|
end
|
41
33
|
|
data/lib/gordon/cli.rb
CHANGED
@@ -4,18 +4,14 @@ module Gordon
|
|
4
4
|
class CLI
|
5
5
|
def self.run
|
6
6
|
options = Options.new
|
7
|
-
options.source_dir
|
8
|
-
options.
|
9
|
-
options.package_dir = Dir.pwd
|
10
|
-
options.init_build_dir = '/tmp'
|
7
|
+
options.source_dir = Dir.pwd
|
8
|
+
options.output_dir = Dir.pwd
|
11
9
|
|
12
10
|
parser = create_option_parser(options)
|
13
11
|
parser.parse!
|
14
12
|
|
15
|
-
file_path = File.join(Dir.pwd, 'gordon.yml')
|
16
|
-
|
17
13
|
recipe = Recipe.new(options)
|
18
|
-
cooker = Cooker.new(recipe
|
14
|
+
cooker = Cooker.new(recipe)
|
19
15
|
cooker.cook
|
20
16
|
end
|
21
17
|
|
@@ -23,19 +19,15 @@ module Gordon
|
|
23
19
|
parser = OptionParser.new do |opts|
|
24
20
|
opts.banner = 'Usage: gordon [options]'
|
25
21
|
|
26
|
-
opts.on('-
|
27
|
-
options.app_type = type
|
28
|
-
end
|
29
|
-
|
30
|
-
opts.on('-n', '--app-name APP_NAME', 'Application Name') do |name|
|
22
|
+
opts.on('-N', '--app-name APP_NAME', 'Application Name') do |name|
|
31
23
|
options.app_name = name
|
32
24
|
end
|
33
25
|
|
34
|
-
opts.on('-
|
26
|
+
opts.on('-D', '--app-desc APP_DESC', 'Application Description') do |desc|
|
35
27
|
options.app_desc = desc
|
36
28
|
end
|
37
29
|
|
38
|
-
opts.on('-
|
30
|
+
opts.on('-R', '--app-repo APP_REPO', 'Application Repository URL') do |repo|
|
39
31
|
options.app_repo = repo
|
40
32
|
end
|
41
33
|
|
@@ -43,35 +35,31 @@ module Gordon
|
|
43
35
|
options.app_version = version
|
44
36
|
end
|
45
37
|
|
46
|
-
opts.on('-
|
47
|
-
options.package_type = package_type
|
48
|
-
end
|
49
|
-
|
50
|
-
opts.on('-P' '--package-dir PACKAGE_DIR', 'Package Directory') do |package_dir|
|
51
|
-
options.package_dir = package_dir
|
52
|
-
end
|
53
|
-
|
54
|
-
opts.on('-s', '--source-dir SOURCE_DIR', 'Source Directory') do |source_dir|
|
38
|
+
opts.on('-S', '--app-source-dir APP_SOURCE_DIR', 'Application Source Directory') do |source_dir|
|
55
39
|
options.source_dir = source_dir
|
56
40
|
end
|
57
41
|
|
58
|
-
opts.on('-
|
59
|
-
options.
|
42
|
+
opts.on('-T', '--app-type APP_TYPE', 'Application Type') do |type|
|
43
|
+
options.app_type = type
|
60
44
|
end
|
61
45
|
|
62
|
-
opts.on('-
|
63
|
-
options.
|
46
|
+
opts.on('-H', '--http-server-type HTTP_SERVER_TYPE', 'HTTP Server Type') do |http_server_type|
|
47
|
+
options.http_server_type = http_server_type
|
64
48
|
end
|
65
49
|
|
66
|
-
opts.on('-
|
50
|
+
opts.on('-I', '--init-type INIT_TYPE', 'Init Type') do |init_type|
|
67
51
|
options.init_type = init_type
|
68
52
|
end
|
69
53
|
|
70
|
-
opts.on('-
|
71
|
-
options.
|
54
|
+
opts.on('-P', '--package-type PACKAGE', 'Package type') do |package_type|
|
55
|
+
options.package_type = package_type
|
56
|
+
end
|
57
|
+
|
58
|
+
opts.on('-O', '--output-dir OUTPUT_DIR', 'Output Directory') do |output_dir|
|
59
|
+
options.output_dir = output_dir
|
72
60
|
end
|
73
61
|
|
74
|
-
opts.on('-
|
62
|
+
opts.on('-d', '--debug DEBUG', 'Debug Mode') do |debug|
|
75
63
|
options.debug = debug
|
76
64
|
end
|
77
65
|
|
@@ -79,6 +67,11 @@ module Gordon
|
|
79
67
|
puts opts
|
80
68
|
exit
|
81
69
|
end
|
70
|
+
|
71
|
+
opts.on('-v', '--version', 'Displays Version') do
|
72
|
+
puts VERSION
|
73
|
+
exit
|
74
|
+
end
|
82
75
|
end
|
83
76
|
|
84
77
|
parser
|
data/lib/gordon/cooker.rb
CHANGED
@@ -1,55 +1,69 @@
|
|
1
1
|
module Gordon
|
2
2
|
class Cooker
|
3
|
-
attr_reader :
|
3
|
+
attr_reader :recipe, :options
|
4
4
|
|
5
|
-
|
5
|
+
FPM_COOKERY_COMMAND = 'ruby -S fpm-cook'
|
6
|
+
FPM_COOKERY_CACHE_DIR = '/tmp/gordon/cache'
|
7
|
+
FPM_COOKERY_BUILD_DIR = '/tmp/gordon/build'
|
8
|
+
|
9
|
+
def initialize(recipe)
|
6
10
|
@recipe = recipe
|
7
|
-
@options = options
|
11
|
+
@options = recipe.options
|
8
12
|
end
|
9
13
|
|
10
14
|
def cook
|
11
|
-
|
15
|
+
clean
|
16
|
+
package
|
17
|
+
end
|
12
18
|
|
13
|
-
|
19
|
+
private
|
14
20
|
|
15
|
-
|
16
|
-
cook_args
|
17
|
-
|
18
|
-
cook_args << "
|
19
|
-
cook_args << "--pkg-dir #{File.expand_path(options.package_dir)}"
|
20
|
-
cook_args << "package"
|
21
|
+
def clean
|
22
|
+
cook_args = get_command_args
|
23
|
+
|
24
|
+
cook_args << "clean"
|
21
25
|
cook_args << recipe.application_template_path
|
22
26
|
|
23
|
-
|
24
|
-
|
27
|
+
execute(cook_args)
|
28
|
+
end
|
25
29
|
|
26
|
-
|
27
|
-
|
28
|
-
STDOUT.puts command
|
29
|
-
STDOUT.puts ''
|
30
|
-
end
|
30
|
+
def package
|
31
|
+
cook_args = get_command_args
|
31
32
|
|
32
|
-
|
33
|
+
cook_args << "package"
|
34
|
+
cook_args << recipe.application_template_path
|
35
|
+
|
36
|
+
execute(cook_args)
|
33
37
|
end
|
34
38
|
|
35
|
-
|
39
|
+
def get_command_args
|
40
|
+
cook_args = []
|
41
|
+
|
42
|
+
cook_args << "--debug" if options.debug?
|
43
|
+
|
44
|
+
cook_args << "--target #{options.package_type}"
|
45
|
+
cook_args << "--platform #{recipe.platform}" if recipe.requires_platform?
|
46
|
+
cook_args << "--pkg-dir #{File.expand_path(options.output_dir)}"
|
47
|
+
cook_args << "--cache-dir #{File.expand_path(FPM_COOKERY_CACHE_DIR)}"
|
48
|
+
cook_args << "--tmp-root #{File.expand_path(FPM_COOKERY_BUILD_DIR)}"
|
49
|
+
|
50
|
+
cook_args
|
51
|
+
end
|
36
52
|
|
37
|
-
def
|
38
|
-
env_vars =
|
53
|
+
def execute(cook_args)
|
54
|
+
env_vars = EnvVars.from_cook(options)
|
39
55
|
|
40
|
-
env_vars
|
41
|
-
env_vars << "GORDON_APP_DESC=#{options.app_desc}"
|
42
|
-
env_vars << "GORDON_APP_REPO=#{options.app_repo}"
|
43
|
-
env_vars << "GORDON_APP_VERSION=#{options.app_version}"
|
44
|
-
env_vars << "GORDON_APP_SOURCE_DIR=#{File.expand_path(options.source_dir)}"
|
56
|
+
command = "#{env_vars.join " "} #{FPM_COOKERY_COMMAND} #{cook_args.join " "}"
|
45
57
|
|
46
|
-
|
47
|
-
env_vars << "GORDON_SKELETON_FILES=#{recipe.skeleton.artifacts.join(',')}"
|
58
|
+
debug(command) if options.debug?
|
48
59
|
|
49
|
-
|
50
|
-
|
60
|
+
Process.run(command)
|
61
|
+
end
|
51
62
|
|
52
|
-
|
63
|
+
def debug(command)
|
64
|
+
STDOUT.puts ''
|
65
|
+
STDOUT.puts command
|
66
|
+
STDOUT.puts ''
|
53
67
|
end
|
54
68
|
end
|
55
69
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Gordon
|
2
|
+
module Cookery
|
3
|
+
module ApplicationUser
|
4
|
+
def create_user_and_group(home_path)
|
5
|
+
File.open(builddir('.gordon-before-install'), 'w', 0755) do |f|
|
6
|
+
bash = <<-__BASH
|
7
|
+
#!/bin/sh
|
8
|
+
|
9
|
+
set -e
|
10
|
+
|
11
|
+
/usr/bin/getent group #{$env_vars.app_name} >/dev/null || /usr/sbin/groupadd --system #{$env_vars.app_name};
|
12
|
+
/usr/bin/getent passwd #{$env_vars.app_name} >/dev/null || /usr/sbin/useradd --system --gid #{$env_vars.app_name} --home-dir #{home_path} --shell /sbin/nologin --comment "#{$env_vars.app_desc}" #{$env_vars.app_name} >/dev/null || :;
|
13
|
+
|
14
|
+
__BASH
|
15
|
+
|
16
|
+
f.write(bash)
|
17
|
+
|
18
|
+
self.class.pre_install(File.expand_path(f.path))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def setup_user_permissions(home_path)
|
23
|
+
File.open(builddir('.gordon-after-install'), 'w', 0755) do |f|
|
24
|
+
bash = <<-__BASH
|
25
|
+
#!/bin/sh
|
26
|
+
|
27
|
+
set -e
|
28
|
+
|
29
|
+
/usr/bin/chown -R #{$env_vars.app_name}:#{$env_vars.app_name} #{home_path}
|
30
|
+
|
31
|
+
__BASH
|
32
|
+
|
33
|
+
f.write(bash)
|
34
|
+
|
35
|
+
self.class.post_install(File.expand_path(f.path))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -1,16 +1,26 @@
|
|
1
1
|
module Gordon
|
2
2
|
module Cookery
|
3
3
|
module Common
|
4
|
-
|
5
|
-
safesystem('ruby -S bundle install --deployment --without development test')
|
6
|
-
end
|
4
|
+
MAIN_BLACKLIST_FILES = %w(.git .gitignore .pki Vagrantfile)
|
7
5
|
|
8
|
-
def
|
9
|
-
|
6
|
+
def get_skeleton_path_from_type(type)
|
7
|
+
skeleton_type = Skeleton::Factory.create(type)
|
8
|
+
skeleton_type.path(skeleton_type.requires_app_name? ? $env_vars.app_name : '')
|
10
9
|
end
|
11
10
|
|
12
|
-
def
|
13
|
-
|
11
|
+
def all_files_except_blacklisted(*custom_blacklist_files)
|
12
|
+
blacklist = (MAIN_BLACKLIST_FILES + custom_blacklist_files).flatten
|
13
|
+
|
14
|
+
# TODO: create a way to make a performatic grep here to avoid undesired/directory/*
|
15
|
+
files = Dir['{*,.*}'].sort[2..-1].reject do |entry|
|
16
|
+
pattern = entry.gsub(/\./, '\.').gsub(/\//, '\/')
|
17
|
+
|
18
|
+
found = blacklist.grep(/#{pattern}/i)
|
19
|
+
|
20
|
+
found.any?
|
21
|
+
end
|
22
|
+
|
23
|
+
files
|
14
24
|
end
|
15
25
|
end
|
16
26
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Gordon
|
2
|
+
module Cookery
|
3
|
+
module HttpServer
|
4
|
+
def install_http_server_files(blacklist)
|
5
|
+
skeleton_path = get_skeleton_path_from_type($env_vars.http_server_type)
|
6
|
+
|
7
|
+
application_files = all_files_except_blacklisted(blacklist)
|
8
|
+
|
9
|
+
root(skeleton_path).install application_files
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
data/lib/gordon/cookery/init.rb
CHANGED
@@ -1,25 +1,21 @@
|
|
1
1
|
module Gordon
|
2
2
|
module Cookery
|
3
3
|
module Init
|
4
|
-
def
|
5
|
-
|
6
|
-
install_init_files
|
7
|
-
end
|
4
|
+
def create_init
|
5
|
+
init_build_dir_path = builddir($env_vars.init_type)
|
8
6
|
|
9
|
-
|
10
|
-
init_build_dir_path = File.join($init_build_dir, $init_type)
|
7
|
+
command = "ruby -S foreman export --app #{$env_vars.app_name} --user #{$env_vars.app_name} #{$env_vars.init_type} #{init_build_dir_path}"
|
11
8
|
|
12
|
-
command
|
13
|
-
::Gordon::Process.run(command)
|
9
|
+
safesystem(command)
|
14
10
|
end
|
15
11
|
|
16
|
-
def
|
17
|
-
init_build_dir_path =
|
12
|
+
def install_init
|
13
|
+
init_build_dir_path = builddir($env_vars.init_type)
|
18
14
|
|
19
|
-
|
20
|
-
|
15
|
+
skeleton_path = get_skeleton_path_from_type($env_vars.init_type)
|
16
|
+
skeleton_files = Dir["#{init_build_dir_path}/*"]
|
21
17
|
|
22
|
-
root(
|
18
|
+
root(skeleton_path).install skeleton_files
|
23
19
|
end
|
24
20
|
end
|
25
21
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Gordon
|
2
|
+
module Cookery
|
3
|
+
module Ruby
|
4
|
+
module Common
|
5
|
+
RUBY_BLACKLIST_FILES = %w(.rspec coverage log spec tmp)
|
6
|
+
|
7
|
+
def ruby_vendor_gems
|
8
|
+
command = 'ruby -S bundle package --all'
|
9
|
+
safesystem(command)
|
10
|
+
|
11
|
+
command = 'ruby -S bundle install --deployment --without development test'
|
12
|
+
safesystem(command)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Gordon
|
2
|
+
class EnvVars
|
3
|
+
attr_accessor :app_name, :app_desc, :app_repo, :app_version, :app_source_dir
|
4
|
+
attr_accessor :http_server_type
|
5
|
+
attr_accessor :init_type
|
6
|
+
|
7
|
+
def self.from_cook(options)
|
8
|
+
env_vars = []
|
9
|
+
|
10
|
+
env_vars << "GORDON_APP_NAME='#{options.app_name}'"
|
11
|
+
env_vars << "GORDON_APP_DESC='#{options.app_desc}'"
|
12
|
+
env_vars << "GORDON_APP_REPO='#{options.app_repo}'"
|
13
|
+
env_vars << "GORDON_APP_VERSION='#{options.app_version}'"
|
14
|
+
env_vars << "GORDON_APP_SOURCE_DIR='#{File.expand_path(options.source_dir)}'"
|
15
|
+
env_vars << "GORDON_HTTP_SERVER_TYPE='#{options.http_server_type}'"
|
16
|
+
env_vars << "GORDON_INIT_TYPE='#{options.init_type}'"
|
17
|
+
|
18
|
+
env_vars
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.load
|
22
|
+
env_vars = self.new
|
23
|
+
|
24
|
+
env_vars.app_name = ENV['GORDON_APP_NAME']
|
25
|
+
env_vars.app_desc = ENV['GORDON_APP_DESC']
|
26
|
+
env_vars.app_repo = ENV['GORDON_APP_REPO']
|
27
|
+
env_vars.app_version = ENV['GORDON_APP_VERSION']
|
28
|
+
env_vars.app_source_dir = ENV['GORDON_APP_SOURCE_DIR']
|
29
|
+
env_vars.http_server_type = ENV['GORDON_HTTP_SERVER_TYPE']
|
30
|
+
env_vars.init_type = ENV['GORDON_INIT_TYPE']
|
31
|
+
|
32
|
+
env_vars
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
data/lib/gordon/options.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
module Gordon
|
2
2
|
class Options
|
3
3
|
attr_accessor :app_type, :app_name, :app_desc, :app_repo, :app_version
|
4
|
-
attr_accessor :package_type
|
5
|
-
attr_accessor :source_dir
|
6
|
-
attr_accessor :
|
7
|
-
attr_accessor :
|
4
|
+
attr_accessor :package_type
|
5
|
+
attr_accessor :source_dir
|
6
|
+
attr_accessor :output_dir
|
7
|
+
attr_accessor :http_server_type
|
8
|
+
attr_accessor :init_type
|
8
9
|
attr_accessor :debug
|
9
10
|
|
10
11
|
def debug? ; !!debug ; end
|
data/lib/gordon/recipe.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
|
3
1
|
module Gordon
|
4
2
|
class Recipe
|
5
|
-
attr_reader :options, :
|
3
|
+
attr_reader :options, :application
|
6
4
|
|
7
5
|
def initialize(options)
|
8
6
|
@options = options
|
9
|
-
@
|
7
|
+
@application = Application::Factory.create(options.app_type)
|
10
8
|
end
|
11
9
|
|
12
10
|
def platform
|
@@ -23,8 +21,6 @@ module Gordon
|
|
23
21
|
end
|
24
22
|
|
25
23
|
def application_template_path
|
26
|
-
application = Application::Factory.create(options.app_type)
|
27
|
-
|
28
24
|
application.template_path
|
29
25
|
end
|
30
26
|
end
|
@@ -3,7 +3,7 @@ module Gordon
|
|
3
3
|
module Types
|
4
4
|
module Base
|
5
5
|
def path(app = '')
|
6
|
-
File.join(get_default_path, app)
|
6
|
+
File.join(get_default_path, app.to_s)
|
7
7
|
end
|
8
8
|
|
9
9
|
def requires_app_name?
|
@@ -42,14 +42,6 @@ module Gordon
|
|
42
42
|
true
|
43
43
|
end
|
44
44
|
end
|
45
|
-
|
46
|
-
class Factory
|
47
|
-
def self.create(skeleton_type)
|
48
|
-
namespace = "Skeleton::Types"
|
49
|
-
|
50
|
-
::Gordon::Factory.create_instance(namespace, skeleton_type)
|
51
|
-
end
|
52
|
-
end
|
53
45
|
end
|
54
46
|
end
|
55
47
|
end
|
data/lib/gordon/version.rb
CHANGED
data/lib/gordon.rb
CHANGED
@@ -4,14 +4,18 @@ module Gordon
|
|
4
4
|
require 'gordon/cli'
|
5
5
|
require 'gordon/cooker'
|
6
6
|
require 'gordon/recipe'
|
7
|
+
require 'gordon/env_vars'
|
7
8
|
require 'gordon/factory'
|
8
9
|
require 'gordon/options'
|
9
10
|
require 'gordon/process'
|
11
|
+
require 'gordon/application/factory'
|
10
12
|
require 'gordon/application/types'
|
13
|
+
require 'gordon/cookery/application_user'
|
11
14
|
require 'gordon/cookery/common'
|
12
15
|
require 'gordon/cookery/init'
|
13
|
-
require 'gordon/cookery/
|
14
|
-
require 'gordon/
|
16
|
+
require 'gordon/cookery/http_server'
|
17
|
+
require 'gordon/cookery/ruby/common'
|
18
|
+
require 'gordon/skeleton/factory'
|
15
19
|
require 'gordon/skeleton/types'
|
16
20
|
end
|
17
21
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gordon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcelo Pinheiro
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: debugger
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: fpm-cookery
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,7 +80,8 @@ dependencies:
|
|
66
80
|
- - '>='
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '0'
|
69
|
-
description: Gordon is a tool to create
|
83
|
+
description: Gordon is a tool to create OS packages using fpm-cookery and foreman,
|
84
|
+
based on a lot of conventions.
|
70
85
|
email:
|
71
86
|
- salizzar@gmail.com
|
72
87
|
executables:
|
@@ -82,18 +97,22 @@ files:
|
|
82
97
|
- bin/gordon
|
83
98
|
- gordon.gemspec
|
84
99
|
- lib/gordon.rb
|
100
|
+
- lib/gordon/application/factory.rb
|
85
101
|
- lib/gordon/application/templates/ruby_web_app.rb
|
86
102
|
- lib/gordon/application/types.rb
|
87
103
|
- lib/gordon/cli.rb
|
88
104
|
- lib/gordon/cooker.rb
|
105
|
+
- lib/gordon/cookery/application_user.rb
|
89
106
|
- lib/gordon/cookery/common.rb
|
107
|
+
- lib/gordon/cookery/http_server.rb
|
90
108
|
- lib/gordon/cookery/init.rb
|
91
|
-
- lib/gordon/cookery/
|
109
|
+
- lib/gordon/cookery/ruby/common.rb
|
110
|
+
- lib/gordon/env_vars.rb
|
92
111
|
- lib/gordon/factory.rb
|
93
112
|
- lib/gordon/options.rb
|
94
113
|
- lib/gordon/process.rb
|
95
114
|
- lib/gordon/recipe.rb
|
96
|
-
- lib/gordon/skeleton/
|
115
|
+
- lib/gordon/skeleton/factory.rb
|
97
116
|
- lib/gordon/skeleton/types.rb
|
98
117
|
- lib/gordon/version.rb
|
99
118
|
homepage: https://github.com/salizzar/gordon
|
@@ -119,5 +138,5 @@ rubyforge_project:
|
|
119
138
|
rubygems_version: 2.0.14
|
120
139
|
signing_key:
|
121
140
|
specification_version: 4
|
122
|
-
summary: A tool to create application
|
141
|
+
summary: A tool to create application OS packages
|
123
142
|
test_files: []
|
@@ -1,14 +0,0 @@
|
|
1
|
-
module Gordon
|
2
|
-
module Cookery
|
3
|
-
module Webserver
|
4
|
-
def setup_webserver_files
|
5
|
-
skeleton_type = ::Gordon::Skeleton::Types::Factory.create($skeleton_type)
|
6
|
-
skeleton_path = get_skeleton_path(skeleton_type)
|
7
|
-
|
8
|
-
root(skeleton_path).install common_ruby_files
|
9
|
-
root(skeleton_path).install $skeleton_files.split(',')
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
data/lib/gordon/skeleton/info.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
module Gordon
|
2
|
-
module Skeleton
|
3
|
-
class Info
|
4
|
-
attr_reader :type, :artifacts
|
5
|
-
|
6
|
-
BLACKLIST = %w(.git log spec Vagrantfile coverage tmp/cache)
|
7
|
-
|
8
|
-
def initialize(type, source_dir)
|
9
|
-
@type, @artifacts = type, clean_source_files(source_dir)
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def clean_source_files(source_dir)
|
15
|
-
source_path = File.join(source_dir, '*')
|
16
|
-
|
17
|
-
all_files = Dir[source_path]
|
18
|
-
|
19
|
-
blacklist = BLACKLIST.map do |file|
|
20
|
-
File.join(source_dir, file)
|
21
|
-
end
|
22
|
-
|
23
|
-
all_files - blacklist
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|