gordon 0.0.21 → 0.1.0
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 +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
|
|