ruby_yacht 0.2.0 → 0.3.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/Gemfile.lock +1 -1
- data/README.md +1 -0
- data/doc/TODO.md +1 -6
- data/doc/configuration_sample.rb +7 -0
- data/lib/ruby_yacht/dsl/app.rb +0 -2
- data/lib/ruby_yacht/dsl/dsl.rb +31 -14
- data/lib/ruby_yacht/dsl/project.rb +15 -11
- data/lib/ruby_yacht/images/app/Dockerfile.erb +4 -16
- data/lib/ruby_yacht/images/app/before_startup.bash.erb +1 -3
- data/lib/ruby_yacht/images/app/startup.bash.erb +1 -3
- data/lib/ruby_yacht/images/app-dependencies/Dockerfile.erb +5 -11
- data/lib/ruby_yacht/images/database/Dockerfile.erb +6 -5
- data/lib/ruby_yacht/images/web/Dockerfile.erb +4 -2
- data/lib/ruby_yacht/images/web/add_app.rb +1 -0
- data/lib/ruby_yacht/images/web/app_config.erb +13 -0
- data/lib/ruby_yacht/plugins/rails/scripts/load_seeds.rb +11 -4
- data/lib/ruby_yacht/runner/build_images.rb +114 -31
- data/lib/ruby_yacht/runner/run_containers.rb +1 -10
- data/ruby_yacht.gemspec +2 -2
- data/spec/dsl/app_type_spec.rb +5 -5
- data/spec/dsl/project_spec.rb +44 -0
- data/spec/fixtures/app-dependencies-dockerfile-generic +5 -0
- data/spec/fixtures/app-dependencies-dockerfile-generic-with-library-install +1 -0
- data/spec/fixtures/app-dependencies-dockerfile-rails +1 -0
- data/spec/fixtures/mars-dockerfile +2 -3
- data/spec/fixtures/mars-dockerfile-rails +2 -4
- data/spec/fixtures/mars-dockerfile-with-after-checkout-hooks +2 -4
- data/spec/fixtures/mars-dockerfile-with-before-startup-hooks +2 -3
- data/spec/fixtures/multi-project-web-dockerfile +4 -4
- data/spec/fixtures/web-dockerfile +2 -2
- data/spec/fixtures/web-dockerfile-with-primary-app +20 -0
- data/spec/plugins/rails_spec.rb +1 -1
- data/spec/runner/build_images_spec.rb +10 -10
- data/spec/runner/run_containers_spec.rb +2 -31
- metadata +4 -4
- data/lib/ruby_yacht/images/deploy/Dockerfile.erb +0 -2
- data/lib/ruby_yacht/images/web/setup.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60a4d2f558965415e5cd128391116e187b05c165
|
4
|
+
data.tar.gz: fa574d48c920037379ecf355ce1e07a31a5795ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a534420ae3d0eb73b31ae1f60c930d64bd217cca3717a04e50ac526d291952d024ebb3b604dd97cb5418fda3bc7fd2078220668dc01ca8651919db02d61ea15
|
7
|
+
data.tar.gz: 03bba6e531b6b21bb96250593f06bad135d796bf88bfe21358e92ade3ca194470b2b463a22d00ac5270e53890e9624febffba66d7638842654dac9a12fcce5a0
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -3,6 +3,7 @@ Rails apps.
|
|
3
3
|
|
4
4
|
[](https://codeclimate.com/github/brownleej/ruby-yacht)
|
5
5
|
[](https://codeclimate.com/github/brownleej/ruby-yacht/coverage)
|
6
|
+
[](https://travis-ci.org/brownleej/ruby-yacht)
|
6
7
|
|
7
8
|
# Prerequisites
|
8
9
|
|
data/doc/TODO.md
CHANGED
@@ -4,17 +4,15 @@ for open tickets.
|
|
4
4
|
# General
|
5
5
|
|
6
6
|
* Do more testing with remote databases and non-development environments
|
7
|
-
* Consider whether deploy containers are worth including
|
8
7
|
* Consider whether using the same web server for multiple projects is the best
|
9
8
|
approach
|
10
9
|
* Look into issues with running shell command that has its own command-line
|
11
10
|
flags.
|
11
|
+
* Add formal documentation on configuration DSL.
|
12
12
|
|
13
13
|
# Plugins
|
14
14
|
|
15
|
-
* Move more of the hooks to using the include_event helper
|
16
15
|
* Add documentation on plugin API
|
17
|
-
* Supporting shared databases between apps of different types
|
18
16
|
|
19
17
|
# More Command Line Options
|
20
18
|
|
@@ -24,9 +22,6 @@ for open tickets.
|
|
24
22
|
|
25
23
|
# More customization
|
26
24
|
|
27
|
-
* Add customizations for installation
|
28
|
-
* Add customization for post-checkout hooks
|
29
|
-
* Using one of the apps for the bare domain
|
30
25
|
* Defining custom commands
|
31
26
|
* Allowing customization points at different levels, like adding hooks to
|
32
27
|
individual apps
|
data/doc/configuration_sample.rb
CHANGED
@@ -49,6 +49,10 @@ RubyYacht.configure do
|
|
49
49
|
# This app's repository is at github.com/brownleej/saturn
|
50
50
|
repository_name 'brownleej/saturn'
|
51
51
|
end
|
52
|
+
|
53
|
+
# This indicates that apollo.docker.local should serve requests to the mars
|
54
|
+
# app.
|
55
|
+
primary_app :mars
|
52
56
|
end
|
53
57
|
|
54
58
|
# This is a second project that runs a different set of apps, with different
|
@@ -79,6 +83,9 @@ RubyYacht.configure do
|
|
79
83
|
rails_app :saturn do
|
80
84
|
repository_name 'brownleej/saturn'
|
81
85
|
end
|
86
|
+
|
87
|
+
# Because this project has no primary app, jupiter.docker.local will serve
|
88
|
+
# an ad-hoc landing page with links to the individual apps.
|
82
89
|
end
|
83
90
|
end
|
84
91
|
|
data/lib/ruby_yacht/dsl/app.rb
CHANGED
data/lib/ruby_yacht/dsl/dsl.rb
CHANGED
@@ -208,27 +208,44 @@ module RubyYacht
|
|
208
208
|
|
209
209
|
if self.class.created_type
|
210
210
|
dsl_type = self.class.created_type.name.split('::').last.downcase
|
211
|
-
copied_attributes = self.class.copied_attributes
|
212
|
-
|
213
211
|
RubyYacht.configuration.app_types.each do |app_type|
|
214
212
|
next if @app_type && app_type.name != @app_type
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
end
|
222
|
-
name = "#{app_type.name}_#{attribute[:name]}"
|
223
|
-
self.singleton_class.add_attribute name, attribute[:default], required
|
224
|
-
self.singleton_class.copied_attributes << name
|
225
|
-
self.class.created_type.instance_eval do
|
226
|
-
attr_accessor name
|
213
|
+
method_name = "#{dsl_type}_attributes"
|
214
|
+
if app_type.respond_to?("#{dsl_type}_attributes")
|
215
|
+
attributes = app_type.send(method_name)
|
216
|
+
attributes.each do |attribute|
|
217
|
+
attribute = attribute.merge(name: "#{app_type.name}_#{attribute[:name]}")
|
218
|
+
load_custom_attribute(attribute)
|
227
219
|
end
|
228
220
|
end
|
229
221
|
end
|
230
222
|
end
|
231
223
|
end
|
224
|
+
|
225
|
+
private
|
226
|
+
|
227
|
+
# This method defines the fields for a custom attribute on the DSL.
|
228
|
+
#
|
229
|
+
# ### Parameters
|
230
|
+
#
|
231
|
+
# * **attribute: Hash** The settings on the attribute. The `name`
|
232
|
+
# setting must already include the app type's
|
233
|
+
# prefix.
|
234
|
+
def load_custom_attribute(attribute)
|
235
|
+
if attribute.has_key?(:required)
|
236
|
+
required = attribute[:required]
|
237
|
+
else
|
238
|
+
required = true
|
239
|
+
end
|
240
|
+
name = attribute[:name]
|
241
|
+
self.singleton_class.add_attribute name, attribute[:default], required
|
242
|
+
self.singleton_class.copied_attributes << name
|
243
|
+
self.class.created_type.instance_eval do
|
244
|
+
attr_accessor name
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
public
|
232
249
|
|
233
250
|
# This method runs a block with DSL methods.
|
234
251
|
#
|
@@ -27,10 +27,6 @@ module RubyYacht
|
|
27
27
|
# keeping it entirely inside the container.
|
28
28
|
attr_accessor :check_out_locally
|
29
29
|
|
30
|
-
# Whether we should create a special container with all the apps for running
|
31
|
-
# deploys.
|
32
|
-
attr_accessor :create_deploy_container
|
33
|
-
|
34
30
|
# The configuration for the database. This is a RubyYacht::Database.
|
35
31
|
attr_accessor :database
|
36
32
|
|
@@ -39,6 +35,15 @@ module RubyYacht
|
|
39
35
|
|
40
36
|
# The configuration for the DNS for the apps. This is a RubyYacht::DnsServer.
|
41
37
|
attr_accessor :dns_server
|
38
|
+
|
39
|
+
# The name of the primary app for the project.
|
40
|
+
#
|
41
|
+
# This app will respond to requests to the bare domain with no app
|
42
|
+
# subdomain. It will also respond under its normal subdomain.
|
43
|
+
#
|
44
|
+
# If this is not provided, this will create a special index page for the
|
45
|
+
# bare domain, with links to each app.
|
46
|
+
attr_accessor :primary_app
|
42
47
|
|
43
48
|
# This class provides a DSL for configuring a project.
|
44
49
|
#
|
@@ -78,6 +83,12 @@ module RubyYacht
|
|
78
83
|
# You can call `repository 'github.com'` to set the project's `repository`
|
79
84
|
# to `github.com`
|
80
85
|
add_attribute :repository
|
86
|
+
|
87
|
+
#
|
88
|
+
# :method: primary_app
|
89
|
+
# You can call `primary_app :app1` to tell the project to use `app1` as
|
90
|
+
# the app under the bare domain.
|
91
|
+
add_attribute :primary_app, nil, false
|
81
92
|
|
82
93
|
##
|
83
94
|
# :method: check_out_locally
|
@@ -86,13 +97,6 @@ module RubyYacht
|
|
86
97
|
# `check_out_locally` flag to `true`. The default is false.
|
87
98
|
add_boolean :check_out_locally
|
88
99
|
|
89
|
-
##
|
90
|
-
# :method: create_deploy_container
|
91
|
-
#
|
92
|
-
# You can call `create_deploy_container` to set the project's
|
93
|
-
# `create_deploy_container` flag to `true`. The default is false.
|
94
|
-
add_boolean :create_deploy_container
|
95
|
-
|
96
100
|
##
|
97
101
|
# :method: app
|
98
102
|
#
|
@@ -6,33 +6,21 @@ ENV DATABASE_PASSWORD <%= @project.database.password %>
|
|
6
6
|
ENV DATABASE_USERNAME <%= @project.database.username %>
|
7
7
|
ENV APP_PORT <%= @app.port %>
|
8
8
|
ENV REPOSITORY_HOST <%= @project.repository %>
|
9
|
+
ENV REPOSITORY_NAME <%= @app.repository_name %>
|
9
10
|
ENV SYSTEM_PREFIX <%= @project.system_prefix %>
|
10
|
-
|
11
|
-
<% app_type.environment_variables.select { |variable| variable[:image] == :app }.each do |variable| %>
|
12
|
-
ENV <%= variable[:name] %> <%= instance_eval(&variable[:block]) %>
|
13
|
-
<% end %>
|
11
|
+
<%= include_environment_variables :app %>
|
14
12
|
|
15
13
|
RUN rm -r /var/code
|
16
14
|
RUN mkdir -p /var/code
|
17
15
|
|
18
|
-
ENV REPOSITORY_NAME <%= @app.repository_name %>
|
19
16
|
COPY checkout.bash /var/docker/checkout.bash
|
20
|
-
RUN bash /var/docker/checkout.bash
|
21
|
-
|
22
17
|
COPY before_startup.bash /var/docker/before_startup.bash
|
23
18
|
COPY startup.bash /var/docker/startup.bash
|
24
|
-
|
25
|
-
<% next unless [:startup, :build_checkout].include?(hook.event_type) %>
|
26
|
-
COPY <%= hook.script_name %> /var/docker/<%= hook.script_name %>
|
27
|
-
<% end %>
|
19
|
+
<%= copy_hooks [:startup, :build_checkout] %>
|
28
20
|
|
29
21
|
RUN chmod u+x /var/docker/*
|
30
22
|
|
31
|
-
|
32
|
-
|
33
|
-
<% RubyYacht.configuration.fetch_hooks(app_type: @app.app_type, event_time: :after, event_type: :build_checkout).each do |hook| %>
|
34
|
-
RUN <%= hook.command %>
|
35
|
-
<% end %>
|
23
|
+
<%= include_event(:build_checkout) { "RUN /var/docker/checkout.bash\nWORKDIR /var/code"} %>
|
36
24
|
|
37
25
|
EXPOSE <%= @app.port %>
|
38
26
|
|
@@ -1,5 +1,3 @@
|
|
1
1
|
#! /bin/bash
|
2
2
|
/var/docker/before_startup.bash;
|
3
|
-
|
4
|
-
<%= hook.command %>;
|
5
|
-
<% end %>
|
3
|
+
<%= include_event :startup, [:during, :after], in_bash: true %>
|
@@ -6,34 +6,28 @@
|
|
6
6
|
|
7
7
|
FROM <%= @app_type.baseline_image %>
|
8
8
|
|
9
|
+
<%= include_environment_variables :app_dependencies %>
|
10
|
+
|
9
11
|
RUN mkdir -p /root/.ssh
|
10
12
|
COPY id_rsa /root/.ssh
|
11
13
|
RUN ssh-keyscan <%= @project.repository %> >> /root/.ssh/known_hosts
|
12
14
|
|
13
15
|
RUN mkdir -p /var/docker/
|
16
|
+
RUN touch /var/docker/.keep
|
14
17
|
|
15
|
-
|
16
|
-
<% library_scripts.each do |hook |%>
|
17
|
-
COPY <%= hook.script_name %> /var/docker/<%= hook.script_name %>
|
18
|
-
<% end %>
|
18
|
+
<%= copy_hooks [:install_libraries] %>
|
19
19
|
|
20
|
-
<% if library_scripts.any? %>
|
21
20
|
RUN chmod u+x /var/docker/*
|
22
|
-
<% end %>
|
23
21
|
|
24
22
|
<% @project.apps.each do |app| %>
|
25
23
|
<% next unless app.app_type == @app_type.name %>
|
26
24
|
|
27
25
|
RUN git clone git@<%= @project.repository %>:<%= app.repository_name %> /var/code/<%= app.name %>
|
28
26
|
WORKDIR /var/code/<%= app.name %>
|
29
|
-
|
30
|
-
RUN <%= hook.command %>
|
31
|
-
<% end %>
|
27
|
+
<%= include_event :install_libraries %>
|
32
28
|
<% end %>
|
33
29
|
|
34
|
-
<% if library_scripts.any? %>
|
35
30
|
RUN rm /var/docker/*
|
36
|
-
<% end %>
|
37
31
|
|
38
32
|
WORKDIR /
|
39
33
|
|
@@ -7,13 +7,14 @@ RUN apt-get install -y mysql-server
|
|
7
7
|
ENV DATABASE_USERNAME <%= @project.database.username %>
|
8
8
|
ENV DATABASE_PASSWORD <%= @project.database.password %>
|
9
9
|
ENV DATABASE_NAME <%= @project.database.name %>
|
10
|
+
<% with_each_app_type do %>
|
11
|
+
<%= include_environment_variables :database %>
|
12
|
+
<% end %>
|
10
13
|
|
11
14
|
COPY setup.bash /var/docker/setup.bash
|
12
15
|
COPY checkout.bash /var/docker/checkout.bash
|
13
|
-
<%
|
14
|
-
|
15
|
-
COPY <%= hook.script_name %> /var/docker/<%= hook.script_name %>
|
16
|
-
<% end %>
|
16
|
+
<% with_each_app_type do %>
|
17
|
+
<%= copy_hooks [:load_database_seeds] %>
|
17
18
|
<% end %>
|
18
19
|
|
19
20
|
RUN chmod u+x /var/docker/*
|
@@ -21,10 +22,10 @@ RUN chmod u+x /var/docker/*
|
|
21
22
|
RUN /var/docker/setup.bash <%= database.name %> <%= database.username %> <%= database.password %>
|
22
23
|
|
23
24
|
<% @project.apps.each do |app| %>
|
25
|
+
<% @app_type = RubyYacht.configuration.find_app_type(app.app_type) %>
|
24
26
|
|
25
27
|
RUN /var/docker/checkout.bash <%= @project.repository %> <%= app.name %> <%= app.repository_name %>
|
26
28
|
WORKDIR /var/code/<%= app.name %>
|
27
|
-
<% @app_type = RubyYacht.configuration.find_app_type(app.app_type) %>
|
28
29
|
<%= include_event :load_database_seeds %>
|
29
30
|
<% end %>
|
30
31
|
|
@@ -13,11 +13,13 @@ COPY index_config.erb /var/docker/index_config.erb
|
|
13
13
|
COPY app_config.erb /var/docker/app_config.erb
|
14
14
|
|
15
15
|
<% @projects.each do |project| %>
|
16
|
-
|
16
|
+
<% if project.primary_app == nil %>
|
17
17
|
<% app_list = project.apps.map(&:name).join(',') %>
|
18
|
+
|
18
19
|
RUN ruby /var/docker/add_project.rb <%= project.system_prefix %> <%= project.domain %> <%= app_list %>
|
20
|
+
<% end %>
|
19
21
|
<% project.apps.each do |app| %>
|
20
|
-
RUN ruby /var/docker/add_app.rb <%= project.system_prefix %> <%= project.domain %> <%= app.name %> <%= app.port %>
|
22
|
+
RUN ruby /var/docker/add_app.rb <%= project.system_prefix %> <%= project.domain %> <%= app.name %> <%= app.port %> <%= app.name == project.primary_app %>
|
21
23
|
<% end %>
|
22
24
|
<% end %>
|
23
25
|
|
@@ -6,6 +6,7 @@ require 'erb'
|
|
6
6
|
@app = ARGV.shift
|
7
7
|
@port = ARGV.shift
|
8
8
|
@container_name = "#{@project}-#{@app}"
|
9
|
+
@is_primary_app = ARGV.shift == 'true'
|
9
10
|
|
10
11
|
File.open(File.join("/etc/nginx/conf.d/#{@container_name}.conf"), 'w') do |file|
|
11
12
|
file.write(ERB.new(File.read('/var/docker/app_config.erb')).result(binding))
|
@@ -9,3 +9,16 @@ server {
|
|
9
9
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
10
10
|
}
|
11
11
|
}
|
12
|
+
<% if @is_primary_app %>
|
13
|
+
server {
|
14
|
+
listen 80;
|
15
|
+
server_name <%= @domain %>;
|
16
|
+
|
17
|
+
location / {
|
18
|
+
proxy_pass http://<%= @container_name %>:<%= @port %>;
|
19
|
+
proxy_redirect off;
|
20
|
+
proxy_set_header Host $host;
|
21
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
<% end %>
|
@@ -9,15 +9,20 @@ system "service mysql start"
|
|
9
9
|
|
10
10
|
config_path = "./config/database.yml"
|
11
11
|
|
12
|
+
username = ENV['DATABASE_USERNAME']
|
13
|
+
password = ENV['DATABASE_PASSWORD']
|
14
|
+
database = ENV['DATABASE_NAME']
|
15
|
+
|
16
|
+
|
12
17
|
database_config = {
|
13
18
|
'development' => {
|
14
19
|
'adapter' => 'mysql2',
|
15
20
|
'encoding' => 'utf8',
|
16
21
|
'reconnect' => true,
|
17
|
-
'username' =>
|
18
|
-
'password' =>
|
22
|
+
'username' => username,
|
23
|
+
'password' => password,
|
19
24
|
'host' => 'localhost',
|
20
|
-
'database' =>
|
25
|
+
'database' => database
|
21
26
|
}
|
22
27
|
}
|
23
28
|
|
@@ -26,8 +31,10 @@ File.open(config_path, "w") do |file|
|
|
26
31
|
end
|
27
32
|
|
28
33
|
system "bundle install"
|
29
|
-
tables = `mysql -uroot -e "SHOW TABLES" #{
|
34
|
+
tables = `mysql -uroot -e "SHOW TABLES" #{database}`
|
30
35
|
if tables == ''
|
36
|
+
test_database_command = "CREATE DATABASE #{database}_test; GRANT ALL ON #{database}_test.* TO '#{username}'@'%';"
|
37
|
+
system "mysql -uroot -e \"#{test_database_command}\""
|
31
38
|
system "bundle exec rake db:reset"
|
32
39
|
else
|
33
40
|
system "bundle exec rake db:migrate; bundle exec rake db:seed"
|
@@ -41,10 +41,6 @@ module RubyYacht::Runner
|
|
41
41
|
build_image 'app', "#{@project.system_prefix}-#{app.name}"
|
42
42
|
end
|
43
43
|
@app = nil
|
44
|
-
|
45
|
-
if @project.create_deploy_container
|
46
|
-
build_image 'deploy'
|
47
|
-
end
|
48
44
|
end
|
49
45
|
|
50
46
|
@projects = projects
|
@@ -78,28 +74,10 @@ module RubyYacht::Runner
|
|
78
74
|
FileUtils.cp(path, File.join('tmp', File.basename(path)))
|
79
75
|
end
|
80
76
|
|
81
|
-
|
82
|
-
case folder_name
|
83
|
-
when 'app' then ['Dockerfile', 'before_startup.bash', 'startup.bash']
|
84
|
-
else ['Dockerfile']
|
85
|
-
end
|
77
|
+
set_image_settings(folder_name)
|
86
78
|
|
87
|
-
hook_events
|
88
|
-
|
89
|
-
when 'app' then [:startup, :build_checkout]
|
90
|
-
when 'app-dependencies' then [:install_libraries]
|
91
|
-
when 'database' then [:load_database_seeds]
|
92
|
-
else []
|
93
|
-
end
|
94
|
-
|
95
|
-
app_types =
|
96
|
-
case folder_name
|
97
|
-
when 'database' then @project.apps.map(&:app_type).uniq
|
98
|
-
else [@app_type.name]
|
99
|
-
end
|
100
|
-
|
101
|
-
hook_events.each do |event|
|
102
|
-
app_types.each do |app_type|
|
79
|
+
@hook_events.each do |event|
|
80
|
+
@app_types.each do |app_type|
|
103
81
|
RubyYacht.configuration.fetch_hooks(app_type: app_type, event_type: event).each do |hook|
|
104
82
|
next unless hook.script_path
|
105
83
|
FileUtils.cp hook.script_path, "tmp"
|
@@ -107,7 +85,7 @@ module RubyYacht::Runner
|
|
107
85
|
end
|
108
86
|
end
|
109
87
|
|
110
|
-
templates.each do |template_name|
|
88
|
+
@templates.each do |template_name|
|
111
89
|
File.open(File.join('tmp', template_name), 'w') do |file|
|
112
90
|
template_contents = File.read(File.join('tmp', template_name + '.erb'))
|
113
91
|
file_contents = ERB.new(template_contents, nil, '<>').result(binding)
|
@@ -122,6 +100,38 @@ module RubyYacht::Runner
|
|
122
100
|
|
123
101
|
FileUtils.rm(Dir[File.join("tmp", "*")])
|
124
102
|
end
|
103
|
+
|
104
|
+
# This method establishes settings for building an image.
|
105
|
+
#
|
106
|
+
# This will set the `@templates`, `@hook_events`, and `@app_types` instance
|
107
|
+
# variables.
|
108
|
+
#
|
109
|
+
# ### Parameters
|
110
|
+
#
|
111
|
+
# * **folder_name: String** The name of the folder containing the image
|
112
|
+
# files.
|
113
|
+
def set_image_settings(folder_name)
|
114
|
+
@templates =
|
115
|
+
case folder_name
|
116
|
+
when 'app' then ['Dockerfile', 'before_startup.bash', 'startup.bash']
|
117
|
+
else ['Dockerfile']
|
118
|
+
end
|
119
|
+
|
120
|
+
@hook_events =
|
121
|
+
case folder_name
|
122
|
+
when 'app' then [:startup, :build_checkout]
|
123
|
+
when 'app-dependencies' then [:install_libraries]
|
124
|
+
when 'database' then [:load_database_seeds]
|
125
|
+
else []
|
126
|
+
end
|
127
|
+
|
128
|
+
@app_types =
|
129
|
+
case folder_name
|
130
|
+
when 'database' then @project.apps.map(&:app_type).uniq
|
131
|
+
else [@app_type.name]
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
125
135
|
|
126
136
|
# This method includes the hooks for an event in a Dockerfile.
|
127
137
|
#
|
@@ -130,20 +140,93 @@ module RubyYacht::Runner
|
|
130
140
|
#
|
131
141
|
# ### Parameters
|
132
142
|
#
|
133
|
-
# * **event_type: Symbol**
|
143
|
+
# * **event_type: Symbol** The event whose hooks we are running.
|
144
|
+
# * **times: [Symbol]** The event times whose hooks we want to
|
145
|
+
# include. You can also pass a symbol to this
|
146
|
+
# method, which will cause it to include only
|
147
|
+
# that event time.
|
148
|
+
# * **options: [Hash]** Additional flags for customizing the output.
|
149
|
+
# At this time, the only option is `in_bash`,
|
150
|
+
# which indicates whether the commands are
|
151
|
+
# running in bash rather than a Dockerfile.
|
152
|
+
# * **block** This also takes a block, which should yield
|
153
|
+
# fixed contents for the "during" section of
|
154
|
+
# the event.
|
134
155
|
#
|
135
156
|
# ### Returns
|
136
157
|
#
|
137
158
|
# A String with the contents of the Dockerfile for running the hooks.
|
138
|
-
def include_event(event_type)
|
159
|
+
def include_event(event_type, times = [:before, :during, :after], options = {})
|
139
160
|
result = ""
|
140
|
-
|
141
|
-
|
142
|
-
|
161
|
+
if times.is_a?(Symbol)
|
162
|
+
times = [times]
|
163
|
+
end
|
164
|
+
times.each do |time|
|
165
|
+
if time == :during && block_given?
|
166
|
+
result += yield
|
167
|
+
result += "\n"
|
168
|
+
next
|
169
|
+
end
|
170
|
+
RubyYacht.configuration.fetch_hooks(app_type: @app_type.name, event_type: event_type, event_time: time).each do |hook|
|
171
|
+
if options[:in_bash]
|
172
|
+
result += "#{hook.command};\n"
|
173
|
+
else
|
174
|
+
result += "RUN #{hook.command}\n"
|
175
|
+
end
|
143
176
|
end
|
144
177
|
end
|
145
178
|
|
146
179
|
result
|
147
180
|
end
|
181
|
+
|
182
|
+
# This method includes the app environment variables for the current app
|
183
|
+
# type.
|
184
|
+
#
|
185
|
+
# ### Parameters
|
186
|
+
#
|
187
|
+
# * **image_type: Symbol** The image type that we're building. This can
|
188
|
+
# be `app_dependencies`, `app`, or `database`.
|
189
|
+
#
|
190
|
+
# ### Returns
|
191
|
+
#
|
192
|
+
# A String with the contents of the Dockerfile for adding the environment
|
193
|
+
# variables.
|
194
|
+
def include_environment_variables(image_type)
|
195
|
+
result = ""
|
196
|
+
@app_type.environment_variables.select { |variable| variable[:image] == image_type }.each do |variable|
|
197
|
+
result += "ENV #{variable[:name]} #{instance_eval(&variable[:block])}\n"
|
198
|
+
end
|
199
|
+
result
|
200
|
+
end
|
201
|
+
|
202
|
+
# This method includes commands for copying script files for the hooks for
|
203
|
+
# the current app type.
|
204
|
+
#
|
205
|
+
# ### Parameters
|
206
|
+
#
|
207
|
+
# * **event_types: [Symbol]** The events whose hooks we should include.
|
208
|
+
#
|
209
|
+
# ### Returns
|
210
|
+
#
|
211
|
+
# A String with the contents of the Dockerfile for copying the script.
|
212
|
+
def copy_hooks(event_types)
|
213
|
+
result = ""
|
214
|
+
RubyYacht.configuration.fetch_hooks(app_type: @app_type.name).each do |hook|
|
215
|
+
next if hook.script_name == ''
|
216
|
+
next unless event_types.include?(hook.event_type)
|
217
|
+
result += "COPY #{hook.script_name} /var/docker/#{hook.script_name}\n"
|
218
|
+
end
|
219
|
+
result
|
220
|
+
end
|
221
|
+
|
222
|
+
# This method goes through all the app types for the apps in the project,
|
223
|
+
# sets each one as the `@app_type` instance variable, and then yields to the
|
224
|
+
# block passed to the method.
|
225
|
+
def with_each_app_type
|
226
|
+
@project.apps.map(&:app_type).uniq.each do |app_type|
|
227
|
+
@app_type = RubyYacht.configuration.find_app_type(app_type)
|
228
|
+
yield
|
229
|
+
end
|
230
|
+
end
|
148
231
|
end
|
149
232
|
end
|
@@ -26,10 +26,6 @@ module RubyYacht::Runner
|
|
26
26
|
project.apps.each do |app|
|
27
27
|
run_container app.name
|
28
28
|
end
|
29
|
-
|
30
|
-
if @project.create_deploy_container
|
31
|
-
run_container :deploy
|
32
|
-
end
|
33
29
|
end
|
34
30
|
|
35
31
|
@project = projects.first
|
@@ -59,11 +55,7 @@ module RubyYacht::Runner
|
|
59
55
|
# the system prefix.
|
60
56
|
def volume_flags(container_name)
|
61
57
|
if @project.check_out_locally && ![:database, :web].include?(container_name)
|
62
|
-
|
63
|
-
return ["-v $PWD/../code:/var/code"]
|
64
|
-
else
|
65
|
-
return ["-v $PWD/../code/#{container_name}:/var/code"]
|
66
|
-
end
|
58
|
+
return ["-v $PWD/../#{container_name}:/var/code"]
|
67
59
|
else
|
68
60
|
return []
|
69
61
|
end
|
@@ -84,7 +76,6 @@ module RubyYacht::Runner
|
|
84
76
|
flags = ["-d"]
|
85
77
|
flags += dns_server_flags
|
86
78
|
flags += volume_flags(name)
|
87
|
-
flags << "-it" if name == :deploy
|
88
79
|
flags << "-p 80:80" if name == :web
|
89
80
|
flags << "--net=#{@network}"
|
90
81
|
flags << "--net-alias=#{container_name}"
|
data/ruby_yacht.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = 'ruby_yacht'
|
3
|
-
spec.version = '0.
|
4
|
-
spec.date = '2016-04-
|
3
|
+
spec.version = '0.3.0'
|
4
|
+
spec.date = '2016-04-19'
|
5
5
|
spec.description = "A DSL for building docker containers for a family of Rails apps"
|
6
6
|
spec.summary = "A DSL for building docker containers for a family of Rails apps"
|
7
7
|
spec.authors = ["John Brownlee"]
|
data/spec/dsl/app_type_spec.rb
CHANGED
@@ -50,7 +50,7 @@ describe RubyYacht::AppType do
|
|
50
50
|
block = project_configuration_block
|
51
51
|
RubyYacht.configure do
|
52
52
|
project :test do
|
53
|
-
instance_eval
|
53
|
+
instance_eval(&block)
|
54
54
|
app_type_test_foo 'test value'
|
55
55
|
|
56
56
|
app_type_test_app :test do
|
@@ -68,7 +68,7 @@ describe RubyYacht::AppType do
|
|
68
68
|
block = project_configuration_block
|
69
69
|
RubyYacht.configure do
|
70
70
|
project :test do
|
71
|
-
instance_eval
|
71
|
+
instance_eval(&block)
|
72
72
|
app_type_test_foo 'test value'
|
73
73
|
end
|
74
74
|
end
|
@@ -82,7 +82,7 @@ describe RubyYacht::AppType do
|
|
82
82
|
block = project_configuration_block
|
83
83
|
RubyYacht.configure do
|
84
84
|
project :test do
|
85
|
-
instance_eval
|
85
|
+
instance_eval(&block)
|
86
86
|
app_type_test_foo 'test value'
|
87
87
|
|
88
88
|
app :test1, :app_type_test do
|
@@ -102,7 +102,7 @@ describe RubyYacht::AppType do
|
|
102
102
|
block = project_configuration_block
|
103
103
|
RubyYacht.configure do
|
104
104
|
project :test do
|
105
|
-
instance_eval
|
105
|
+
instance_eval(&block)
|
106
106
|
app_type_test_foo 'test value'
|
107
107
|
|
108
108
|
app :test1, :generic do
|
@@ -128,7 +128,7 @@ describe RubyYacht::AppType do
|
|
128
128
|
expect(lambda do
|
129
129
|
RubyYacht.configure do
|
130
130
|
project :test do
|
131
|
-
instance_eval
|
131
|
+
instance_eval(&block)
|
132
132
|
end
|
133
133
|
end
|
134
134
|
end).to raise_exception "Missing required attribute app_type_test_foo for RubyYacht::Project::DSL"
|
data/spec/dsl/project_spec.rb
CHANGED
@@ -35,12 +35,15 @@ describe RubyYacht::Project do
|
|
35
35
|
dns_server do
|
36
36
|
server '8.10.1.1'
|
37
37
|
end
|
38
|
+
|
39
|
+
primary_app :app1
|
38
40
|
end
|
39
41
|
|
40
42
|
expect(project.name).to eq :test_project
|
41
43
|
expect(project.system_prefix).to eq :a
|
42
44
|
expect(project.domain).to eq "a.test.com"
|
43
45
|
expect(project.repository).to eq "github.com"
|
46
|
+
expect(project.primary_app).to eq :app1
|
44
47
|
|
45
48
|
expect(project.apps.map(&:name)).to eq [:app1, :app2]
|
46
49
|
expect(project.database.name).to eq 'project1'
|
@@ -70,6 +73,8 @@ describe RubyYacht::Project do
|
|
70
73
|
dns_server do
|
71
74
|
server '8.10.1.1'
|
72
75
|
end
|
76
|
+
|
77
|
+
primary_app :app1
|
73
78
|
end
|
74
79
|
|
75
80
|
expect { project }.to raise_exception "Missing required attribute system_prefix for RubyYacht::Project::DSL"
|
@@ -98,6 +103,8 @@ describe RubyYacht::Project do
|
|
98
103
|
dns_server do
|
99
104
|
server '8.10.1.1'
|
100
105
|
end
|
106
|
+
|
107
|
+
primary_app :app1
|
101
108
|
end
|
102
109
|
|
103
110
|
expect { project }.to raise_exception "Missing required attribute domain for RubyYacht::Project::DSL"
|
@@ -126,6 +133,8 @@ describe RubyYacht::Project do
|
|
126
133
|
dns_server do
|
127
134
|
server '8.10.1.1'
|
128
135
|
end
|
136
|
+
|
137
|
+
primary_app :app1
|
129
138
|
end
|
130
139
|
|
131
140
|
expect { project }.to raise_exception "Missing required attribute repository for RubyYacht::Project::DSL"
|
@@ -147,6 +156,8 @@ describe RubyYacht::Project do
|
|
147
156
|
dns_server do
|
148
157
|
server '8.10.1.1'
|
149
158
|
end
|
159
|
+
|
160
|
+
primary_app :app1
|
150
161
|
end
|
151
162
|
|
152
163
|
expect(project.apps.count).to eq 0
|
@@ -169,6 +180,8 @@ describe RubyYacht::Project do
|
|
169
180
|
dns_server do
|
170
181
|
server '8.10.1.1'
|
171
182
|
end
|
183
|
+
|
184
|
+
primary_app :app1
|
172
185
|
end
|
173
186
|
|
174
187
|
expect { project }.to raise_exception "Missing required attribute database for RubyYacht::Project::DSL"
|
@@ -194,9 +207,40 @@ describe RubyYacht::Project do
|
|
194
207
|
username "test"
|
195
208
|
password "test"
|
196
209
|
end
|
210
|
+
|
211
|
+
primary_app :app1
|
197
212
|
end
|
198
213
|
|
199
214
|
expect(project.dns_server).to be_nil
|
200
215
|
end
|
216
|
+
|
217
|
+
it "does not require the primary_app field" do
|
218
|
+
@builder = Proc.new do
|
219
|
+
system_prefix :a
|
220
|
+
domain "a.test.com"
|
221
|
+
repository "github.com"
|
222
|
+
|
223
|
+
app :app1, :generic do
|
224
|
+
repository_name 'brownleej/test1'
|
225
|
+
end
|
226
|
+
|
227
|
+
app :app2, :generic do
|
228
|
+
repository_name 'brownleej/test2'
|
229
|
+
end
|
230
|
+
|
231
|
+
database do
|
232
|
+
host "localhost"
|
233
|
+
name "project1"
|
234
|
+
username "test"
|
235
|
+
password "test"
|
236
|
+
end
|
237
|
+
|
238
|
+
dns_server do
|
239
|
+
server '8.10.1.1'
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
expect(project.primary_app).to be_nil
|
244
|
+
end
|
201
245
|
end
|
202
246
|
end
|
@@ -11,10 +11,15 @@ COPY id_rsa /root/.ssh
|
|
11
11
|
RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
|
12
12
|
|
13
13
|
RUN mkdir -p /var/docker/
|
14
|
+
RUN touch /var/docker/.keep
|
15
|
+
|
16
|
+
RUN chmod u+x /var/docker/*
|
14
17
|
|
15
18
|
RUN git clone git@github.com:brownleej/mars /var/code/mars
|
16
19
|
WORKDIR /var/code/mars
|
17
20
|
|
21
|
+
RUN rm /var/docker/*
|
22
|
+
|
18
23
|
WORKDIR /
|
19
24
|
|
20
25
|
RUN apt-get update && apt-get upgrade -y
|
@@ -6,20 +6,19 @@ ENV DATABASE_PASSWORD test
|
|
6
6
|
ENV DATABASE_USERNAME apollo
|
7
7
|
ENV APP_PORT 8080
|
8
8
|
ENV REPOSITORY_HOST github.com
|
9
|
+
ENV REPOSITORY_NAME brownleej/mars
|
9
10
|
ENV SYSTEM_PREFIX apollo
|
10
11
|
|
11
12
|
RUN rm -r /var/code
|
12
13
|
RUN mkdir -p /var/code
|
13
14
|
|
14
|
-
ENV REPOSITORY_NAME brownleej/mars
|
15
15
|
COPY checkout.bash /var/docker/checkout.bash
|
16
|
-
RUN bash /var/docker/checkout.bash
|
17
|
-
|
18
16
|
COPY before_startup.bash /var/docker/before_startup.bash
|
19
17
|
COPY startup.bash /var/docker/startup.bash
|
20
18
|
|
21
19
|
RUN chmod u+x /var/docker/*
|
22
20
|
|
21
|
+
RUN /var/docker/checkout.bash
|
23
22
|
WORKDIR /var/code
|
24
23
|
|
25
24
|
EXPOSE 8080
|
@@ -6,6 +6,7 @@ ENV DATABASE_PASSWORD test
|
|
6
6
|
ENV DATABASE_USERNAME apollo
|
7
7
|
ENV APP_PORT 8080
|
8
8
|
ENV REPOSITORY_HOST github.com
|
9
|
+
ENV REPOSITORY_NAME brownleej/mars
|
9
10
|
ENV SYSTEM_PREFIX apollo
|
10
11
|
ENV RAILS_ENV development
|
11
12
|
ENV SECRET_KEY_BASE abc
|
@@ -13,10 +14,7 @@ ENV SECRET_KEY_BASE abc
|
|
13
14
|
RUN rm -r /var/code
|
14
15
|
RUN mkdir -p /var/code
|
15
16
|
|
16
|
-
ENV REPOSITORY_NAME brownleej/mars
|
17
17
|
COPY checkout.bash /var/docker/checkout.bash
|
18
|
-
RUN bash /var/docker/checkout.bash
|
19
|
-
|
20
18
|
COPY before_startup.bash /var/docker/before_startup.bash
|
21
19
|
COPY startup.bash /var/docker/startup.bash
|
22
20
|
COPY update_rails_config.rb /var/docker/update_rails_config.rb
|
@@ -24,8 +22,8 @@ COPY prepare_rails_for_launch.rb /var/docker/prepare_rails_for_launch.rb
|
|
24
22
|
|
25
23
|
RUN chmod u+x /var/docker/*
|
26
24
|
|
25
|
+
RUN /var/docker/checkout.bash
|
27
26
|
WORKDIR /var/code
|
28
|
-
|
29
27
|
RUN bundle install && bundle clean --force
|
30
28
|
|
31
29
|
EXPOSE 8080
|
@@ -6,23 +6,21 @@ ENV DATABASE_PASSWORD test
|
|
6
6
|
ENV DATABASE_USERNAME apollo
|
7
7
|
ENV APP_PORT 8080
|
8
8
|
ENV REPOSITORY_HOST github.com
|
9
|
+
ENV REPOSITORY_NAME brownleej/mars
|
9
10
|
ENV SYSTEM_PREFIX apollo
|
10
11
|
|
11
12
|
RUN rm -r /var/code
|
12
13
|
RUN mkdir -p /var/code
|
13
14
|
|
14
|
-
ENV REPOSITORY_NAME brownleej/mars
|
15
15
|
COPY checkout.bash /var/docker/checkout.bash
|
16
|
-
RUN bash /var/docker/checkout.bash
|
17
|
-
|
18
16
|
COPY before_startup.bash /var/docker/before_startup.bash
|
19
17
|
COPY startup.bash /var/docker/startup.bash
|
20
18
|
COPY hook1.rb /var/docker/hook1.rb
|
21
19
|
|
22
20
|
RUN chmod u+x /var/docker/*
|
23
21
|
|
22
|
+
RUN /var/docker/checkout.bash
|
24
23
|
WORKDIR /var/code
|
25
|
-
|
26
24
|
RUN /var/docker/hook1.rb
|
27
25
|
|
28
26
|
EXPOSE 8080
|
@@ -6,15 +6,13 @@ ENV DATABASE_PASSWORD test
|
|
6
6
|
ENV DATABASE_USERNAME apollo
|
7
7
|
ENV APP_PORT 8080
|
8
8
|
ENV REPOSITORY_HOST github.com
|
9
|
+
ENV REPOSITORY_NAME brownleej/mars
|
9
10
|
ENV SYSTEM_PREFIX apollo
|
10
11
|
|
11
12
|
RUN rm -r /var/code
|
12
13
|
RUN mkdir -p /var/code
|
13
14
|
|
14
|
-
ENV REPOSITORY_NAME brownleej/mars
|
15
15
|
COPY checkout.bash /var/docker/checkout.bash
|
16
|
-
RUN bash /var/docker/checkout.bash
|
17
|
-
|
18
16
|
COPY before_startup.bash /var/docker/before_startup.bash
|
19
17
|
COPY startup.bash /var/docker/startup.bash
|
20
18
|
COPY hook1.rb /var/docker/hook1.rb
|
@@ -22,6 +20,7 @@ COPY hook2.rb /var/docker/hook2.rb
|
|
22
20
|
|
23
21
|
RUN chmod u+x /var/docker/*
|
24
22
|
|
23
|
+
RUN /var/docker/checkout.bash
|
25
24
|
WORKDIR /var/code
|
26
25
|
|
27
26
|
EXPOSE 8080
|
@@ -13,12 +13,12 @@ COPY index_config.erb /var/docker/index_config.erb
|
|
13
13
|
COPY app_config.erb /var/docker/app_config.erb
|
14
14
|
|
15
15
|
RUN ruby /var/docker/add_project.rb apollo apollo.test.com mars,saturn
|
16
|
-
RUN ruby /var/docker/add_app.rb apollo apollo.test.com mars 8080
|
17
|
-
RUN ruby /var/docker/add_app.rb apollo apollo.test.com saturn 8080
|
16
|
+
RUN ruby /var/docker/add_app.rb apollo apollo.test.com mars 8080 false
|
17
|
+
RUN ruby /var/docker/add_app.rb apollo apollo.test.com saturn 8080 false
|
18
18
|
|
19
19
|
RUN ruby /var/docker/add_project.rb jupiter jupiter.test.com venus,saturn
|
20
|
-
RUN ruby /var/docker/add_app.rb jupiter jupiter.test.com venus 8080
|
21
|
-
RUN ruby /var/docker/add_app.rb jupiter jupiter.test.com saturn 8080
|
20
|
+
RUN ruby /var/docker/add_app.rb jupiter jupiter.test.com venus 8080 false
|
21
|
+
RUN ruby /var/docker/add_app.rb jupiter jupiter.test.com saturn 8080 false
|
22
22
|
|
23
23
|
RUN rm -r /var/docker
|
24
24
|
RUN apt-get remove -y ruby
|
@@ -13,8 +13,8 @@ COPY index_config.erb /var/docker/index_config.erb
|
|
13
13
|
COPY app_config.erb /var/docker/app_config.erb
|
14
14
|
|
15
15
|
RUN ruby /var/docker/add_project.rb apollo apollo.test.com mars,saturn
|
16
|
-
RUN ruby /var/docker/add_app.rb apollo apollo.test.com mars 8080
|
17
|
-
RUN ruby /var/docker/add_app.rb apollo apollo.test.com saturn 8080
|
16
|
+
RUN ruby /var/docker/add_app.rb apollo apollo.test.com mars 8080 false
|
17
|
+
RUN ruby /var/docker/add_app.rb apollo apollo.test.com saturn 8080 false
|
18
18
|
|
19
19
|
RUN rm -r /var/docker
|
20
20
|
RUN apt-get remove -y ruby
|
@@ -0,0 +1,20 @@
|
|
1
|
+
FROM nginx
|
2
|
+
|
3
|
+
RUN apt-get update
|
4
|
+
RUN apt-get upgrade -y
|
5
|
+
RUN apt-get install -y ruby
|
6
|
+
|
7
|
+
RUN mkdir -p /var/docker
|
8
|
+
|
9
|
+
COPY add_project.rb /var/docker/add_project.rb
|
10
|
+
COPY add_app.rb /var/docker/add_app.rb
|
11
|
+
COPY index.html.erb /var/docker/index.html.erb
|
12
|
+
COPY index_config.erb /var/docker/index_config.erb
|
13
|
+
COPY app_config.erb /var/docker/app_config.erb
|
14
|
+
|
15
|
+
RUN ruby /var/docker/add_app.rb apollo apollo.test.com mars 8080 true
|
16
|
+
RUN ruby /var/docker/add_app.rb apollo apollo.test.com saturn 8080 false
|
17
|
+
|
18
|
+
RUN rm -r /var/docker
|
19
|
+
RUN apt-get remove -y ruby
|
20
|
+
RUN apt-get autoremove -y
|
data/spec/plugins/rails_spec.rb
CHANGED
@@ -170,7 +170,7 @@ describe RubyYacht::Plugins::Rails do
|
|
170
170
|
it "generates the dockerfiles for the web server" do
|
171
171
|
docker.expect "build -t apollo-web tmp" do
|
172
172
|
files = Dir[File.join("tmp", "*")].sort
|
173
|
-
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/add_app.rb', 'tmp/add_project.rb', 'tmp/app_config.erb', 'tmp/index.html.erb', 'tmp/index_config.erb'
|
173
|
+
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/add_app.rb', 'tmp/add_project.rb', 'tmp/app_config.erb', 'tmp/index.html.erb', 'tmp/index_config.erb']
|
174
174
|
dockerfile = File.read(File.join('tmp', 'Dockerfile'))
|
175
175
|
expected = File.read(File.join('spec', 'fixtures', 'web-dockerfile'))
|
176
176
|
expect(dockerfile).to eq expected
|
@@ -63,7 +63,7 @@ describe RubyYacht::Runner::BuildImages do
|
|
63
63
|
it "generates the dockerfiles for the web server" do
|
64
64
|
docker.expect "build -t apollo-web tmp" do
|
65
65
|
files = Dir[File.join("tmp", "*")].sort
|
66
|
-
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/add_app.rb', 'tmp/add_project.rb', 'tmp/app_config.erb', 'tmp/index.html.erb', 'tmp/index_config.erb'
|
66
|
+
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/add_app.rb', 'tmp/add_project.rb', 'tmp/app_config.erb', 'tmp/index.html.erb', 'tmp/index_config.erb']
|
67
67
|
dockerfile = File.read(File.join('tmp', 'Dockerfile'))
|
68
68
|
expected = File.read(File.join('spec', 'fixtures', 'web-dockerfile'))
|
69
69
|
expect(dockerfile).to eq expected
|
@@ -158,18 +158,18 @@ describe RubyYacht::Runner::BuildImages do
|
|
158
158
|
end
|
159
159
|
end
|
160
160
|
end
|
161
|
-
|
162
|
-
context "with
|
161
|
+
|
162
|
+
context "with an app set up as the primary app" do
|
163
163
|
before do
|
164
|
-
RubyYacht.configuration.projects.
|
164
|
+
RubyYacht.configuration.projects[0].primary_app = :mars
|
165
165
|
end
|
166
|
-
|
167
|
-
it "
|
168
|
-
docker.expect
|
166
|
+
|
167
|
+
it "includes that app in the setup in the web server dockerfile" do
|
168
|
+
docker.expect "build -t apollo-web tmp" do
|
169
169
|
files = Dir[File.join("tmp", "*")].sort
|
170
|
-
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb']
|
170
|
+
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/add_app.rb', 'tmp/add_project.rb', 'tmp/app_config.erb', 'tmp/index.html.erb', 'tmp/index_config.erb']
|
171
171
|
dockerfile = File.read(File.join('tmp', 'Dockerfile'))
|
172
|
-
expected = File.read(File.join('spec', 'fixtures', '
|
172
|
+
expected = File.read(File.join('spec', 'fixtures', 'web-dockerfile-with-primary-app'))
|
173
173
|
expect(dockerfile).to eq expected
|
174
174
|
end
|
175
175
|
subject.run
|
@@ -198,7 +198,7 @@ describe RubyYacht::Runner::BuildImages do
|
|
198
198
|
it "generates one dockerfile for the web server with both projects" do
|
199
199
|
docker.expect "build -t apollo-web tmp" do
|
200
200
|
files = Dir[File.join("tmp", "*")].sort
|
201
|
-
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/add_app.rb', 'tmp/add_project.rb', 'tmp/app_config.erb', 'tmp/index.html.erb', 'tmp/index_config.erb'
|
201
|
+
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/add_app.rb', 'tmp/add_project.rb', 'tmp/app_config.erb', 'tmp/index.html.erb', 'tmp/index_config.erb']
|
202
202
|
dockerfile = File.read(File.join('tmp', 'Dockerfile'))
|
203
203
|
expected = File.read(File.join('spec', 'fixtures', 'multi-project-web-dockerfile'))
|
204
204
|
expect(dockerfile).to eq expected
|
@@ -32,21 +32,6 @@ describe RubyYacht::Runner::RunContainers do
|
|
32
32
|
expect(subject.run).to be_truthy
|
33
33
|
end
|
34
34
|
|
35
|
-
context "with a deploy container" do
|
36
|
-
before do
|
37
|
-
RubyYacht.configuration.projects.first.create_deploy_container = true
|
38
|
-
end
|
39
|
-
|
40
|
-
it "runs the deploy container" do
|
41
|
-
docker.expect 'run -d -it --net=apollo --net-alias=apollo-deploy --name=apollo-deploy apollo-deploy'
|
42
|
-
subject.run
|
43
|
-
end
|
44
|
-
|
45
|
-
it "returns true" do
|
46
|
-
expect(subject.run).to be_truthy
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
35
|
context "with a local database" do
|
51
36
|
before do
|
52
37
|
RubyYacht.configuration.projects.first.database.host = 'localhost'
|
@@ -106,28 +91,14 @@ describe RubyYacht::Runner::RunContainers do
|
|
106
91
|
end
|
107
92
|
|
108
93
|
it "maps the code volume to a local directory" do
|
109
|
-
docker.expect 'run -d -v $PWD/../
|
110
|
-
docker.expect 'run -d -v $PWD/../
|
94
|
+
docker.expect 'run -d -v $PWD/../mars:/var/code --net=apollo --net-alias=apollo-mars --name=apollo-mars apollo-mars'
|
95
|
+
docker.expect 'run -d -v $PWD/../saturn:/var/code --net=apollo --net-alias=apollo-saturn --name=apollo-saturn apollo-saturn'
|
111
96
|
subject.run
|
112
97
|
end
|
113
98
|
|
114
99
|
it "returns true" do
|
115
100
|
expect(subject.run).to be_truthy
|
116
101
|
end
|
117
|
-
|
118
|
-
context "when creating a deploy container" do
|
119
|
-
before do
|
120
|
-
RubyYacht.configuration.projects.first.create_deploy_container = true
|
121
|
-
end
|
122
|
-
it "maps the code volume to a local directory" do
|
123
|
-
docker.expect 'run -d -v $PWD/../code:/var/code -it --net=apollo --net-alias=apollo-deploy --name=apollo-deploy apollo-deploy'
|
124
|
-
subject.run
|
125
|
-
end
|
126
|
-
|
127
|
-
it "returns true" do
|
128
|
-
expect(subject.run).to be_truthy
|
129
|
-
end
|
130
|
-
end
|
131
102
|
end
|
132
103
|
end
|
133
104
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_yacht
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Brownlee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -89,14 +89,12 @@ files:
|
|
89
89
|
- lib/ruby_yacht/images/database/Dockerfile.erb
|
90
90
|
- lib/ruby_yacht/images/database/checkout.bash
|
91
91
|
- lib/ruby_yacht/images/database/setup.bash
|
92
|
-
- lib/ruby_yacht/images/deploy/Dockerfile.erb
|
93
92
|
- lib/ruby_yacht/images/web/Dockerfile.erb
|
94
93
|
- lib/ruby_yacht/images/web/add_app.rb
|
95
94
|
- lib/ruby_yacht/images/web/add_project.rb
|
96
95
|
- lib/ruby_yacht/images/web/app_config.erb
|
97
96
|
- lib/ruby_yacht/images/web/index.html.erb
|
98
97
|
- lib/ruby_yacht/images/web/index_config.erb
|
99
|
-
- lib/ruby_yacht/images/web/setup.rb
|
100
98
|
- lib/ruby_yacht/plugins.rb
|
101
99
|
- lib/ruby_yacht/plugins/rails.rb
|
102
100
|
- lib/ruby_yacht/plugins/rails/scripts/install_gems.rb
|
@@ -146,6 +144,7 @@ files:
|
|
146
144
|
- spec/fixtures/mars-startup-rails
|
147
145
|
- spec/fixtures/multi-project-web-dockerfile
|
148
146
|
- spec/fixtures/web-dockerfile
|
147
|
+
- spec/fixtures/web-dockerfile-with-primary-app
|
149
148
|
- spec/plugins/rails_spec.rb
|
150
149
|
- spec/runner/build_images_spec.rb
|
151
150
|
- spec/runner/build_spec.rb
|
@@ -216,6 +215,7 @@ test_files:
|
|
216
215
|
- spec/fixtures/mars-startup-rails
|
217
216
|
- spec/fixtures/multi-project-web-dockerfile
|
218
217
|
- spec/fixtures/web-dockerfile
|
218
|
+
- spec/fixtures/web-dockerfile-with-primary-app
|
219
219
|
- spec/plugins/rails_spec.rb
|
220
220
|
- spec/runner/build_images_spec.rb
|
221
221
|
- spec/runner/build_spec.rb
|
@@ -1,22 +0,0 @@
|
|
1
|
-
#! /usr/local/bin/ruby
|
2
|
-
require 'erb'
|
3
|
-
require 'fileutils'
|
4
|
-
|
5
|
-
@project = ARGV.shift
|
6
|
-
@domain = ARGV.shift
|
7
|
-
@app_names = ARGV.shift.split(',')
|
8
|
-
@app_ports = ARGV.shift.split(',')
|
9
|
-
|
10
|
-
File.open(File.join("/usr/share/nginx/html/#{@project}.html"), 'w') do |file|
|
11
|
-
file.write(ERB.new(File.read('/var/docker/index.html.erb')).result(binding))
|
12
|
-
end
|
13
|
-
|
14
|
-
File.open(File.join("/etc/nginx/conf.d/#{@project}.conf"), 'w') do |file|
|
15
|
-
file.write(ERB.new(File.read('/var/docker/index_config.erb')).result(binding))
|
16
|
-
@app_names.each_with_index do |app, port|
|
17
|
-
@app = app
|
18
|
-
@app_port = port
|
19
|
-
@container_name = @project + '-' + @app
|
20
|
-
file.write(ERB.new(File.read('/var/docker/app_config.erb')).result(binding))
|
21
|
-
end
|
22
|
-
end
|