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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8807e453ec5c7d49cef487a753959d7a88e53a46
4
- data.tar.gz: 3ed6815c1615d8c5a39ee20c862dd509c8b63056
3
+ metadata.gz: d21831aed237045e8396c6ad00348cfd611aa5e2
4
+ data.tar.gz: 1400ab3969f8df1a9a097030c6bc6db18737416e
5
5
  SHA512:
6
- metadata.gz: 2d25d8c05b10dd34c1e7ef11cc7adf9695897f6930efebe2afbee1949e0a636a5fe636c84713e0a7fae07c58ff0ab06052f11a1e92c823fd43c6e6c0eb29c25a
7
- data.tar.gz: 9c5fd2889928bb9a481d785c7900e4739021c4bfbc52a07f13820add8bae277f722d9ba4c6a343fb88c4d64d91d247a77fa3a1619b6b7fb29c55b62066b16bc9
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
- A simple example to build a Ruby Web App that runs Nginx and uses Systemd as init process:
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
- --app-type ruby_web_app \
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
@@ -22,6 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "debugger"
24
24
 
25
+ spec.add_dependency "bundler"
25
26
  spec.add_dependency "fpm-cookery"
26
27
  spec.add_dependency "foreman"
27
28
  end
@@ -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.source_dir = Dir.pwd
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('-N', '--app-name APP_NAME', 'Application Name') do |name|
23
- options.app_name = name
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('-D', '--app-desc APP_DESC', 'Application Description') do |desc|
27
- options.app_desc = desc
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('-R', '--app-repo APP_REPO', 'Application Repository URL') do |repo|
31
- options.app_repo = repo
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('-V', '--app-version APP_VERSION', 'Application Version') do |version|
35
- options.app_version = version
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('-S', '--app-source-dir APP_SOURCE_DIR', 'Application Source Directory') do |source_dir|
39
- options.source_dir = source_dir
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('-T', '--app-type APP_TYPE', 'Application Type') do |type|
43
- options.app_type = type
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 DEBUG', 'Debug Mode') do |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 #{$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 || :;
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 #{$env_vars.app_name}:#{$env_vars.app_name} #{home_path}
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 = Skeleton::Factory.create(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($env_vars.http_server_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
 
@@ -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($env_vars.init_type)
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 #{$env_vars.app_name} --user #{$env_vars.app_name} #{$env_vars.init_type} #{init_build_dir_path}"
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($env_vars.init_type)
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($env_vars.init_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
@@ -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.source_dir)}'"
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
 
@@ -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 :package_type
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
@@ -9,11 +9,11 @@ module Gordon
9
9
 
10
10
  def platform
11
11
  map = {
12
- 'rpm' => 'centos',
13
- 'deb' => 'debian',
12
+ rpm: :centos,
13
+ deb: :debian,
14
14
  }
15
15
 
16
- map[options.package_type]
16
+ map[options.package_type.to_sym]
17
17
  end
18
18
 
19
19
  def requires_platform?
@@ -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 Httpd
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 Misc
30
+ class Systemd
27
31
  include Base
28
32
 
29
- def get_default_path ; '/opt' ; end
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 Systemd
42
+ class Misc
37
43
  include Base
38
44
 
39
- def get_default_path ; '/usr/lib/systemd/system' ; end
45
+ def get_default_path ; '/opt' ; end
40
46
 
41
47
  def requires_app_name?
42
48
  true
@@ -1,3 +1,3 @@
1
1
  module Gordon
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
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.6
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: 2014-12-16 00:00:00.000000000 Z
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