gordon 0.0.6 → 0.0.7
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 +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
|