gordon 0.0.4 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
|