ruby_yacht 0.5.0 → 0.6.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/.gitignore +3 -1
- data/.rdoc_options +8 -2
- data/.rspec +1 -0
- data/.travis.yml +17 -1
- data/Gemfile.lock +18 -2
- data/README.md +28 -10
- data/bin/ruby_yacht +5 -0
- data/doc/TODO.md +1 -20
- data/doc/configuration.md +104 -21
- data/doc/configuration_sample.rb +19 -8
- data/doc/contributing.md +28 -5
- data/doc/plugins.md +105 -45
- data/lib/ruby_yacht/dsl/app.rb +14 -18
- data/lib/ruby_yacht/dsl/configuration.rb +51 -32
- data/lib/ruby_yacht/dsl/database.rb +24 -8
- data/lib/ruby_yacht/dsl/dsl.rb +32 -4
- data/lib/ruby_yacht/dsl/hook.rb +182 -48
- data/lib/ruby_yacht/dsl/project.rb +20 -14
- data/lib/ruby_yacht/dsl/server_type.rb +14 -31
- data/lib/ruby_yacht/dsl/web_server.rb +87 -0
- data/lib/ruby_yacht/dsl.rb +1 -0
- data/lib/ruby_yacht/images/app/Dockerfile.erb +17 -6
- data/lib/ruby_yacht/images/app/before_startup.bash.erb +5 -3
- data/lib/ruby_yacht/images/app/startup.bash.erb +5 -2
- data/lib/ruby_yacht/images/app-dependencies/Dockerfile.erb +7 -11
- data/lib/ruby_yacht/images/database/Dockerfile.erb +7 -18
- data/lib/ruby_yacht/images/database/startup.bash.erb +1 -1
- data/lib/ruby_yacht/images/web/Dockerfile.erb +25 -19
- data/lib/ruby_yacht/plugins/mysql.rb +18 -8
- data/lib/ruby_yacht/{images/web → plugins/nginx/scripts}/add_app.rb +5 -5
- data/lib/ruby_yacht/{images/web → plugins/nginx/scripts}/add_project.rb +3 -3
- data/lib/ruby_yacht/plugins/nginx.rb +28 -0
- data/lib/ruby_yacht/plugins/rails/scripts/build_new_app.rb +10 -0
- data/lib/ruby_yacht/plugins/rails/scripts/update_rails_config.rb +6 -1
- data/lib/ruby_yacht/plugins/rails.rb +34 -19
- data/lib/ruby_yacht/plugins.rb +2 -1
- data/lib/ruby_yacht/runner/build_images.rb +87 -73
- data/lib/ruby_yacht/runner/checkout.rb +1 -1
- data/lib/ruby_yacht/runner/command.rb +13 -1
- data/lib/ruby_yacht/runner/create_new_project.rb +91 -0
- data/lib/ruby_yacht/runner/help.rb +1 -1
- data/lib/ruby_yacht/runner/run_containers.rb +17 -21
- data/lib/ruby_yacht/runner/runner.rb +27 -2
- data/lib/ruby_yacht/runner/services.rb +15 -10
- data/lib/ruby_yacht/runner/shell.rb +1 -1
- data/lib/ruby_yacht/runner/update_hosts.rb +16 -11
- data/lib/ruby_yacht/runner.rb +1 -0
- data/log/.gitkeep +0 -0
- data/ruby_yacht.gemspec +4 -2
- data/spec/docker/Dockerfile +19 -3
- data/spec/docker/install_gems.bash +5 -0
- data/spec/docker/run.bash +44 -0
- data/spec/docker/startup.bash +10 -0
- data/spec/dsl/app_spec.rb +66 -38
- data/spec/dsl/configuration_spec.rb +236 -30
- data/spec/dsl/database_spec.rb +103 -4
- data/spec/dsl/dsl_spec.rb +46 -3
- data/spec/dsl/hook_spec.rb +278 -57
- data/spec/dsl/project_spec.rb +75 -45
- data/spec/dsl/server_type_spec.rb +52 -12
- data/spec/dsl/web_server_spec.rb +160 -0
- data/spec/fixtures/apollo-new-project-config +20 -0
- data/spec/fixtures/app-dependencies-dockerfile-generic +4 -7
- data/spec/fixtures/app-dependencies-dockerfile-generic-with-library-install +6 -10
- data/spec/fixtures/app-dependencies-dockerfile-rails +9 -11
- data/spec/fixtures/app-dependencies-dockerfile-with-no-repository +20 -0
- data/spec/fixtures/database-dockerfile +1 -1
- data/spec/fixtures/database-dockerfile-mysql +3 -3
- data/spec/fixtures/database-dockerfile-rails +5 -4
- data/spec/fixtures/database-dockerfile-rails-with-no-repository +27 -0
- data/spec/fixtures/database-dockerfile-with-seed-hooks +3 -3
- data/spec/fixtures/database-startup-mysql +2 -1
- data/spec/fixtures/mars-before-startup +2 -2
- data/spec/fixtures/mars-before-startup-rails +5 -4
- data/spec/fixtures/mars-before-startup-with-before-startup-hooks +5 -4
- data/spec/fixtures/mars-before-startup-with-custom-file-copy +3 -3
- data/spec/fixtures/mars-before-startup-with-no-repository +3 -0
- data/spec/fixtures/mars-dockerfile +3 -2
- data/spec/fixtures/mars-dockerfile-rails +6 -5
- data/spec/fixtures/mars-dockerfile-rails-with-no-repository +32 -0
- data/spec/fixtures/mars-dockerfile-with-after-checkout-hooks +5 -4
- data/spec/fixtures/mars-dockerfile-with-before-startup-hooks +5 -4
- data/spec/fixtures/mars-dockerfile-with-custom-file-copy +4 -3
- data/spec/fixtures/mars-dockerfile-with-local-database +4 -2
- data/spec/fixtures/mars-dockerfile-with-no-repository +22 -0
- data/spec/fixtures/mars-dockerfile-with-remote-database +4 -2
- data/spec/fixtures/mars-startup +2 -2
- data/spec/fixtures/mars-startup-rails +2 -2
- data/spec/fixtures/mars-startup-rails-with-no-repository +5 -0
- data/spec/fixtures/mars-startup-with-no-repository +4 -0
- data/spec/fixtures/web-dockerfile +18 -11
- data/spec/fixtures/web-dockerfile-jupiter +28 -0
- data/spec/fixtures/web-dockerfile-nginx +38 -0
- data/spec/fixtures/web-dockerfile-with-eponymous-app +16 -10
- data/spec/fixtures/web-dockerfile-with-primary-app +16 -10
- data/spec/integration/build_images_spec.rb +210 -0
- data/spec/integration/build_spec.rb +23 -0
- data/spec/integration/checkout_spec.rb +94 -0
- data/spec/integration/create_new_project_spec.rb +50 -0
- data/spec/integration/implode_spec.rb +20 -0
- data/spec/integration/run.rb +93 -0
- data/spec/integration/run_containers_spec.rb +279 -0
- data/spec/integration/services_spec.rb +99 -0
- data/spec/integration/shell_spec.rb +31 -0
- data/spec/integration/update_hosts_spec.rb +35 -0
- data/spec/plugins/mysql_spec.rb +18 -1
- data/spec/plugins/nginx_spec.rb +66 -0
- data/spec/plugins/rails_spec.rb +61 -89
- data/spec/runner/build_images_spec.rb +111 -58
- data/spec/runner/command_spec.rb +55 -3
- data/spec/runner/create_new_project_spec.rb +93 -0
- data/spec/runner/help_spec.rb +5 -1
- data/spec/runner/run_containers_spec.rb +22 -10
- data/spec/runner/runner_spec.rb +31 -4
- data/spec/runner/services_spec.rb +32 -4
- data/spec/runner/update_hosts_spec.rb +2 -1
- data/spec/spec_helper.rb +16 -1
- data/spec/support/integration_helpers.rb +76 -0
- data/spec/support/test_project.rb +15 -3
- metadata +97 -14
- data/spec/docker/build.bash +0 -10
- data/spec/fixtures/deploy-dockerfile +0 -2
- data/spec/fixtures/multi-project-web-dockerfile +0 -25
- /data/lib/ruby_yacht/{images/web → plugins/nginx/scripts}/app_config.erb +0 -0
- /data/lib/ruby_yacht/{images/web → plugins/nginx/scripts}/index.html.erb +0 -0
- /data/lib/ruby_yacht/{images/web → plugins/nginx/scripts}/index_config.erb +0 -0
data/lib/ruby_yacht/dsl/hook.rb
CHANGED
|
@@ -16,20 +16,20 @@ module RubyYacht
|
|
|
16
16
|
# The type of event that this hook is attached to.
|
|
17
17
|
attr_accessor :event_type
|
|
18
18
|
|
|
19
|
-
# The type of server that this hook applies to.
|
|
20
|
-
attr_accessor :
|
|
19
|
+
# The type of app server that this hook applies to.
|
|
20
|
+
attr_accessor :app_server_type
|
|
21
21
|
|
|
22
|
-
# The
|
|
23
|
-
attr_accessor :
|
|
22
|
+
# The type of database server that this hook applies to.
|
|
23
|
+
attr_accessor :database_server_type
|
|
24
24
|
|
|
25
|
-
# The
|
|
26
|
-
attr_accessor :
|
|
25
|
+
# The type of web server that this hook applies to.
|
|
26
|
+
attr_accessor :web_server_type
|
|
27
27
|
|
|
28
|
-
# The
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
# The type of container that this hook applies to.
|
|
29
|
+
attr_accessor :container_type
|
|
30
|
+
|
|
31
|
+
# The behaviors that we will run for this hook.
|
|
32
|
+
attr_accessor :behaviors
|
|
33
33
|
|
|
34
34
|
# This class provides a DSL for configuring hooks.
|
|
35
35
|
class DSL
|
|
@@ -46,59 +46,99 @@ module RubyYacht
|
|
|
46
46
|
def initialize(event_time, event_type)
|
|
47
47
|
@event_time = event_time
|
|
48
48
|
@event_type = event_type
|
|
49
|
+
@behaviors = []
|
|
49
50
|
load_custom_attributes
|
|
50
51
|
end
|
|
51
52
|
|
|
52
53
|
##
|
|
53
|
-
# :method:
|
|
54
|
+
# :method: app_server_type
|
|
54
55
|
#
|
|
55
|
-
# You can call `
|
|
56
|
-
# rails apps.
|
|
57
|
-
add_attribute :
|
|
56
|
+
# You can call `app_server_type :rails` to signify that this hook applies
|
|
57
|
+
# to rails apps.
|
|
58
|
+
add_attribute :app_server_type, :all
|
|
58
59
|
|
|
59
60
|
##
|
|
60
|
-
# :method:
|
|
61
|
+
# :method: database_server_type
|
|
61
62
|
#
|
|
62
|
-
# You can call `
|
|
63
|
-
#
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
# You can call `database_server_type :mysql` to signify that this hook
|
|
64
|
+
# applies to MySQL databases.
|
|
65
|
+
add_attribute :database_server_type, :all
|
|
66
|
+
|
|
67
67
|
##
|
|
68
|
-
# :method:
|
|
69
|
-
#
|
|
70
|
-
# You can call `copy_file 'foo.txt'` to signify that this hook should
|
|
71
|
-
# copy a file called `foo.txt` from the hook's script folder to
|
|
72
|
-
# `/var/docker`.
|
|
68
|
+
# :method: web_server_type
|
|
73
69
|
#
|
|
74
|
-
# You can
|
|
75
|
-
#
|
|
76
|
-
|
|
77
|
-
|
|
70
|
+
# You can call `web_server_type :nginx` to signify that this hook
|
|
71
|
+
# applies to nginx web servers.
|
|
72
|
+
add_attribute :web_server_type, :all
|
|
73
|
+
|
|
74
|
+
##
|
|
75
|
+
# :method: container_type
|
|
78
76
|
#
|
|
79
|
-
#
|
|
80
|
-
#
|
|
81
|
-
add_attribute :
|
|
77
|
+
# You can call `container_type :app` to signify that this hook applies to
|
|
78
|
+
# app images.
|
|
79
|
+
add_attribute :container_type
|
|
82
80
|
|
|
83
81
|
##
|
|
84
82
|
# :method: script_folder
|
|
85
83
|
#
|
|
86
84
|
# You can call `script_folder './scripts'` to signify that the scripts for
|
|
87
85
|
# this hook are found in the `./scripts` folder.
|
|
88
|
-
add_attribute :script_folder,
|
|
86
|
+
add_attribute :script_folder, '.'
|
|
89
87
|
|
|
90
|
-
# This method
|
|
91
|
-
#
|
|
88
|
+
# This method adds a behavior to run a command when the hook is run.
|
|
89
|
+
#
|
|
90
|
+
# ### Parameters
|
|
91
|
+
#
|
|
92
|
+
# * **cmd: String** The command to run.
|
|
93
|
+
def command(cmd)
|
|
94
|
+
@behaviors << CommandBehavior.new(cmd)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# This method adds a behavior to copy a file to the image when the hook is
|
|
98
|
+
# run.
|
|
99
|
+
#
|
|
100
|
+
# ### Parameters
|
|
101
|
+
#
|
|
102
|
+
# * **path: String** The path to the file, relative to the
|
|
103
|
+
# `script_folder`.
|
|
104
|
+
def copy_file(path)
|
|
105
|
+
@behaviors << CopyFileBehavior.new("#{@script_folder}/#{path}")
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# This method adds a behavior to run a script.
|
|
92
109
|
#
|
|
93
110
|
# The script will be understood to be in the script folder that was given
|
|
94
111
|
# when the DSL was created.
|
|
95
112
|
#
|
|
96
113
|
# ### Parameters
|
|
97
114
|
#
|
|
98
|
-
# * **
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
115
|
+
# * **interpreter: Symbol** The interpreter that should process the
|
|
116
|
+
# script. e.g. ruby or bash
|
|
117
|
+
# * **name: String** The filename of the script.
|
|
118
|
+
def run_script(interpreter, name)
|
|
119
|
+
copy_file name
|
|
120
|
+
destination = "/var/docker/#{name}"
|
|
121
|
+
command "#{interpreter} #{destination}"
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# This method adds a behavior to set an environment variable.
|
|
125
|
+
#
|
|
126
|
+
# The variable's value can be defined literally, by passing a value as the
|
|
127
|
+
# second parameter to this method, or at build-time, by passing a block.
|
|
128
|
+
#
|
|
129
|
+
# ### Parameters
|
|
130
|
+
#
|
|
131
|
+
# * **name: String** The name of the environment variable.
|
|
132
|
+
# * **value: String** A literal value to set for the environment
|
|
133
|
+
# variable.
|
|
134
|
+
# * **block: Proc** A block for providing the environment variable.
|
|
135
|
+
def set_environment_variable(name, value=nil, &block)
|
|
136
|
+
if value
|
|
137
|
+
value_proc = Proc.new { value }
|
|
138
|
+
else
|
|
139
|
+
value_proc = block
|
|
140
|
+
end
|
|
141
|
+
@behaviors << EnvironmentVariableBehavior.new(name, value_proc)
|
|
102
142
|
end
|
|
103
143
|
|
|
104
144
|
# This method checks that all of the required attributes have been set on
|
|
@@ -109,18 +149,112 @@ module RubyYacht
|
|
|
109
149
|
# This will also check that the app type is valid.
|
|
110
150
|
def check_required_attributes
|
|
111
151
|
super
|
|
112
|
-
|
|
113
|
-
|
|
152
|
+
if @app_server_type != :all
|
|
153
|
+
check_server_type @app_server_type, :app
|
|
154
|
+
end
|
|
155
|
+
if @database_server_type != :all
|
|
156
|
+
check_server_type @database_server_type, :database
|
|
157
|
+
end
|
|
158
|
+
if @web_server_type != :all
|
|
159
|
+
check_server_type @web_server_type, :web
|
|
114
160
|
end
|
|
115
161
|
end
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
162
|
+
|
|
163
|
+
creates_object RubyYacht::Hook, %w(event_time event_type app_server_type
|
|
164
|
+
database_server_type web_server_type container_type behaviors)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# This class is the base class for behaviors in hooks.
|
|
168
|
+
class Behavior
|
|
169
|
+
# The command that should be run in a Dockerfile for this behavior.
|
|
170
|
+
def dockerfile_command
|
|
171
|
+
''
|
|
121
172
|
end
|
|
122
173
|
|
|
123
|
-
|
|
174
|
+
# The command that should be run in a shell script for this behavior.
|
|
175
|
+
def shell_command
|
|
176
|
+
''
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# This context in which the command is being generated.
|
|
180
|
+
attr_accessor :context
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# This class provides a behavior for running a command in the image.
|
|
184
|
+
class CommandBehavior < Behavior
|
|
185
|
+
# This initializer creates the behavior.
|
|
186
|
+
#
|
|
187
|
+
# ### Parameters
|
|
188
|
+
#
|
|
189
|
+
# * **command: String** The command to run.
|
|
190
|
+
def initialize(command)
|
|
191
|
+
@command = command
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# The command that should be run in a Dockerfile for this behavior.
|
|
195
|
+
def dockerfile_command
|
|
196
|
+
"RUN #{@command}"
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
# The command that should be run in a shell script for this behavior.
|
|
200
|
+
def shell_command
|
|
201
|
+
@command
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# This class provides a behavior for copying a file from the host machine
|
|
206
|
+
# to the image.
|
|
207
|
+
class CopyFileBehavior < Behavior
|
|
208
|
+
# This initialize creates the behavior.
|
|
209
|
+
#
|
|
210
|
+
# ### Parameters
|
|
211
|
+
#
|
|
212
|
+
# * **file_path: String** The path to the file, relative to the root of
|
|
213
|
+
# the project.
|
|
214
|
+
def initialize(file_path)
|
|
215
|
+
@file_path = file_path
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# The command that should be run in a Dockerfile for this behavior.
|
|
219
|
+
def dockerfile_command
|
|
220
|
+
"COPY #{File.basename(file_path)} /var/docker/"
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
# :method: file_path
|
|
224
|
+
# The path to the file that this behavior copies.
|
|
225
|
+
attr_reader :file_path
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
# This class provides a behavior for setting an environment variable in the
|
|
229
|
+
# image.
|
|
230
|
+
class EnvironmentVariableBehavior < Behavior
|
|
231
|
+
# This initializer creates the behavior.
|
|
232
|
+
#
|
|
233
|
+
# ### Parameters
|
|
234
|
+
#
|
|
235
|
+
# * **name: String** The name of the environment variable to create.
|
|
236
|
+
# * **proc: Proc** The proc for generating the value for the
|
|
237
|
+
# environment variable.
|
|
238
|
+
def initialize(name, proc)
|
|
239
|
+
@name = name
|
|
240
|
+
@proc = proc
|
|
241
|
+
@context = self
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
# The value for the environment variable.
|
|
245
|
+
def value
|
|
246
|
+
context.instance_eval(&@proc)
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
# The command that should be run in a Dockerfile for this behavior.
|
|
250
|
+
def dockerfile_command
|
|
251
|
+
"ENV #{@name} #{value}"
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
# The command that should be run in a shell script for this behavior.
|
|
255
|
+
def shell_command
|
|
256
|
+
"export #{@name}=\"#{value}\""
|
|
257
|
+
end
|
|
124
258
|
end
|
|
125
259
|
end
|
|
126
260
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require_relative 'dns_server'
|
|
2
2
|
require_relative 'app'
|
|
3
3
|
require_relative 'database'
|
|
4
|
+
require_relative 'web_server'
|
|
4
5
|
|
|
5
6
|
module RubyYacht
|
|
6
7
|
# This class provides a configuration for a project in our system.
|
|
@@ -17,9 +18,6 @@ module RubyYacht
|
|
|
17
18
|
# project.
|
|
18
19
|
attr_accessor :system_prefix
|
|
19
20
|
|
|
20
|
-
# The domain that the apps for this project are accessed under.
|
|
21
|
-
attr_accessor :domain
|
|
22
|
-
|
|
23
21
|
# The hostname for the repository that contains the code for the apps.
|
|
24
22
|
attr_accessor :repository
|
|
25
23
|
|
|
@@ -32,6 +30,10 @@ module RubyYacht
|
|
|
32
30
|
|
|
33
31
|
# The configuration for the apps. Each entry is a RubyYacht::App.
|
|
34
32
|
attr_accessor :apps
|
|
33
|
+
|
|
34
|
+
# The configuration for the web servers. Each entry is a
|
|
35
|
+
# RubyYacht::WebServer.
|
|
36
|
+
attr_accessor :web_servers
|
|
35
37
|
|
|
36
38
|
# The configuration for the DNS for the apps. This is a
|
|
37
39
|
# RubyYacht::DnsServer.
|
|
@@ -73,12 +75,6 @@ module RubyYacht
|
|
|
73
75
|
# system_prefix` to `my-apps`
|
|
74
76
|
add_attribute :system_prefix
|
|
75
77
|
|
|
76
|
-
##
|
|
77
|
-
# :method: domain
|
|
78
|
-
# You can call `domain 'test.com'` to set the project's `domain` to
|
|
79
|
-
# test.com
|
|
80
|
-
add_attribute :domain
|
|
81
|
-
|
|
82
78
|
##
|
|
83
79
|
# :method: repository
|
|
84
80
|
# You can call `repository 'github.com'` to set the project's `repository`
|
|
@@ -114,6 +110,14 @@ module RubyYacht
|
|
|
114
110
|
# call methods in RubyYacht::Database::DSL
|
|
115
111
|
add_object_list :database, RubyYacht::Database::DSL
|
|
116
112
|
|
|
113
|
+
##
|
|
114
|
+
# :method: web_server
|
|
115
|
+
#
|
|
116
|
+
# You can call `web_server` to configure a web server for the project.
|
|
117
|
+
# This takes a block for configuring the server, which allows you to
|
|
118
|
+
# call methods in RubyYacht::WebServer::DSL
|
|
119
|
+
add_object_list :web_server, RubyYacht::WebServer::DSL
|
|
120
|
+
|
|
117
121
|
##
|
|
118
122
|
# :method: dns_server
|
|
119
123
|
#
|
|
@@ -133,14 +137,16 @@ module RubyYacht
|
|
|
133
137
|
# method on the DSL that builds an app with the type `foo`.
|
|
134
138
|
def load_app_initializers
|
|
135
139
|
RubyYacht.configuration.server_types.each do |server_type|
|
|
136
|
-
|
|
137
|
-
|
|
140
|
+
main_method = server_type.container_type.to_s
|
|
141
|
+
main_method += "_server" if server_type.container_type == :web
|
|
142
|
+
method_name = "#{server_type.name}_#{main_method}"
|
|
143
|
+
define_singleton_method method_name do |*args, &block|
|
|
138
144
|
self.public_send(
|
|
139
|
-
|
|
140
|
-
name,
|
|
145
|
+
main_method,
|
|
141
146
|
server_type.name,
|
|
147
|
+
*args,
|
|
142
148
|
&block
|
|
143
|
-
)
|
|
149
|
+
)
|
|
144
150
|
end
|
|
145
151
|
end
|
|
146
152
|
end
|
|
@@ -40,23 +40,16 @@ module RubyYacht
|
|
|
40
40
|
# it will be called `rails_environment` on the server's DSL. This prevents
|
|
41
41
|
# conflicts with attributes from other plugins.
|
|
42
42
|
attr_accessor :server_attributes
|
|
43
|
+
|
|
44
|
+
# The default values for the servers with this server type.
|
|
45
|
+
#
|
|
46
|
+
# Each entry will be a hash where the keys are the names of attributes, and
|
|
47
|
+
# the values are the default values.
|
|
48
|
+
attr_accessor :server_defaults
|
|
43
49
|
|
|
44
50
|
# The docker image that we use as the source for the server images.
|
|
45
51
|
attr_accessor :baseline_image
|
|
46
52
|
|
|
47
|
-
# The custom environment variables that we set in the images for this server
|
|
48
|
-
# type.
|
|
49
|
-
#
|
|
50
|
-
# Each entry will be a hash with the following keys:
|
|
51
|
-
#
|
|
52
|
-
# * **name: String** The name of the environment variable
|
|
53
|
-
# * **image: String** The type of image that this is set in (e.g. server
|
|
54
|
-
# or database).
|
|
55
|
-
# * **block** A block that will be called inside the Dockerfile
|
|
56
|
-
# ERB for providing the value of the environment
|
|
57
|
-
# variable.
|
|
58
|
-
attr_accessor :environment_variables
|
|
59
|
-
|
|
60
53
|
# This class provides a DSL for configuring a RubyYacht::ServerType.
|
|
61
54
|
class DSL
|
|
62
55
|
include RubyYacht::DSL::Base
|
|
@@ -69,7 +62,6 @@ module RubyYacht
|
|
|
69
62
|
# * **name: Symbol** The name of the server type.
|
|
70
63
|
def initialize(name)
|
|
71
64
|
@name = name
|
|
72
|
-
@environment_variables = []
|
|
73
65
|
load_custom_attributes
|
|
74
66
|
end
|
|
75
67
|
|
|
@@ -96,27 +88,18 @@ module RubyYacht
|
|
|
96
88
|
#
|
|
97
89
|
# :method: server_attribute
|
|
98
90
|
# You can call `server_attribute name: :environment, default: 'staging'`
|
|
99
|
-
# to add an attribute to the
|
|
91
|
+
# to add an attribute to the server DSL.
|
|
100
92
|
add_list :server_attribute
|
|
101
93
|
|
|
94
|
+
#
|
|
95
|
+
# :method: server_default
|
|
96
|
+
# You can call `server_default port: 3306` to specify that the servers
|
|
97
|
+
# should have a default value of 3306 for the `port` attribute.
|
|
98
|
+
add_list :server_default
|
|
99
|
+
|
|
102
100
|
creates_object RubyYacht::ServerType, [:name, :baseline_image,
|
|
103
101
|
:container_type, :project_attributes, :server_attributes,
|
|
104
|
-
:
|
|
105
|
-
|
|
106
|
-
# This method defines a new environment variable set for this app type.
|
|
107
|
-
#
|
|
108
|
-
# ### Parameters
|
|
109
|
-
#
|
|
110
|
-
# * **image: Symbol** The type of image this environment variable is set
|
|
111
|
-
# for.
|
|
112
|
-
# * **name: String** The name of the environment variable.
|
|
113
|
-
# * **block** A block for generating the environment variable.
|
|
114
|
-
# This will have access to the project (as @project)
|
|
115
|
-
# and the server (as @server) that we are building
|
|
116
|
-
# the image for.
|
|
117
|
-
def environment_variable(image, name, &block)
|
|
118
|
-
@environment_variables << {image: image, name: name, block: block}
|
|
119
|
-
end
|
|
102
|
+
:server_defaults]
|
|
120
103
|
end
|
|
121
104
|
end
|
|
122
105
|
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
module RubyYacht
|
|
2
|
+
# This class models a web server that's part of the local system.
|
|
3
|
+
#
|
|
4
|
+
# See RubyYacht::WebServer::DSL for information on configuring the server.
|
|
5
|
+
class WebServer
|
|
6
|
+
# The name of the server
|
|
7
|
+
attr_accessor :name
|
|
8
|
+
|
|
9
|
+
# The domain that this web server listens on.
|
|
10
|
+
attr_accessor :domain
|
|
11
|
+
|
|
12
|
+
# The port that this web server listens on.
|
|
13
|
+
attr_accessor :port
|
|
14
|
+
|
|
15
|
+
# The name of the web server plugin for this server.
|
|
16
|
+
attr_accessor :server_type
|
|
17
|
+
|
|
18
|
+
# The project that includes this web server.
|
|
19
|
+
def project
|
|
20
|
+
RubyYacht.configuration.projects.find { |project| project.web_servers.include?(self) }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# This method gets the name of the image / container that this server will
|
|
24
|
+
# run in.
|
|
25
|
+
def container_name
|
|
26
|
+
project = self.project
|
|
27
|
+
return "#{project.system_prefix}-#{self.name}"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# This class provide's the DSL for configuring a web server.
|
|
31
|
+
#
|
|
32
|
+
# Inside of the project configuration, you can call `web_server [name]` to
|
|
33
|
+
# add a web server, and then pass it a block to configure the server, which
|
|
34
|
+
# will allow you to call these DSL methods.
|
|
35
|
+
#
|
|
36
|
+
# You can also call `web_server` with no argument, which will give it the
|
|
37
|
+
# name `web`.
|
|
38
|
+
class DSL
|
|
39
|
+
include RubyYacht::DSL::Base
|
|
40
|
+
extend RubyYacht::DSL::Base::ClassMethods
|
|
41
|
+
|
|
42
|
+
# This initializer starts the DSL for the server.
|
|
43
|
+
#
|
|
44
|
+
# ### Parameters
|
|
45
|
+
#
|
|
46
|
+
# * **server_type: Symbol** The type of server this is.
|
|
47
|
+
# * **name: String** The name of the server.
|
|
48
|
+
def initialize(server_type, name=:web)
|
|
49
|
+
@server_type = server_type
|
|
50
|
+
@name = name.to_sym
|
|
51
|
+
load_custom_attributes
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
add_attribute :name
|
|
55
|
+
|
|
56
|
+
##
|
|
57
|
+
# :method: domain
|
|
58
|
+
# You can call `domain 'test.com'` to tell the web server to create
|
|
59
|
+
# subdomains under test.com.
|
|
60
|
+
add_attribute :domain
|
|
61
|
+
|
|
62
|
+
##
|
|
63
|
+
# :method: server_type
|
|
64
|
+
# You can call `server_type :foo` to set the app's `server_type`.
|
|
65
|
+
add_attribute :server_type
|
|
66
|
+
|
|
67
|
+
##
|
|
68
|
+
# :method: port
|
|
69
|
+
# You can call `port 8080` to set the server's `port`. It defaults to 80.
|
|
70
|
+
add_attribute :port, 80
|
|
71
|
+
|
|
72
|
+
creates_object WebServer
|
|
73
|
+
|
|
74
|
+
# This method checks that all of the required attributes have been set on
|
|
75
|
+
# the object.
|
|
76
|
+
#
|
|
77
|
+
# If they haven't, this will raise an exception.
|
|
78
|
+
#
|
|
79
|
+
# It also checks that the server type has been defined in the
|
|
80
|
+
# configuration.
|
|
81
|
+
def check_required_attributes
|
|
82
|
+
super
|
|
83
|
+
check_server_type @server_type, :web
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
data/lib/ruby_yacht/dsl.rb
CHANGED
|
@@ -3,6 +3,7 @@ require 'ruby_yacht/dsl/configuration'
|
|
|
3
3
|
require 'ruby_yacht/dsl/project'
|
|
4
4
|
require 'ruby_yacht/dsl/app'
|
|
5
5
|
require 'ruby_yacht/dsl/database'
|
|
6
|
+
require 'ruby_yacht/dsl/web_server'
|
|
6
7
|
require 'ruby_yacht/dsl/dns_server'
|
|
7
8
|
require 'ruby_yacht/dsl/hook'
|
|
8
9
|
require 'ruby_yacht/dsl/server_type'
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
FROM <%= @project.system_prefix %>-<%= @app.server_type %>-app-dependencies
|
|
2
2
|
|
|
3
|
-
<% database = @app.database
|
|
3
|
+
<% database = @app.database %>
|
|
4
4
|
<% if database %>
|
|
5
|
-
ENV DATABASE_HOST <%= database.local? ? database.container_name
|
|
5
|
+
ENV DATABASE_HOST <%= database.local? ? database.container_name : database.host %>
|
|
6
6
|
ENV DATABASE_NAME <%= database.name %>
|
|
7
7
|
ENV DATABASE_PASSWORD <%= database.password %>
|
|
8
8
|
ENV DATABASE_USERNAME <%= database.username %>
|
|
9
9
|
ENV DATABASE_TYPE <%= database.server_type %>
|
|
10
|
+
ENV DATABASE_PORT <%= database.port %>
|
|
10
11
|
<% end %>
|
|
11
12
|
ENV APP_PORT <%= @app.port %>
|
|
12
13
|
ENV REPOSITORY_HOST <%= @project.repository %>
|
|
13
|
-
ENV REPOSITORY_NAME <%= @app.repository_name %>
|
|
14
14
|
ENV SYSTEM_PREFIX <%= @project.system_prefix %>
|
|
15
|
-
|
|
15
|
+
<% if @app.repository_name %>
|
|
16
|
+
ENV REPOSITORY_NAME <%= @app.repository_name %>
|
|
17
|
+
<% end %>
|
|
16
18
|
|
|
17
19
|
RUN rm -r /var/code
|
|
18
20
|
RUN mkdir -p /var/code
|
|
@@ -20,11 +22,20 @@ RUN mkdir -p /var/code
|
|
|
20
22
|
COPY checkout.bash /var/docker/checkout.bash
|
|
21
23
|
COPY before_startup.bash /var/docker/before_startup.bash
|
|
22
24
|
COPY startup.bash /var/docker/startup.bash
|
|
23
|
-
<%= copy_hooks [:startup
|
|
25
|
+
<%= copy_hooks @app, [:startup] %>
|
|
26
|
+
<% if @app.repository_name == nil %>
|
|
27
|
+
<%= copy_hooks @app, [:build_new_app] %>
|
|
28
|
+
<% end %>
|
|
24
29
|
|
|
25
30
|
RUN chmod u+x /var/docker/*
|
|
26
31
|
|
|
27
|
-
|
|
32
|
+
WORKDIR /var/code
|
|
33
|
+
|
|
34
|
+
<% if @app.repository_name %>
|
|
35
|
+
<%= include_event(@app, :build_checkout) { "RUN /var/docker/checkout.bash" } %>
|
|
36
|
+
<% else %>
|
|
37
|
+
<%= include_event(@app, :build_new_app) %>
|
|
38
|
+
<% end %>
|
|
28
39
|
|
|
29
40
|
EXPOSE <%= @app.port %>
|
|
30
41
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#! /bin/bash
|
|
2
2
|
|
|
3
|
-
cd /var/code
|
|
4
|
-
|
|
3
|
+
cd /var/code
|
|
4
|
+
<% if @app.repository_name %>
|
|
5
|
+
/var/docker/checkout.bash
|
|
6
|
+
<% end %>
|
|
5
7
|
|
|
6
|
-
<%= include_event :startup, :before, in_bash: true %>
|
|
8
|
+
<%= include_event @app, :startup, :before, in_bash: true %>
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
#! /bin/bash
|
|
2
|
-
|
|
3
|
-
<%= include_event :
|
|
2
|
+
<% if @app.repository_name == nil %>
|
|
3
|
+
<%= include_event @app, :build_new_app, [:before, :during, :after], in_bash: true %>
|
|
4
|
+
<% end %>
|
|
5
|
+
/var/docker/before_startup.bash
|
|
6
|
+
<%= include_event @app, :startup, [:during, :after], in_bash: true %>
|
|
@@ -6,30 +6,26 @@
|
|
|
6
6
|
|
|
7
7
|
FROM <%= @server_type.baseline_image %>
|
|
8
8
|
|
|
9
|
-
<%=
|
|
9
|
+
<%= include_event @project.apps, :initialize_app_environment %>
|
|
10
10
|
|
|
11
11
|
RUN mkdir -p /root/.ssh
|
|
12
12
|
COPY id_rsa /root/.ssh
|
|
13
13
|
RUN ssh-keyscan <%= @project.repository %> >> /root/.ssh/known_hosts
|
|
14
14
|
|
|
15
15
|
RUN mkdir -p /var/docker/
|
|
16
|
-
RUN
|
|
16
|
+
RUN mkdir -p /var/code/
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
RUN chmod u+x /var/docker/*
|
|
18
|
+
RUN apt-get update && apt-get upgrade -y
|
|
21
19
|
|
|
22
20
|
<% @project.apps.each do |app| %>
|
|
23
21
|
<% next unless app.server_type == @server_type.name %>
|
|
22
|
+
<% next unless app.repository_name %>
|
|
24
23
|
|
|
25
24
|
RUN git clone git@<%= @project.repository %>:<%= app.repository_name %> /var/code/<%= app.name %>
|
|
26
25
|
WORKDIR /var/code/<%= app.name %>
|
|
27
|
-
<%= include_event :install_libraries %>
|
|
26
|
+
<%= include_event app, :install_libraries %>
|
|
28
27
|
<% end %>
|
|
29
28
|
|
|
30
|
-
RUN rm /var/docker/*
|
|
29
|
+
RUN rm -f /var/docker/*
|
|
31
30
|
|
|
32
|
-
WORKDIR /
|
|
33
|
-
|
|
34
|
-
RUN apt-get update && apt-get upgrade -y
|
|
35
|
-
RUN apt-get install -y mysql-client
|
|
31
|
+
WORKDIR /
|