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 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