gordon 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -5
- data/gordon.gemspec +1 -0
- data/lib/gordon/application/templates/ruby_web_app.rb +9 -5
- data/lib/gordon/cli.rb +18 -14
- data/lib/gordon/cooker.rb +1 -0
- data/lib/gordon/cookery/application_user.rb +5 -5
- data/lib/gordon/cookery/common.rb +9 -1
- data/lib/gordon/cookery/dependency_resolver.rb +43 -0
- data/lib/gordon/cookery/http_server.rb +2 -2
- data/lib/gordon/cookery/init.rb +6 -6
- data/lib/gordon/env_vars.rb +7 -2
- data/lib/gordon/options.rb +4 -4
- data/lib/gordon/recipe.rb +3 -3
- data/lib/gordon/skeleton/types.rb +11 -5
- data/lib/gordon/version.rb +1 -1
- data/lib/gordon.rb +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d21831aed237045e8396c6ad00348cfd611aa5e2
|
4
|
+
data.tar.gz: 1400ab3969f8df1a9a097030c6bc6db18737416e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1de1546c9e254b274b837f0cba5b91322eae91db74b13b1a24ba1cd687e6d624d5934c3168c34e1e266284e8a007914fbe7f7152342d24ac3eb6c4ac81065f3
|
7
|
+
data.tar.gz: 38d9b6b2c8554d24c724b63ada72d1372e46cecf6e36adf8c699352fa88dcd7575655393004ecd1dac02d1ab1becd6d7807869ef8a6103d928fff29a507021ed
|
data/README.md
CHANGED
@@ -42,15 +42,16 @@ Or install it yourself as:
|
|
42
42
|
|
43
43
|
## Usage
|
44
44
|
|
45
|
-
|
45
|
+
Here a simple example to build a Ruby Web App that runs Nginx and uses Systemd as init process. Just enter on source folder of your app and run in your terminal:
|
46
46
|
|
47
47
|
$ ruby -S gordon \
|
48
|
+
--app-type ruby_web_app \
|
48
49
|
--app-name $APP_NAME \
|
49
50
|
--app-desc $APP_DESC \
|
50
51
|
--app-repo $APP_REPO \
|
51
52
|
--app-version $APP_VERSION \
|
52
53
|
--app-source-dir . \
|
53
|
-
--
|
54
|
+
--runtime-version $MRI_VERSION \
|
54
55
|
--http-server-type nginx \
|
55
56
|
--init-type systemd \
|
56
57
|
--package-type rpm \
|
@@ -82,11 +83,10 @@ Because I like Gordon Ramsay.
|
|
82
83
|
|
83
84
|
## TODO
|
84
85
|
|
85
|
-
* Very unstable, need to fix it
|
86
86
|
* Validate outputs
|
87
|
-
* Add a way to map package dependencies
|
88
|
-
* Adapt to use Debian and other OS conventions for Nginx and Apache
|
89
87
|
* Tests
|
88
|
+
* Very unstable, need to fix it
|
89
|
+
* Debian check (gem heavly developed under CentOS environment)
|
90
90
|
|
91
91
|
## Contributing
|
92
92
|
|
data/gordon.gemspec
CHANGED
@@ -6,6 +6,8 @@ require 'gordon'
|
|
6
6
|
$env_vars = Gordon::EnvVars.load
|
7
7
|
|
8
8
|
class RubyWebApp < FPM::Cookery::Recipe
|
9
|
+
extend Gordon::Cookery::DependencyResolver
|
10
|
+
|
9
11
|
include Gordon::Cookery::Common,
|
10
12
|
Gordon::Cookery::Init,
|
11
13
|
Gordon::Cookery::ApplicationUser,
|
@@ -19,20 +21,22 @@ class RubyWebApp < FPM::Cookery::Recipe
|
|
19
21
|
|
20
22
|
source $env_vars.app_source_dir, with: :local_path
|
21
23
|
|
24
|
+
depends *resolve_dependencies($env_vars)
|
25
|
+
|
22
26
|
def build
|
23
27
|
home_path = get_skeleton_path_from_type($env_vars.http_server_type)
|
24
28
|
|
25
|
-
create_user_and_group(home_path)
|
26
|
-
setup_user_permissions(home_path)
|
29
|
+
create_user_and_group($env_vars, home_path)
|
30
|
+
setup_user_permissions($env_vars, home_path)
|
27
31
|
|
28
|
-
create_init
|
32
|
+
create_init($env_vars)
|
29
33
|
|
30
34
|
ruby_vendor_gems
|
31
35
|
end
|
32
36
|
|
33
37
|
def install
|
34
|
-
install_init
|
35
|
-
install_http_server_files(RUBY_BLACKLIST_FILES)
|
38
|
+
install_init($env_vars)
|
39
|
+
install_http_server_files($env_vars, RUBY_BLACKLIST_FILES)
|
36
40
|
end
|
37
41
|
end
|
38
42
|
|
data/lib/gordon/cli.rb
CHANGED
@@ -4,7 +4,7 @@ module Gordon
|
|
4
4
|
class CLI
|
5
5
|
def self.run
|
6
6
|
options = Options.new
|
7
|
-
options.
|
7
|
+
options.app_source_dir = Dir.pwd
|
8
8
|
options.output_dir = Dir.pwd
|
9
9
|
|
10
10
|
parser = create_option_parser(options)
|
@@ -19,28 +19,32 @@ module Gordon
|
|
19
19
|
parser = OptionParser.new do |opts|
|
20
20
|
opts.banner = 'Usage: gordon [options]'
|
21
21
|
|
22
|
-
opts.on('-
|
23
|
-
options.
|
22
|
+
opts.on('-T', '--app-type APP_TYPE', 'Application Type') do |app_type|
|
23
|
+
options.app_type = app_type
|
24
24
|
end
|
25
25
|
|
26
|
-
opts.on('-
|
27
|
-
options.
|
26
|
+
opts.on('-N', '--app-name APP_NAME', 'Application Name') do |app_name|
|
27
|
+
options.app_name = app_name
|
28
28
|
end
|
29
29
|
|
30
|
-
opts.on('-
|
31
|
-
options.
|
30
|
+
opts.on('-D', '--app-desc APP_DESC', 'Application Description') do |app_desc|
|
31
|
+
options.app_desc = app_desc
|
32
32
|
end
|
33
33
|
|
34
|
-
opts.on('-
|
35
|
-
options.
|
34
|
+
opts.on('-R', '--app-repo APP_REPO', 'Application Repository URL') do |app_repo|
|
35
|
+
options.app_repo = app_repo
|
36
36
|
end
|
37
37
|
|
38
|
-
opts.on('-
|
39
|
-
options.
|
38
|
+
opts.on('-V', '--app-version APP_VERSION', 'Application Version') do |app_version|
|
39
|
+
options.app_version = app_version
|
40
40
|
end
|
41
41
|
|
42
|
-
opts.on('-
|
43
|
-
options.
|
42
|
+
opts.on('-S', '--app-source-dir APP_SOURCE_DIR', 'Application Source Directory') do |app_source_dir|
|
43
|
+
options.app_source_dir = app_source_dir
|
44
|
+
end
|
45
|
+
|
46
|
+
opts.on('-R', '--runtime-version RUNTIME_VERSION', 'Runtime Version') do |runtime_version|
|
47
|
+
options.runtime_version = runtime_version
|
44
48
|
end
|
45
49
|
|
46
50
|
opts.on('-H', '--http-server-type HTTP_SERVER_TYPE', 'HTTP Server Type') do |http_server_type|
|
@@ -59,7 +63,7 @@ module Gordon
|
|
59
63
|
options.output_dir = output_dir
|
60
64
|
end
|
61
65
|
|
62
|
-
opts.on('-d', '--debug
|
66
|
+
opts.on('-d', '--debug', 'Debug Mode') do |debug|
|
63
67
|
options.debug = debug
|
64
68
|
end
|
65
69
|
|
data/lib/gordon/cooker.rb
CHANGED
@@ -46,6 +46,7 @@ module Gordon
|
|
46
46
|
cook_args << "--pkg-dir #{File.expand_path(options.output_dir)}"
|
47
47
|
cook_args << "--cache-dir #{File.expand_path(FPM_COOKERY_CACHE_DIR)}"
|
48
48
|
cook_args << "--tmp-root #{File.expand_path(FPM_COOKERY_BUILD_DIR)}"
|
49
|
+
cook_args << "--no-deps"
|
49
50
|
|
50
51
|
cook_args
|
51
52
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module Gordon
|
2
2
|
module Cookery
|
3
3
|
module ApplicationUser
|
4
|
-
def create_user_and_group(home_path)
|
4
|
+
def create_user_and_group(env_vars, home_path)
|
5
5
|
File.open(builddir('.gordon-before-install'), 'w', 0755) do |f|
|
6
6
|
bash = <<-__BASH
|
7
7
|
#!/bin/sh
|
8
8
|
|
9
9
|
set -e
|
10
10
|
|
11
|
-
/usr/bin/getent group #{
|
12
|
-
/usr/bin/getent passwd #{
|
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
13
|
|
14
14
|
__BASH
|
15
15
|
|
@@ -19,14 +19,14 @@ set -e
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
def setup_user_permissions(home_path)
|
22
|
+
def setup_user_permissions(env_vars, home_path)
|
23
23
|
File.open(builddir('.gordon-after-install'), 'w', 0755) do |f|
|
24
24
|
bash = <<-__BASH
|
25
25
|
#!/bin/sh
|
26
26
|
|
27
27
|
set -e
|
28
28
|
|
29
|
-
/usr/bin/chown -R #{
|
29
|
+
/usr/bin/chown -R #{env_vars.app_name}:#{env_vars.app_name} #{home_path}
|
30
30
|
|
31
31
|
__BASH
|
32
32
|
|
@@ -3,8 +3,12 @@ module Gordon
|
|
3
3
|
module Common
|
4
4
|
MAIN_BLACKLIST_FILES = %w(.git .gitignore .pki Vagrantfile)
|
5
5
|
|
6
|
+
def self.included(base)
|
7
|
+
base.send(:extend, self)
|
8
|
+
end
|
9
|
+
|
6
10
|
def get_skeleton_path_from_type(type)
|
7
|
-
skeleton_type =
|
11
|
+
skeleton_type = create_skeleton_type(type)
|
8
12
|
skeleton_type.path(skeleton_type.requires_app_name? ? $env_vars.app_name : '')
|
9
13
|
end
|
10
14
|
|
@@ -22,6 +26,10 @@ module Gordon
|
|
22
26
|
|
23
27
|
files
|
24
28
|
end
|
29
|
+
|
30
|
+
def create_skeleton_type(type)
|
31
|
+
Skeleton::Factory.create(type)
|
32
|
+
end
|
25
33
|
end
|
26
34
|
end
|
27
35
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Gordon
|
2
|
+
module Cookery
|
3
|
+
module DependencyResolver
|
4
|
+
def resolve_dependencies(env_vars)
|
5
|
+
fragments = env_vars.app_type.split('_')
|
6
|
+
app_runtime, app_type = fragments[0], fragments[1]
|
7
|
+
|
8
|
+
dependencies = []
|
9
|
+
dependencies << get_runtime_package_name(app_runtime, env_vars)
|
10
|
+
dependencies << get_http_server_package_name(env_vars) if app_type == 'web'
|
11
|
+
dependencies << get_init_package_name(env_vars)
|
12
|
+
|
13
|
+
dependencies.collect(&:to_s)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def get_runtime_package_name(app_runtime, env_vars)
|
19
|
+
runtime_version = "#{app_runtime} = #{env_vars.runtime_version}"
|
20
|
+
|
21
|
+
runtime_version
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_http_server_package_name(env_vars)
|
25
|
+
get_os_package_name(env_vars, :http_server_type)
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_init_package_name(env_vars)
|
29
|
+
get_os_package_name(env_vars, :init_type)
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_os_package_name(env_vars, attribute)
|
33
|
+
package_type = FPM::Cookery::Facts.platform.to_sym
|
34
|
+
|
35
|
+
skeleton_type = create_skeleton_type(env_vars.send(attribute))
|
36
|
+
os_package_name = skeleton_type.get_os_package_map[package_type]
|
37
|
+
|
38
|
+
os_package_name
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Gordon
|
2
2
|
module Cookery
|
3
3
|
module HttpServer
|
4
|
-
def install_http_server_files(blacklist)
|
5
|
-
skeleton_path = get_skeleton_path_from_type(
|
4
|
+
def install_http_server_files(env_vars, blacklist)
|
5
|
+
skeleton_path = get_skeleton_path_from_type(env_vars.http_server_type)
|
6
6
|
|
7
7
|
application_files = all_files_except_blacklisted(blacklist)
|
8
8
|
|
data/lib/gordon/cookery/init.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
module Gordon
|
2
2
|
module Cookery
|
3
3
|
module Init
|
4
|
-
def create_init
|
5
|
-
init_build_dir_path = builddir(
|
4
|
+
def create_init(env_vars)
|
5
|
+
init_build_dir_path = builddir(env_vars.init_type)
|
6
6
|
|
7
|
-
command = "ruby -S foreman export --app #{
|
7
|
+
command = "ruby -S foreman export --app #{env_vars.app_name} --user #{env_vars.app_name} #{env_vars.init_type} #{init_build_dir_path}"
|
8
8
|
|
9
9
|
safesystem(command)
|
10
10
|
end
|
11
11
|
|
12
|
-
def install_init
|
13
|
-
init_build_dir_path = builddir(
|
12
|
+
def install_init(env_vars)
|
13
|
+
init_build_dir_path = builddir(env_vars.init_type)
|
14
14
|
|
15
|
-
skeleton_path = get_skeleton_path_from_type(
|
15
|
+
skeleton_path = get_skeleton_path_from_type(env_vars.init_type)
|
16
16
|
skeleton_files = Dir["#{init_build_dir_path}/*"]
|
17
17
|
|
18
18
|
root(skeleton_path).install skeleton_files
|
data/lib/gordon/env_vars.rb
CHANGED
@@ -1,17 +1,20 @@
|
|
1
1
|
module Gordon
|
2
2
|
class EnvVars
|
3
|
-
attr_accessor :app_name, :app_desc, :app_repo, :app_version, :app_source_dir
|
3
|
+
attr_accessor :app_type, :app_name, :app_desc, :app_repo, :app_version, :app_source_dir
|
4
|
+
attr_accessor :runtime_version
|
4
5
|
attr_accessor :http_server_type
|
5
6
|
attr_accessor :init_type
|
6
7
|
|
7
8
|
def self.from_cook(options)
|
8
9
|
env_vars = []
|
9
10
|
|
11
|
+
env_vars << "GORDON_APP_TYPE='#{options.app_type}'"
|
10
12
|
env_vars << "GORDON_APP_NAME='#{options.app_name}'"
|
11
13
|
env_vars << "GORDON_APP_DESC='#{options.app_desc}'"
|
12
14
|
env_vars << "GORDON_APP_REPO='#{options.app_repo}'"
|
13
15
|
env_vars << "GORDON_APP_VERSION='#{options.app_version}'"
|
14
|
-
env_vars << "GORDON_APP_SOURCE_DIR='#{File.expand_path(options.
|
16
|
+
env_vars << "GORDON_APP_SOURCE_DIR='#{File.expand_path(options.app_source_dir)}'"
|
17
|
+
env_vars << "GORDON_RUNTIME_VERSION='#{options.runtime_version}'"
|
15
18
|
env_vars << "GORDON_HTTP_SERVER_TYPE='#{options.http_server_type}'"
|
16
19
|
env_vars << "GORDON_INIT_TYPE='#{options.init_type}'"
|
17
20
|
|
@@ -21,11 +24,13 @@ module Gordon
|
|
21
24
|
def self.load
|
22
25
|
env_vars = self.new
|
23
26
|
|
27
|
+
env_vars.app_type = ENV['GORDON_APP_TYPE']
|
24
28
|
env_vars.app_name = ENV['GORDON_APP_NAME']
|
25
29
|
env_vars.app_desc = ENV['GORDON_APP_DESC']
|
26
30
|
env_vars.app_repo = ENV['GORDON_APP_REPO']
|
27
31
|
env_vars.app_version = ENV['GORDON_APP_VERSION']
|
28
32
|
env_vars.app_source_dir = ENV['GORDON_APP_SOURCE_DIR']
|
33
|
+
env_vars.runtime_version = ENV['GORDON_RUNTIME_VERSION']
|
29
34
|
env_vars.http_server_type = ENV['GORDON_HTTP_SERVER_TYPE']
|
30
35
|
env_vars.init_type = ENV['GORDON_INIT_TYPE']
|
31
36
|
|
data/lib/gordon/options.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
module Gordon
|
2
2
|
class Options
|
3
|
-
attr_accessor :app_type, :app_name, :app_desc, :app_repo, :app_version
|
4
|
-
attr_accessor :
|
5
|
-
attr_accessor :source_dir
|
6
|
-
attr_accessor :output_dir
|
3
|
+
attr_accessor :app_type, :app_name, :app_desc, :app_repo, :app_version, :app_source_dir
|
4
|
+
attr_accessor :runtime_version
|
7
5
|
attr_accessor :http_server_type
|
8
6
|
attr_accessor :init_type
|
7
|
+
attr_accessor :package_type
|
8
|
+
attr_accessor :output_dir
|
9
9
|
attr_accessor :debug
|
10
10
|
|
11
11
|
def debug? ; !!debug ; end
|
data/lib/gordon/recipe.rb
CHANGED
@@ -14,29 +14,35 @@ module Gordon
|
|
14
14
|
class Nginx
|
15
15
|
include Base
|
16
16
|
|
17
|
+
def get_os_package_map ; { centos: :nginx, debian: :nginx } ; end
|
18
|
+
|
17
19
|
def get_default_path ; '/usr/share/nginx/html' ; end
|
18
20
|
end
|
19
21
|
|
20
|
-
class
|
22
|
+
class Apache
|
21
23
|
include Base
|
22
24
|
|
25
|
+
def get_os_package_map ; { centos: :httpd, debian: :apache2 } ; end
|
26
|
+
|
23
27
|
def get_default_path ; '/var/www/html' ; end
|
24
28
|
end
|
25
29
|
|
26
|
-
class
|
30
|
+
class Systemd
|
27
31
|
include Base
|
28
32
|
|
29
|
-
def
|
33
|
+
def get_os_package_map ; { centos: :systemd, debian: :systemd } ; end
|
34
|
+
|
35
|
+
def get_default_path ; '/usr/lib/systemd/system' ; end
|
30
36
|
|
31
37
|
def requires_app_name?
|
32
38
|
true
|
33
39
|
end
|
34
40
|
end
|
35
41
|
|
36
|
-
class
|
42
|
+
class Misc
|
37
43
|
include Base
|
38
44
|
|
39
|
-
def get_default_path ; '/
|
45
|
+
def get_default_path ; '/opt' ; end
|
40
46
|
|
41
47
|
def requires_app_name?
|
42
48
|
true
|
data/lib/gordon/version.rb
CHANGED
data/lib/gordon.rb
CHANGED
@@ -12,6 +12,7 @@ module Gordon
|
|
12
12
|
require 'gordon/application/types'
|
13
13
|
require 'gordon/cookery/application_user'
|
14
14
|
require 'gordon/cookery/common'
|
15
|
+
require 'gordon/cookery/dependency_resolver'
|
15
16
|
require 'gordon/cookery/init'
|
16
17
|
require 'gordon/cookery/http_server'
|
17
18
|
require 'gordon/cookery/ruby/common'
|
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.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcelo Pinheiro
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: fpm-cookery
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -104,6 +118,7 @@ files:
|
|
104
118
|
- lib/gordon/cooker.rb
|
105
119
|
- lib/gordon/cookery/application_user.rb
|
106
120
|
- lib/gordon/cookery/common.rb
|
121
|
+
- lib/gordon/cookery/dependency_resolver.rb
|
107
122
|
- lib/gordon/cookery/http_server.rb
|
108
123
|
- lib/gordon/cookery/init.rb
|
109
124
|
- lib/gordon/cookery/ruby/common.rb
|