gordon 0.0.21 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +85 -12
- data/gordon.gemspec +2 -0
- data/lib/gordon/application/factory.rb +1 -1
- data/lib/gordon/application/templates/java_standalone_app.rb +43 -0
- data/lib/gordon/cli.rb +6 -2
- data/lib/gordon/cookbook.rb +29 -0
- data/lib/gordon/cooker.rb +19 -16
- data/lib/gordon/cookery/dependency_resolver.rb +29 -15
- data/lib/gordon/cookery/http_server.rb +3 -1
- data/lib/gordon/cookery/standalone.rb +3 -1
- data/lib/gordon/cookery/web_server.rb +3 -1
- data/lib/gordon/env_vars.rb +14 -14
- data/lib/gordon/options.rb +28 -2
- data/lib/gordon/version.rb +1 -1
- data/lib/gordon.rb +1 -0
- data/spec/gordon/application/factory_spec.rb +49 -3
- data/spec/gordon/application/templates/java_standalone_app_spec.rb +16 -0
- data/spec/gordon/cli_spec.rb +41 -20
- data/spec/gordon/cookbook_spec.rb +56 -0
- data/spec/gordon/cooker_spec.rb +20 -19
- data/spec/gordon/cookery/dependency_resolver_spec.rb +48 -16
- data/spec/gordon/cookery/http_server_spec.rb +3 -2
- data/spec/gordon/cookery/standalone_spec.rb +7 -6
- data/spec/gordon/cookery/web_server_spec.rb +3 -2
- data/spec/gordon/env_vars_spec.rb +28 -23
- data/spec/gordon/options_spec.rb +68 -2
- data/spec/gordon/process_spec.rb +1 -1
- data/spec/spec_helper.rb +7 -0
- metadata +37 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2302a6d87784b1ca55883765df7fb291a46d89cf
|
4
|
+
data.tar.gz: a61805f3bccaa4cf6a57b9059bb8bd8965cea903
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9468e34edace9a9e4f78150b782c7c724209a952c947b74c194affafd74bb5ce9e7157aeac7674f217f935880882d23fdba08f74df19800fcdff782b26e1b12c
|
7
|
+
data.tar.gz: a9ebb25612ba992deda25d8d8f2915e95a98b262f487f337e48d0cc6c8dfc6d52a7149ba5a07daa0e890ae5dc256268291fe90c1e30efaf438c521e3d6eaef27
|
data/README.md
CHANGED
@@ -26,13 +26,14 @@ Per example: create a user that will run app with credentials, whose $HOME is th
|
|
26
26
|
|
27
27
|
* Web Servers: Tomcat or Jetty;
|
28
28
|
|
29
|
-
* Init scripts: Systemd
|
29
|
+
* Init scripts: Systemd;
|
30
30
|
|
31
31
|
* Apps supported:
|
32
32
|
|
33
33
|
* Ruby Web (resides based on Http Server of choice)
|
34
34
|
* Ruby Standalone (resides on /opt/*app_name*)
|
35
35
|
* Java Web (resides based on Web Server of choice)
|
36
|
+
* Java Standalone (resides on /opt/*app_name*)
|
36
37
|
|
37
38
|
## Installation
|
38
39
|
|
@@ -50,6 +51,51 @@ Or install it yourself as:
|
|
50
51
|
|
51
52
|
## Usage
|
52
53
|
|
54
|
+
Gordon have two ways to package applications. You can create a yaml file called `gordon.yml` on root of your app. Here an example:
|
55
|
+
|
56
|
+
```
|
57
|
+
recipes:
|
58
|
+
# web app
|
59
|
+
- app_name: web-app
|
60
|
+
app_description: web-app
|
61
|
+
app_homepage: https://github.com/web/app
|
62
|
+
app_type: web
|
63
|
+
app_source: web-app/
|
64
|
+
app_source_excludes:
|
65
|
+
- log
|
66
|
+
- tmp
|
67
|
+
|
68
|
+
runtime_name: ruby
|
69
|
+
runtime_version: 2.2.2
|
70
|
+
http_server_type: nginx
|
71
|
+
init_type: systemd
|
72
|
+
|
73
|
+
package_type: rpm
|
74
|
+
output_dir: pkg
|
75
|
+
|
76
|
+
# standalone app
|
77
|
+
- app_name: standalone-app
|
78
|
+
app_description: standalone-app
|
79
|
+
app_homepage: https://github.com/standalone/app
|
80
|
+
app_type: standalone
|
81
|
+
app_source: standalone-app/
|
82
|
+
app_source_excludes:
|
83
|
+
- classes
|
84
|
+
|
85
|
+
runtime_name: oracle-jre
|
86
|
+
runtime_version: 1.8.0_45
|
87
|
+
|
88
|
+
package_type: rpm
|
89
|
+
output_dir: pkg
|
90
|
+
|
91
|
+
```
|
92
|
+
|
93
|
+
For more details about all parameters available, please run `gordon --help` for more details.
|
94
|
+
|
95
|
+
Another way is using CLI directly. Below some examples how to use it.
|
96
|
+
|
97
|
+
### Usage: Packing a Ruby Web Application
|
98
|
+
|
53
99
|
First, you need to vendorize all gems in deployment mode:
|
54
100
|
|
55
101
|
$ ruby -S bundle package --all
|
@@ -60,8 +106,8 @@ Here a simple example to build a Ruby Web App that runs Nginx and uses Systemd a
|
|
60
106
|
|
61
107
|
$ ruby -S gordon \
|
62
108
|
--app-type web \
|
63
|
-
--app-name my-app
|
64
|
-
--app-description "my app"
|
109
|
+
--app-name my-ruby-app \
|
110
|
+
--app-description "my ruby app" \
|
65
111
|
--app-homepage https://github.com/myuser/my-app \
|
66
112
|
--app-version 1.0.0 \
|
67
113
|
--app-source . \
|
@@ -80,20 +126,46 @@ It will generate a RPM package in pkg/ with the following structure:
|
|
80
126
|
|
81
127
|
Due for conventions, remember:
|
82
128
|
|
83
|
-
* /usr/share/nginx/html is $HOME of user *app-name
|
129
|
+
* /usr/share/nginx/html is $HOME of user *app-name*;
|
84
130
|
* Systemd will run app using user *app-name.target*
|
85
131
|
|
86
132
|
Sounds good?
|
87
133
|
|
88
|
-
|
134
|
+
### Usage: Java Web Application
|
89
135
|
|
90
136
|
First, generate war files. After, do the following steps:
|
91
137
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
138
|
+
$ ruby -S gordon \
|
139
|
+
--app-type web \
|
140
|
+
--app-name my-java-app \
|
141
|
+
--app-description "my java app" \
|
142
|
+
--app-homepage https://github.com/myuser/my-app \
|
143
|
+
--app-version 1.0.0 \
|
144
|
+
--app-source path/of/application.war \
|
145
|
+
--runtime-name oracle-jdk \
|
146
|
+
--runtime-version 1.8.0_45 \
|
147
|
+
--http-server-type apache \
|
148
|
+
--web-server-type tomcat \
|
149
|
+
--package-type rpm \
|
150
|
+
--output pkg
|
151
|
+
|
152
|
+
You must avoid `--init-type` because war files are handled by application server of choice (Tomcat or Jetty).
|
153
|
+
|
154
|
+
## Usage: Java Standalone Application
|
155
|
+
|
156
|
+
Generate jar files before and after pass some parameters:
|
157
|
+
|
158
|
+
$ ruby -S gordon \
|
159
|
+
--app-type web \
|
160
|
+
--app-name my-java-standalone-app \
|
161
|
+
--app-description "my java standalone app" \
|
162
|
+
--app-homepage https://github.com/myuser/my-app \
|
163
|
+
--app-version 1.0.0 \
|
164
|
+
--app-source path/of/application.jar \
|
165
|
+
--runtime-name oracle-jdk \
|
166
|
+
--runtime-version 1.8.0_45 \
|
167
|
+
--package-type rpm \
|
168
|
+
--output pkg
|
97
169
|
|
98
170
|
## Why you not use Omnibus or Heroku buildpacks?
|
99
171
|
|
@@ -113,9 +185,10 @@ Because I like Gordon Ramsay.
|
|
113
185
|
|
114
186
|
## TODO
|
115
187
|
|
116
|
-
* Add Oracle JRE support for Debian (oracle-jre-installer?)
|
117
|
-
* Validate inputs
|
118
188
|
* Debian check (gem heavly developed under CentOS environment)
|
189
|
+
* Export init files to other formats supported by foreman;
|
190
|
+
* Add Oracle JRE / JDK support for Debian (maybe oracle-jre-installer?)
|
191
|
+
* Validate inputs
|
119
192
|
|
120
193
|
## Contributing
|
121
194
|
|
data/gordon.gemspec
CHANGED
@@ -20,6 +20,8 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "rake"
|
22
22
|
spec.add_development_dependency "rspec"
|
23
|
+
spec.add_development_dependency "byebug"
|
24
|
+
spec.add_development_dependency "simplecov"
|
23
25
|
|
24
26
|
spec.add_dependency "fpm-cookery"
|
25
27
|
spec.add_dependency "foreman"
|
@@ -5,7 +5,7 @@ module Gordon
|
|
5
5
|
namespace = "Application::Types"
|
6
6
|
|
7
7
|
runtime_name = options.runtime_name
|
8
|
-
runtime_name = :java if runtime_name =~ /
|
8
|
+
runtime_name = :java if runtime_name =~ /j(dk|re)/
|
9
9
|
application_type = "#{runtime_name}_#{options.app_type}_app"
|
10
10
|
|
11
11
|
::Gordon::Factory.create_instance(namespace, application_type)
|
@@ -0,0 +1,43 @@
|
|
1
|
+
path = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'lib'))
|
2
|
+
$LOAD_PATH.unshift path
|
3
|
+
|
4
|
+
require 'gordon'
|
5
|
+
|
6
|
+
$env_vars = Gordon::EnvVars.load
|
7
|
+
|
8
|
+
class JavaStandaloneApp < FPM::Cookery::Recipe
|
9
|
+
extend Gordon::Cookery::DependencyResolver
|
10
|
+
|
11
|
+
include Gordon::Cookery::Common,
|
12
|
+
Gordon::Cookery::Init,
|
13
|
+
Gordon::Cookery::Log,
|
14
|
+
Gordon::Cookery::ApplicationUser,
|
15
|
+
Gordon::Cookery::Standalone,
|
16
|
+
Gordon::Cookery::Java::Common
|
17
|
+
|
18
|
+
name $env_vars.app_name
|
19
|
+
description $env_vars.app_description
|
20
|
+
version $env_vars.app_version
|
21
|
+
homepage $env_vars.app_homepage
|
22
|
+
|
23
|
+
source $env_vars.app_source, with: :local_path
|
24
|
+
|
25
|
+
depends *resolve_dependencies($env_vars, platform)
|
26
|
+
|
27
|
+
fpm_attributes["#{FPM::Cookery::Facts.target}_user".to_sym] = $env_vars.app_name
|
28
|
+
fpm_attributes["#{FPM::Cookery::Facts.target}_group".to_sym] = $env_vars.app_name
|
29
|
+
|
30
|
+
def build
|
31
|
+
home_path = get_skeleton_path_from_type($env_vars, :misc)
|
32
|
+
|
33
|
+
create_user_and_group($env_vars, home_path)
|
34
|
+
setup_user_permissions($env_vars, home_path)
|
35
|
+
end
|
36
|
+
|
37
|
+
def install
|
38
|
+
create_log_folder($env_vars)
|
39
|
+
|
40
|
+
install_standalone_files($env_vars, JAVA_BLACKLIST_FILES)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
data/lib/gordon/cli.rb
CHANGED
@@ -10,8 +10,8 @@ module Gordon
|
|
10
10
|
parser = create_option_parser(options)
|
11
11
|
parser.parse!
|
12
12
|
|
13
|
-
|
14
|
-
cooker = Cooker.new(
|
13
|
+
recipes = Cookbook.exists? ? Cookbook.read_and_merge_with(options) : [ Recipe.new(options) ]
|
14
|
+
cooker = Cooker.new(recipes)
|
15
15
|
cooker.cook
|
16
16
|
end
|
17
17
|
|
@@ -39,6 +39,10 @@ module Gordon
|
|
39
39
|
options.app_source = app_source
|
40
40
|
end
|
41
41
|
|
42
|
+
opts.on('-E', '--app-source-excludes APP_SOURCE_EXCLUDES', 'Application Source Excludes List') do |app_source_excludes|
|
43
|
+
options.app_source_excludes = app_source_excludes
|
44
|
+
end
|
45
|
+
|
42
46
|
opts.on('-T', '--app-type APP_TYPE', 'Application Type') do |app_type|
|
43
47
|
options.app_type = app_type
|
44
48
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'erb'
|
3
|
+
|
4
|
+
module Gordon
|
5
|
+
class Cookbook
|
6
|
+
def self.exists?
|
7
|
+
File.exists?(self.get_path)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.read_and_merge_with(main_options)
|
11
|
+
path = self.get_path
|
12
|
+
body = File.read(path)
|
13
|
+
yaml = ERB.new(body)
|
14
|
+
data = YAML.load(yaml.result)
|
15
|
+
|
16
|
+
data['recipes'].map do |recipe|
|
17
|
+
option = Options.from(main_options, recipe)
|
18
|
+
Recipe.new(option)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def self.get_path
|
25
|
+
File.join(Dir.pwd, 'gordon.yml')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
data/lib/gordon/cooker.rb
CHANGED
@@ -2,39 +2,42 @@ require 'fileutils'
|
|
2
2
|
|
3
3
|
module Gordon
|
4
4
|
class Cooker
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :recipes
|
6
6
|
|
7
7
|
FPM_COOKERY_COMMAND = 'fpm-cook'
|
8
8
|
FPM_COOKERY_WORKING_DIR = '/tmp/gordon'
|
9
9
|
|
10
|
-
def initialize(
|
11
|
-
@
|
12
|
-
@options = recipe.options
|
10
|
+
def initialize(recipes)
|
11
|
+
@recipes = recipes
|
13
12
|
end
|
14
13
|
|
15
14
|
def cook
|
16
|
-
|
17
|
-
|
15
|
+
recipes.each do |recipe|
|
16
|
+
options = recipe.options
|
17
|
+
|
18
|
+
clean(options)
|
19
|
+
package(recipe, options)
|
20
|
+
end
|
18
21
|
end
|
19
22
|
|
20
23
|
private
|
21
24
|
|
22
|
-
def clean
|
25
|
+
def clean(options)
|
23
26
|
# fpm-cook clean command only cleans tmp-build and tmp-dest folders
|
24
27
|
# and don't include cache dir :(
|
25
|
-
FileUtils.rm_rf(get_working_path)
|
28
|
+
FileUtils.rm_rf(get_working_path(options))
|
26
29
|
end
|
27
30
|
|
28
|
-
def package
|
29
|
-
cook_args = get_command_args
|
31
|
+
def package(recipe, options)
|
32
|
+
cook_args = get_command_args(options)
|
30
33
|
|
31
34
|
cook_args << "package"
|
32
35
|
cook_args << recipe.application_template_path
|
33
36
|
|
34
|
-
execute(cook_args)
|
37
|
+
execute(cook_args, options)
|
35
38
|
end
|
36
39
|
|
37
|
-
def get_working_path
|
40
|
+
def get_working_path(options)
|
38
41
|
app_path = File.expand_path(options.app_source)
|
39
42
|
app_name = File.basename(app_path)
|
40
43
|
tmp_path = File.join(FPM_COOKERY_WORKING_DIR, app_name)
|
@@ -42,21 +45,21 @@ module Gordon
|
|
42
45
|
tmp_path
|
43
46
|
end
|
44
47
|
|
45
|
-
def get_command_args
|
48
|
+
def get_command_args(options)
|
46
49
|
cook_args = []
|
47
50
|
|
48
51
|
cook_args << "--debug" if options.debug
|
49
52
|
|
50
53
|
cook_args << "--target #{options.package_type}"
|
51
54
|
cook_args << "--pkg-dir #{File.expand_path(options.output_dir)}"
|
52
|
-
cook_args << "--cache-dir #{File.expand_path(get_working_path)}"
|
53
|
-
cook_args << "--tmp-root #{File.expand_path(get_working_path)}"
|
55
|
+
cook_args << "--cache-dir #{File.expand_path(get_working_path(options))}"
|
56
|
+
cook_args << "--tmp-root #{File.expand_path(get_working_path(options))}"
|
54
57
|
cook_args << "--no-deps"
|
55
58
|
|
56
59
|
cook_args
|
57
60
|
end
|
58
61
|
|
59
|
-
def execute(cook_args)
|
62
|
+
def execute(cook_args, options)
|
60
63
|
env_vars = EnvVars.from_cook(options)
|
61
64
|
|
62
65
|
command = "#{env_vars.join " "} #{FPM_COOKERY_COMMAND} #{cook_args.join " "}"
|
@@ -7,9 +7,9 @@ module Gordon
|
|
7
7
|
dependencies = []
|
8
8
|
|
9
9
|
dependencies << get_runtime_package_name(env_vars, platform)
|
10
|
-
dependencies << get_http_server_package_name(env_vars, platform) unless env_vars.http_server_type.empty?
|
11
|
-
dependencies << get_init_package_name(env_vars, platform) unless env_vars.init_type.empty?
|
12
|
-
dependencies << get_web_server_package_name(env_vars, platform) unless env_vars.web_server_type.empty?
|
10
|
+
dependencies << get_http_server_package_name(env_vars, platform) unless env_vars.http_server_type.to_s.empty?
|
11
|
+
dependencies << get_init_package_name(env_vars, platform) unless env_vars.init_type.to_s.empty?
|
12
|
+
dependencies << get_web_server_package_name(env_vars, platform) unless env_vars.web_server_type.to_s.empty?
|
13
13
|
|
14
14
|
dependencies.collect(&:to_s)
|
15
15
|
end
|
@@ -19,7 +19,7 @@ module Gordon
|
|
19
19
|
def get_runtime_package_name(env_vars, platform)
|
20
20
|
runtime_name, runtime_version = env_vars.runtime_name, env_vars.runtime_version
|
21
21
|
|
22
|
-
if runtime_name =~ /
|
22
|
+
if runtime_name =~ /j(dk|re)/
|
23
23
|
package_name = get_java_package_name(runtime_name, runtime_version, platform)
|
24
24
|
else
|
25
25
|
package_name = "#{runtime_name} = #{runtime_version}"
|
@@ -32,26 +32,40 @@ module Gordon
|
|
32
32
|
centos = platform == :centos
|
33
33
|
|
34
34
|
if runtime_name =~ /oracle/ && centos
|
35
|
-
|
36
|
-
package_name = "jre#{runtime_version}"
|
37
|
-
else
|
38
|
-
package_name = "jre = #{runtime_version}"
|
39
|
-
end
|
35
|
+
package_name = get_oracle_package_name(runtime_name, runtime_version)
|
40
36
|
else
|
41
|
-
|
42
|
-
package_name = "java-#{runtime_version[0..4]}-openjdk"
|
43
|
-
else
|
44
|
-
package_name = "openjdk-#{runtime_version[2]}-jre"
|
45
|
-
end
|
37
|
+
package_name = get_osjava_package_name(runtime_name, runtime_version, centos)
|
46
38
|
end
|
47
39
|
|
48
40
|
package_name
|
49
41
|
end
|
50
42
|
|
51
|
-
def
|
43
|
+
def oracle_8_version?(runtime_version)
|
52
44
|
runtime_version[2].to_s == '8'
|
53
45
|
end
|
54
46
|
|
47
|
+
def get_oracle_package_name(runtime_name, runtime_version)
|
48
|
+
package_type = runtime_name =~ /jre/ ? :jre : :jdk
|
49
|
+
|
50
|
+
if oracle_8_version?(runtime_version)
|
51
|
+
package_name = "#{package_type}#{runtime_version}"
|
52
|
+
else
|
53
|
+
package_name = "#{package_type} = #{runtime_version}"
|
54
|
+
end
|
55
|
+
|
56
|
+
package_name
|
57
|
+
end
|
58
|
+
|
59
|
+
def get_osjava_package_name(runtime_name, runtime_version, is_centos)
|
60
|
+
if is_centos
|
61
|
+
package_name = "java-#{runtime_version[0..4]}-openjdk"
|
62
|
+
else
|
63
|
+
package_name = "openjdk-#{runtime_version[2]}-jre"
|
64
|
+
end
|
65
|
+
|
66
|
+
package_name
|
67
|
+
end
|
68
|
+
|
55
69
|
def get_http_server_package_name(env_vars, platform)
|
56
70
|
get_os_package_name(env_vars, :http_server_type, platform)
|
57
71
|
end
|
@@ -6,7 +6,9 @@ module Gordon
|
|
6
6
|
def install_http_server_files(env_vars, blacklist)
|
7
7
|
skeleton_path = get_skeleton_path_from_type(env_vars, env_vars.http_server_type)
|
8
8
|
|
9
|
-
|
9
|
+
app_source_excludes = env_vars.app_source_excludes
|
10
|
+
|
11
|
+
application_files = all_files_except_blacklisted(blacklist, app_source_excludes)
|
10
12
|
|
11
13
|
root(skeleton_path).install application_files
|
12
14
|
end
|
@@ -6,7 +6,9 @@ module Gordon
|
|
6
6
|
def install_standalone_files(env_vars, blacklist)
|
7
7
|
skeleton_path = get_skeleton_path_from_type(env_vars, :misc)
|
8
8
|
|
9
|
-
|
9
|
+
app_source_excludes = env_vars.app_source_excludes
|
10
|
+
|
11
|
+
application_files = all_files_except_blacklisted(blacklist, app_source_excludes)
|
10
12
|
|
11
13
|
root(skeleton_path).install application_files
|
12
14
|
end
|
@@ -6,7 +6,9 @@ module Gordon
|
|
6
6
|
def install_web_server_files(env_vars, blacklist)
|
7
7
|
skeleton_path = get_skeleton_path_from_type(env_vars, env_vars.web_server_type)
|
8
8
|
|
9
|
-
|
9
|
+
app_source_excludes = env_vars.app_source_excludes
|
10
|
+
|
11
|
+
application_files = all_files_except_blacklisted(blacklist, app_source_excludes)
|
10
12
|
|
11
13
|
root(skeleton_path).install application_files
|
12
14
|
end
|
data/lib/gordon/env_vars.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module Gordon
|
2
2
|
class EnvVars
|
3
|
-
attr_accessor :app_type
|
4
|
-
attr_accessor :app_name, :app_description, :app_homepage, :app_version, :app_source
|
3
|
+
attr_accessor :app_name, :app_description, :app_homepage, :app_version, :app_source, :app_source_excludes, :app_type
|
5
4
|
attr_accessor :runtime_name, :runtime_version
|
6
5
|
attr_accessor :http_server_type
|
7
6
|
attr_accessor :web_server_type
|
@@ -9,13 +8,13 @@ module Gordon
|
|
9
8
|
|
10
9
|
def self.from_cook(options)
|
11
10
|
env_vars = []
|
12
|
-
|
13
11
|
env_vars << "GORDON_APP_TYPE='#{options.app_type}'"
|
14
12
|
env_vars << "GORDON_APP_NAME='#{options.app_name}'"
|
15
13
|
env_vars << "GORDON_APP_DESCRIPTION='#{options.app_description}'"
|
16
14
|
env_vars << "GORDON_APP_HOMEPAGE='#{options.app_homepage}'"
|
17
15
|
env_vars << "GORDON_APP_VERSION='#{options.app_version}'"
|
18
16
|
env_vars << "GORDON_APP_SOURCE='#{File.expand_path(options.app_source)}'"
|
17
|
+
env_vars << "GORDON_APP_SOURCE_EXCLUDES='#{options.app_source_excludes.to_a.map { |path| File.expand_path(path)}.join(",") }'"
|
19
18
|
env_vars << "GORDON_RUNTIME_NAME='#{options.runtime_name}'"
|
20
19
|
env_vars << "GORDON_RUNTIME_VERSION='#{options.runtime_version}'"
|
21
20
|
env_vars << "GORDON_HTTP_SERVER_TYPE='#{options.http_server_type}'"
|
@@ -28,17 +27,18 @@ module Gordon
|
|
28
27
|
def self.load
|
29
28
|
env_vars = self.new
|
30
29
|
|
31
|
-
env_vars.app_type
|
32
|
-
env_vars.app_name
|
33
|
-
env_vars.app_description
|
34
|
-
env_vars.app_homepage
|
35
|
-
env_vars.app_version
|
36
|
-
env_vars.app_source
|
37
|
-
env_vars.
|
38
|
-
env_vars.
|
39
|
-
env_vars.
|
40
|
-
env_vars.
|
41
|
-
env_vars.
|
30
|
+
env_vars.app_type = ENV['GORDON_APP_TYPE']
|
31
|
+
env_vars.app_name = ENV['GORDON_APP_NAME']
|
32
|
+
env_vars.app_description = ENV['GORDON_APP_DESCRIPTION']
|
33
|
+
env_vars.app_homepage = ENV['GORDON_APP_HOMEPAGE']
|
34
|
+
env_vars.app_version = ENV['GORDON_APP_VERSION']
|
35
|
+
env_vars.app_source = ENV['GORDON_APP_SOURCE']
|
36
|
+
env_vars.app_source_excludes = ENV['GORDON_APP_SOURCE_EXCLUDES'].to_s.split(",")
|
37
|
+
env_vars.runtime_name = ENV['GORDON_RUNTIME_NAME']
|
38
|
+
env_vars.runtime_version = ENV['GORDON_RUNTIME_VERSION']
|
39
|
+
env_vars.http_server_type = ENV['GORDON_HTTP_SERVER_TYPE']
|
40
|
+
env_vars.web_server_type = ENV['GORDON_WEB_SERVER_TYPE']
|
41
|
+
env_vars.init_type = ENV['GORDON_INIT_TYPE']
|
42
42
|
|
43
43
|
env_vars
|
44
44
|
end
|
data/lib/gordon/options.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module Gordon
|
2
2
|
class Options
|
3
|
-
attr_accessor :app_name, :app_description, :app_homepage, :app_version, :app_source
|
4
|
-
attr_accessor :app_type
|
3
|
+
attr_accessor :app_name, :app_description, :app_homepage, :app_version, :app_source, :app_source_excludes, :app_type
|
5
4
|
attr_accessor :runtime_name, :runtime_version
|
6
5
|
attr_accessor :http_server_type
|
7
6
|
attr_accessor :web_server_type
|
@@ -9,5 +8,32 @@ module Gordon
|
|
9
8
|
attr_accessor :package_type
|
10
9
|
attr_accessor :output_dir
|
11
10
|
attr_accessor :debug, :trace
|
11
|
+
|
12
|
+
def self.from(main_options, recipe)
|
13
|
+
self.new.tap do |opt|
|
14
|
+
opt.app_type = main_options.app_type || recipe['app_type']
|
15
|
+
opt.app_name = main_options.app_name || recipe['app_name']
|
16
|
+
opt.app_description = main_options.app_description || recipe['app_description']
|
17
|
+
opt.app_homepage = main_options.app_homepage || recipe['app_homepage']
|
18
|
+
opt.app_version = main_options.app_version || recipe['app_version']
|
19
|
+
opt.app_source = recipe['app_source'] || main_options.app_source
|
20
|
+
|
21
|
+
opt.app_source_excludes = (main_options.app_source_excludes.to_a + recipe['app_source_excludes'].to_a).flatten
|
22
|
+
|
23
|
+
opt.runtime_name = main_options.runtime_name || recipe['runtime_name']
|
24
|
+
opt.runtime_version = main_options.runtime_version || recipe['runtime_version']
|
25
|
+
|
26
|
+
opt.http_server_type = main_options.http_server_type || recipe['http_server_type']
|
27
|
+
opt.web_server_type = main_options.web_server_type || recipe['web_server_type']
|
28
|
+
opt.init_type = main_options.init_type || recipe['init_type']
|
29
|
+
|
30
|
+
opt.package_type = main_options.package_type || recipe['package_type']
|
31
|
+
opt.output_dir = main_options.output_dir || recipe['output_dir']
|
32
|
+
|
33
|
+
opt.debug = !main_options.debug.nil? ? main_options.debug : recipe['debug']
|
34
|
+
opt.trace = !main_options.trace.nil? ? main_options.trace : recipe['trace']
|
35
|
+
end
|
36
|
+
end
|
12
37
|
end
|
13
38
|
end
|
39
|
+
|
data/lib/gordon/version.rb
CHANGED
data/lib/gordon.rb
CHANGED
@@ -1,10 +1,56 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Gordon::Application::Factory do
|
4
|
-
let(:options) { instance_double
|
4
|
+
let(:options) { instance_double(Gordon::Options) }
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
shared_examples_for 'a instance of specified runtime and type' do |expected_class|
|
7
|
+
it 'returns a instance of specified runtime and type' do
|
8
|
+
expect(described_class.create(options)).to be_instance_of(expected_class)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe 'ruby' do
|
13
|
+
before :each do
|
14
|
+
allow(options).to receive(:runtime_name).and_return(:ruby)
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'web' do
|
18
|
+
before :each do
|
19
|
+
allow(options).to receive(:app_type).and_return(:web)
|
20
|
+
end
|
21
|
+
|
22
|
+
it_behaves_like 'a instance of specified runtime and type', Gordon::Application::Types::RubyWebApp
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'standalone' do
|
26
|
+
before :each do
|
27
|
+
allow(options).to receive(:app_type).and_return(:standalone)
|
28
|
+
end
|
29
|
+
|
30
|
+
it_behaves_like 'a instance of specified runtime and type', Gordon::Application::Types::RubyStandaloneApp
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe 'java' do
|
35
|
+
before :each do
|
36
|
+
allow(options).to receive(:runtime_name).and_return('oracle-jdk')
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'web' do
|
40
|
+
before :each do
|
41
|
+
allow(options).to receive(:app_type).and_return(:web)
|
42
|
+
end
|
43
|
+
|
44
|
+
it_behaves_like 'a instance of specified runtime and type', Gordon::Application::Types::JavaWebApp
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'standalone' do
|
48
|
+
before :each do
|
49
|
+
allow(options).to receive(:app_type).and_return(:standalone)
|
50
|
+
end
|
51
|
+
|
52
|
+
it_behaves_like 'a instance of specified runtime and type', Gordon::Application::Types::JavaStandaloneApp
|
53
|
+
end
|
8
54
|
end
|
9
55
|
end
|
10
56
|
|