ruby_yacht 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -4,36 +4,25 @@ ENV DATABASE_USERNAME <%= @database.username %>
|
|
4
4
|
ENV DATABASE_PASSWORD <%= @database.password %>
|
5
5
|
ENV DATABASE_NAME <%= @database.name %>
|
6
6
|
ENV DATABASE_TYPE <%= @database.server_type %>
|
7
|
-
<%= include_environment_variables :database %>
|
8
|
-
<% with_each_app_type do %>
|
9
|
-
<%= include_environment_variables :database %>
|
10
|
-
<% end %>
|
11
7
|
|
12
8
|
COPY checkout.bash /var/docker/checkout.bash
|
13
9
|
COPY startup.bash /var/docker/startup.bash
|
14
|
-
<%= copy_hooks
|
15
|
-
<% with_each_app_type do %>
|
16
|
-
<%= copy_hooks [:load_database_seeds] %>
|
17
|
-
<% end %>
|
10
|
+
<%= copy_hooks @database, [:startup] %>
|
18
11
|
|
19
12
|
RUN chmod u+x /var/docker/*
|
20
13
|
|
21
|
-
<%= include_event :install_libraries %>
|
14
|
+
<%= include_event @database, :install_libraries %>
|
22
15
|
|
23
|
-
<%= include_event :create_databases %>
|
16
|
+
<%= include_event @database, :create_databases %>
|
24
17
|
|
25
|
-
<%
|
26
|
-
<% apps = @project.apps.select { |app| app.database_name == @database.name } %>
|
27
|
-
<% apps.each do |app| %>
|
28
|
-
<% @server_type = RubyYacht.configuration.find_server_type(app.server_type) %>
|
18
|
+
<% @database.apps.each do |app| %>
|
29
19
|
|
20
|
+
<% next unless app.repository_name %>
|
30
21
|
RUN /var/docker/checkout.bash <%= @project.repository %> <%= app.name %> <%= app.repository_name %>
|
31
22
|
WORKDIR /var/code/<%= app.name %>
|
32
|
-
<%= include_event :load_database_seeds %>
|
23
|
+
<%= include_event @database, :load_database_seeds %>
|
33
24
|
<% end %>
|
34
25
|
|
35
|
-
<% @server_type = original_server_type %>
|
36
|
-
|
37
26
|
RUN rm -r /var/code
|
38
27
|
WORKDIR /
|
39
28
|
|
@@ -41,6 +30,6 @@ ENV DATABASE_USERNAME ''
|
|
41
30
|
ENV DATABASE_PASSWORD ''
|
42
31
|
ENV DATABASE_NAME ''
|
43
32
|
|
44
|
-
EXPOSE
|
33
|
+
EXPOSE <%= @database.port %>
|
45
34
|
|
46
35
|
CMD /var/docker/startup.bash
|
@@ -2,31 +2,37 @@ FROM nginx
|
|
2
2
|
|
3
3
|
RUN apt-get update
|
4
4
|
RUN apt-get upgrade -y
|
5
|
-
|
5
|
+
<%= include_event @server, :install_libraries %>
|
6
6
|
|
7
7
|
RUN mkdir -p /var/docker
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
COPY index_config.erb /var/docker/index_config.erb
|
13
|
-
COPY app_config.erb /var/docker/app_config.erb
|
14
|
-
|
15
|
-
<% @projects.each do |project| %>
|
16
|
-
<% primary_app = project.primary_app %>
|
17
|
-
<% if project.apps.any? { |app| app.name == project.system_prefix } %>
|
18
|
-
<% primary_app = project.system_prefix %>
|
9
|
+
<% primary_app = @project.primary_app %>
|
10
|
+
<% if @project.apps.any? { |app| app.name == @project.system_prefix } %>
|
11
|
+
<% primary_app = @project.system_prefix %>
|
19
12
|
<% end %>
|
20
|
-
<% if primary_app == nil %>
|
21
|
-
<% app_list = project.apps.map(&:name).join(',') %>
|
22
13
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
14
|
+
ENV PROJECT <%= @project.system_prefix %>
|
15
|
+
ENV DOMAIN <%= @server.domain %>
|
16
|
+
|
17
|
+
<% if primary_app == nil %>
|
18
|
+
<% app_list = @project.apps.map(&:name).join(',') %>
|
19
|
+
ENV APP_LIST <%= app_list %>
|
20
|
+
<%= include_event @server, :add_project_landing %>
|
27
21
|
<% end %>
|
22
|
+
|
23
|
+
<% @project.apps.each do |app| %>
|
24
|
+
|
25
|
+
ENV APP_NAME <%= app.name %>
|
26
|
+
ENV APP_PORT <%= app.port %>
|
27
|
+
ENV APP_PRIMARY <%= app.name == primary_app %>
|
28
|
+
<%= include_event @server, :add_app_config %>
|
28
29
|
<% end %>
|
29
30
|
|
30
31
|
RUN rm -r /var/docker
|
31
|
-
|
32
|
-
|
32
|
+
|
33
|
+
ENV PROJECT ""
|
34
|
+
ENV DOMAIN ""
|
35
|
+
ENV APP_LIST ""
|
36
|
+
ENV APP_NAME ""
|
37
|
+
ENV APP_PORT ""
|
38
|
+
ENV APP_PRIMARY ""
|
@@ -7,18 +7,28 @@ module RubyYacht::Plugins
|
|
7
7
|
server_type :mysql do
|
8
8
|
container_type :database
|
9
9
|
baseline_image 'mysql'
|
10
|
-
|
11
|
-
environment_variable :database, 'DEBIAN_FRONTEND' do
|
12
|
-
'noninteractive'
|
13
|
-
end
|
10
|
+
server_default port: 3306
|
14
11
|
end
|
15
12
|
end
|
16
13
|
|
17
14
|
RubyYacht.configure do
|
18
|
-
add_hooks(
|
19
|
-
during(:install_libraries)
|
20
|
-
|
21
|
-
|
15
|
+
add_hooks(database_server_type: :mysql, container_type: :database, script_folder: File.join(File.dirname(__FILE__), 'mysql', 'scripts')) do
|
16
|
+
during(:install_libraries) do
|
17
|
+
set_environment_variable 'DEBIAN_FRONTEND', 'noninteractive'
|
18
|
+
command 'apt-get install -y mysql-server'
|
19
|
+
end
|
20
|
+
during(:create_databases) { run_script :bash, 'setup.bash' }
|
21
|
+
|
22
|
+
before(:startup) do
|
23
|
+
set_environment_variable('MYSQL_PORT') { @database.port }
|
24
|
+
end
|
25
|
+
|
26
|
+
during(:startup) { command 'mysqld_safe --bind-address=0.0.0.0 --port=$MYSQL_PORT' }
|
27
|
+
|
28
|
+
during :install_libraries do
|
29
|
+
container_type :app
|
30
|
+
command 'apt-get install -y mysql-client'
|
31
|
+
end
|
22
32
|
end
|
23
33
|
end
|
24
34
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
#! /usr/local/bin/ruby
|
2
2
|
require 'erb'
|
3
3
|
|
4
|
-
@project =
|
5
|
-
@domain =
|
6
|
-
@app =
|
7
|
-
@port =
|
4
|
+
@project = ENV['PROJECT']
|
5
|
+
@domain = ENV['DOMAIN']
|
6
|
+
@app = ENV['APP_NAME']
|
7
|
+
@port = ENV['APP_PORT']
|
8
8
|
|
9
9
|
if @project == @app
|
10
10
|
@container_name = @project
|
@@ -12,7 +12,7 @@ else
|
|
12
12
|
@container_name = "#{@project}-#{@app}"
|
13
13
|
end
|
14
14
|
|
15
|
-
@is_primary_app =
|
15
|
+
@is_primary_app = ENV['APP_PRIMARY'] == 'true'
|
16
16
|
|
17
17
|
File.open(File.join("/etc/nginx/conf.d/#{@container_name}.conf"), 'w') do |file|
|
18
18
|
file.write(ERB.new(File.read('/var/docker/app_config.erb')).result(binding))
|
@@ -1,9 +1,9 @@
|
|
1
1
|
#! /usr/local/bin/ruby
|
2
2
|
require 'erb'
|
3
3
|
|
4
|
-
@project =
|
5
|
-
@domain =
|
6
|
-
@app_names =
|
4
|
+
@project = ENV['PROJECT']
|
5
|
+
@domain = ENV['DOMAIN']
|
6
|
+
@app_names = ENV['APP_LIST'].split(',')
|
7
7
|
|
8
8
|
File.open(File.join("/usr/share/nginx/html/#{@project}.html"), 'w') do |file|
|
9
9
|
file.write(ERB.new(File.read('/var/docker/index.html.erb')).result(binding))
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module RubyYacht::Plugins
|
2
|
+
# This module provides the plugin for managing nginx web servers.
|
3
|
+
module Nginx
|
4
|
+
# This method loads the configuration for the nginx plugin.
|
5
|
+
def self.load
|
6
|
+
RubyYacht.configure do
|
7
|
+
server_type :nginx do
|
8
|
+
container_type :web
|
9
|
+
baseline_image 'nginx'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
RubyYacht.configure do
|
14
|
+
add_hooks container_type: :web, web_server_type: :nginx, script_folder: File.join(File.dirname(__FILE__), 'nginx', 'scripts') do
|
15
|
+
during(:install_libraries) { command 'apt-get install -y ruby' }
|
16
|
+
during(:install_libraries) { copy_file 'index.html.erb' }
|
17
|
+
during(:install_libraries) { copy_file 'index_config.erb' }
|
18
|
+
during(:install_libraries) { copy_file 'app_config.erb' }
|
19
|
+
|
20
|
+
during(:add_project_landing) { run_script :ruby, 'add_project.rb' }
|
21
|
+
during(:add_app_config) { run_script :ruby, 'add_app.rb' }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
RubyYacht::Plugins::Nginx.load
|
@@ -2,6 +2,10 @@
|
|
2
2
|
require 'yaml'
|
3
3
|
|
4
4
|
database_host = ENV['DATABASE_HOST']
|
5
|
+
|
6
|
+
if database_host == nil
|
7
|
+
exit(0)
|
8
|
+
end
|
5
9
|
|
6
10
|
common_config = {
|
7
11
|
'adapter' => 'mysql2',
|
@@ -9,7 +13,8 @@ common_config = {
|
|
9
13
|
'password' => ENV['DATABASE_PASSWORD'],
|
10
14
|
'reconnect' => true,
|
11
15
|
'host' => database_host,
|
12
|
-
'database' => ENV['DATABASE_NAME']
|
16
|
+
'database' => ENV['DATABASE_NAME'],
|
17
|
+
'port' => ENV['DATABASE_PORT']
|
13
18
|
}
|
14
19
|
|
15
20
|
database_config = {
|
@@ -3,6 +3,12 @@ module RubyYacht::Plugins
|
|
3
3
|
module Rails
|
4
4
|
# This method loads the configuration for the Rails plugin.
|
5
5
|
def self.load
|
6
|
+
load_server_type
|
7
|
+
load_hooks
|
8
|
+
end
|
9
|
+
|
10
|
+
# This method loads the configuration for the Rails server type.
|
11
|
+
def self.load_server_type
|
6
12
|
RubyYacht.configure do
|
7
13
|
server_type :rails do
|
8
14
|
container_type :app
|
@@ -10,33 +16,42 @@ module RubyYacht::Plugins
|
|
10
16
|
project_attribute name: :environment, default: 'development'
|
11
17
|
project_attribute name: :excluded_gem_groups, default: []
|
12
18
|
project_attribute name: :secret_key_base
|
13
|
-
|
14
|
-
environment_variable :app_dependencies, 'RAILS_ENV' do
|
15
|
-
@project.rails_environment
|
16
|
-
end
|
17
|
-
|
18
|
-
environment_variable :app, 'SECRET_KEY_BASE' do
|
19
|
-
@project.rails_secret_key_base
|
20
|
-
end
|
21
|
-
|
22
|
-
environment_variable :app_dependencies, 'EXCLUDED_GEM_GROUPS' do
|
23
|
-
groups = @project.rails_excluded_gem_groups.join(' ')
|
24
|
-
groups = '""' if groups == ''
|
25
|
-
groups
|
26
|
-
end
|
27
19
|
end
|
28
20
|
end
|
21
|
+
end
|
29
22
|
|
23
|
+
# This method loads the configuration for the Rails hooks.
|
24
|
+
def self.load_hooks
|
30
25
|
RubyYacht.configure do
|
31
|
-
add_hooks(
|
32
|
-
during
|
26
|
+
add_hooks(app_server_type: :rails, container_type: :app, script_folder: File.join(File.dirname(__FILE__), 'rails', 'scripts')) do
|
27
|
+
during :initialize_app_environment do
|
28
|
+
set_environment_variable 'RAILS_ENV' do
|
29
|
+
@project.rails_environment
|
30
|
+
end
|
31
|
+
set_environment_variable 'SECRET_KEY_BASE' do
|
32
|
+
@project.rails_secret_key_base
|
33
|
+
end
|
34
|
+
set_environment_variable 'EXCLUDED_GEM_GROUPS' do
|
35
|
+
groups = @project.rails_excluded_gem_groups.join(' ')
|
36
|
+
groups = '""' if groups == ''
|
37
|
+
groups
|
38
|
+
end
|
39
|
+
end
|
40
|
+
during(:install_libraries) { run_script :ruby, 'install_gems.rb' }
|
33
41
|
|
34
42
|
after(:build_checkout) { command 'bundle install --clean' }
|
35
43
|
|
36
|
-
during
|
44
|
+
during :load_database_seeds do
|
45
|
+
container_type :database
|
46
|
+
run_script :ruby, 'load_seeds.rb'
|
47
|
+
end
|
48
|
+
|
49
|
+
during :build_new_app do
|
50
|
+
run_script :ruby, 'build_new_app.rb'
|
51
|
+
end
|
37
52
|
|
38
|
-
before(:startup) { run_script 'update_rails_config.rb' }
|
39
|
-
before(:startup) { run_script 'prepare_rails_for_launch.rb' }
|
53
|
+
before(:startup) { run_script :ruby, 'update_rails_config.rb' }
|
54
|
+
before(:startup) { run_script :ruby, 'prepare_rails_for_launch.rb' }
|
40
55
|
|
41
56
|
during(:startup) { command 'rails s -b 0.0.0.0 -p $APP_PORT -e $RAILS_ENV' }
|
42
57
|
end
|
data/lib/ruby_yacht/plugins.rb
CHANGED
@@ -20,36 +20,48 @@ module RubyYacht::Runner
|
|
20
20
|
|
21
21
|
projects.each do |project|
|
22
22
|
log "Building images for #{project.name}"
|
23
|
-
@project = project
|
24
23
|
|
25
24
|
id_path = File.join(ENV['HOME'], '.ssh', 'id_rsa')
|
26
25
|
tmp_id_path = File.join('tmp', 'id_rsa')
|
27
26
|
FileUtils.cp(id_path, tmp_id_path) if File.exist?(id_path)
|
27
|
+
|
28
|
+
build_images(project)
|
29
|
+
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
@project.
|
42
|
-
@app = app
|
43
|
-
@server_type = RubyYacht.configuration.find_server_type(@app.server_type)
|
44
|
-
build_image 'app', @app.container_name(@project)
|
45
|
-
end
|
46
|
-
@app = nil
|
31
|
+
true
|
32
|
+
end
|
33
|
+
|
34
|
+
# This method builds the images for a project.
|
35
|
+
#
|
36
|
+
# ### Parameters
|
37
|
+
#
|
38
|
+
# * **project: Project** The project we are building.
|
39
|
+
def build_images(project)
|
40
|
+
@project = project
|
41
|
+
project.apps.map(&:server_type).uniq.each do |type_name|
|
42
|
+
@server_type = RubyYacht.configuration.find_server_type(type_name)
|
43
|
+
build_image 'app-dependencies', "#{@project.system_prefix}-#{@server_type.name}-app-dependencies"
|
47
44
|
end
|
48
45
|
|
49
|
-
@
|
50
|
-
|
46
|
+
@app_server_type = RubyYacht.configuration.find_server_type(project.apps.first.server_type)
|
47
|
+
project.databases.select(&:local?).each do |database|
|
48
|
+
@database = database
|
49
|
+
@server_type = RubyYacht.configuration.find_server_type(@database.server_type)
|
50
|
+
build_image 'database', @database.container_name
|
51
|
+
end
|
52
|
+
@database = nil
|
51
53
|
|
52
|
-
|
54
|
+
@project.apps.each do |app|
|
55
|
+
@app = app
|
56
|
+
@server_type = RubyYacht.configuration.find_server_type(@app.server_type)
|
57
|
+
build_image 'app', @app.container_name
|
58
|
+
end
|
59
|
+
@app = nil
|
60
|
+
|
61
|
+
project.web_servers.each do |server|
|
62
|
+
@server = server
|
63
|
+
build_image 'web', @server.container_name
|
64
|
+
end
|
53
65
|
end
|
54
66
|
|
55
67
|
# This method builds an image.
|
@@ -79,13 +91,9 @@ module RubyYacht::Runner
|
|
79
91
|
|
80
92
|
set_image_settings(folder_name)
|
81
93
|
|
82
|
-
@hook_events.each do |
|
83
|
-
|
84
|
-
|
85
|
-
next unless hook.copied_file_path
|
86
|
-
FileUtils.cp hook.copied_file_path, "tmp"
|
87
|
-
end
|
88
|
-
end
|
94
|
+
fetch_behaviors(@hook_servers, @hook_events).each do |behavior|
|
95
|
+
next unless behavior.is_a?(RubyYacht::Hook::CopyFileBehavior)
|
96
|
+
FileUtils.cp behavior.file_path, "tmp"
|
89
97
|
end
|
90
98
|
|
91
99
|
@templates.each do |template_name|
|
@@ -107,7 +115,7 @@ module RubyYacht::Runner
|
|
107
115
|
|
108
116
|
# This method establishes settings for building an image.
|
109
117
|
#
|
110
|
-
# This will set the `@templates`, `@hook_events`, and `@
|
118
|
+
# This will set the `@templates`, `@hook_events`, and `@hook_servers`
|
111
119
|
# instance variables.
|
112
120
|
#
|
113
121
|
# ### Parameters
|
@@ -119,21 +127,26 @@ module RubyYacht::Runner
|
|
119
127
|
case folder_name
|
120
128
|
when 'app' then ['Dockerfile', 'before_startup.bash', 'startup.bash']
|
121
129
|
when 'database' then ['Dockerfile', 'startup.bash']
|
130
|
+
when 'web' then ['Dockerfile']
|
122
131
|
else ['Dockerfile']
|
123
132
|
end
|
124
133
|
|
125
134
|
@hook_events =
|
126
135
|
case folder_name
|
127
|
-
when 'app' then [:startup, :build_checkout]
|
128
|
-
when 'app-dependencies' then [:install_libraries]
|
136
|
+
when 'app' then [:startup, :build_checkout, :build_new_app]
|
137
|
+
when 'app-dependencies' then [:initialize_app_environment, :install_libraries]
|
129
138
|
when 'database' then [:create_databases, :install_libraries, :load_database_seeds]
|
139
|
+
when 'web' then [:install_libraries, :add_project_landing, :add_app_config]
|
130
140
|
else []
|
131
141
|
end
|
132
142
|
|
133
|
-
@
|
143
|
+
@hook_servers =
|
134
144
|
case folder_name
|
135
|
-
when 'database' then [@
|
136
|
-
|
145
|
+
when 'database' then [@database]
|
146
|
+
when 'app' then [@app]
|
147
|
+
when 'app-dependencies' then @project.apps
|
148
|
+
when 'web' then [@server]
|
149
|
+
else []
|
137
150
|
end
|
138
151
|
end
|
139
152
|
|
@@ -145,6 +158,8 @@ module RubyYacht::Runner
|
|
145
158
|
#
|
146
159
|
# ### Parameters
|
147
160
|
#
|
161
|
+
# * **servers: Database/App/Array**: The server or servers whose hooks we
|
162
|
+
# are running.
|
148
163
|
# * **event_type: Symbol** The event whose hooks we are running.
|
149
164
|
# * **times: [Symbol]** The event times whose hooks we want to
|
150
165
|
# include. You can also pass a symbol to this
|
@@ -161,7 +176,7 @@ module RubyYacht::Runner
|
|
161
176
|
# ### Returns
|
162
177
|
#
|
163
178
|
# A String with the contents of the Dockerfile for running the hooks.
|
164
|
-
def include_event(event_type, times = [:before, :during, :after], options = {})
|
179
|
+
def include_event(servers, event_type, times = [:before, :during, :after], options = {})
|
165
180
|
result = ""
|
166
181
|
if times.is_a?(Symbol)
|
167
182
|
times = [times]
|
@@ -172,11 +187,13 @@ module RubyYacht::Runner
|
|
172
187
|
result += "\n"
|
173
188
|
next
|
174
189
|
end
|
175
|
-
|
190
|
+
|
191
|
+
fetch_behaviors(servers, [event_type], time).each do |behavior|
|
192
|
+
behavior.context = self
|
176
193
|
if options[:in_bash]
|
177
|
-
result += "#{
|
194
|
+
result += "#{behavior.shell_command}\n"
|
178
195
|
else
|
179
|
-
result += "
|
196
|
+
result += "#{behavior.dockerfile_command}\n"
|
180
197
|
end
|
181
198
|
end
|
182
199
|
end
|
@@ -184,56 +201,53 @@ module RubyYacht::Runner
|
|
184
201
|
result
|
185
202
|
end
|
186
203
|
|
187
|
-
# This method includes the app environment variables for the current app
|
188
|
-
# type.
|
189
|
-
#
|
190
|
-
# ### Parameters
|
191
|
-
#
|
192
|
-
# * **image_type: Symbol** The image type that we're building. This can
|
193
|
-
# be `app_dependencies`, `app`, or `database`.
|
194
|
-
#
|
195
|
-
# ### Returns
|
196
|
-
#
|
197
|
-
# A String with the contents of the Dockerfile for adding the environment
|
198
|
-
# variables.
|
199
|
-
def include_environment_variables(image_type)
|
200
|
-
result = ""
|
201
|
-
@server_type.environment_variables.select { |variable| variable[:image] == image_type }.each do |variable|
|
202
|
-
result += "ENV #{variable[:name]} #{instance_eval(&variable[:block])}\n"
|
203
|
-
end
|
204
|
-
result
|
205
|
-
end
|
206
|
-
|
207
204
|
# This method includes commands for copying script files for the hooks for
|
208
205
|
# the current app type.
|
209
206
|
#
|
210
207
|
# ### Parameters
|
211
208
|
#
|
209
|
+
#
|
210
|
+
# * **servers: Database/App/Array**: The server or servers whose hooks we
|
211
|
+
# are running.
|
212
212
|
# * **event_types: [Symbol]** The events whose hooks we should include.
|
213
213
|
#
|
214
214
|
# ### Returns
|
215
215
|
#
|
216
216
|
# A String with the contents of the Dockerfile for copying the script.
|
217
|
-
def copy_hooks(event_types)
|
217
|
+
def copy_hooks(servers, event_types)
|
218
218
|
result = ""
|
219
|
-
|
220
|
-
|
221
|
-
next unless
|
222
|
-
result +=
|
219
|
+
|
220
|
+
fetch_behaviors(servers, event_types).each do |behavior|
|
221
|
+
next unless behavior.is_a?(RubyYacht::Hook::CopyFileBehavior)
|
222
|
+
result += behavior.dockerfile_command + "\n"
|
223
223
|
end
|
224
224
|
result
|
225
225
|
end
|
226
226
|
|
227
|
-
|
228
|
-
|
229
|
-
#
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
227
|
+
private
|
228
|
+
|
229
|
+
# This method fetches the behaviors for the hooks for an event.
|
230
|
+
#
|
231
|
+
#
|
232
|
+
# * **servers: Database/App/Array**: The server or servers whose hooks we
|
233
|
+
# are running.
|
234
|
+
# * **event_types: Array**: The events for the hooks we are running.
|
235
|
+
# * **event_time: Symbol**: The time relative to the event for the hooks
|
236
|
+
# we are running. If this is nil, it will
|
237
|
+
# include all event times.
|
238
|
+
def fetch_behaviors(servers, event_types, event_time = nil)
|
239
|
+
unless servers.is_a?(Array)
|
240
|
+
servers = [servers]
|
241
|
+
end
|
242
|
+
hooks = servers.collect do |server|
|
243
|
+
event_types.collect do |type|
|
244
|
+
RubyYacht.configuration.fetch_hooks(server, type)
|
245
|
+
end
|
246
|
+
end.flatten.uniq
|
247
|
+
hooks = hooks.select do |hook|
|
248
|
+
event_time.nil? || event_time == hook.event_time
|
235
249
|
end
|
236
|
-
|
250
|
+
hooks.map(&:behaviors).flatten
|
237
251
|
end
|
238
252
|
end
|
239
253
|
end
|
@@ -57,7 +57,7 @@ module RubyYacht::Runner
|
|
57
57
|
return false unless project
|
58
58
|
|
59
59
|
app = project.apps.find { |a| a.name == app_name.to_sym }
|
60
|
-
container_name = app.container_name
|
60
|
+
container_name = app.container_name
|
61
61
|
|
62
62
|
docker "exec #{container_name} bash -c 'cd /var/code; git fetch; git checkout .; git checkout #{branch}; git pull'"
|
63
63
|
docker "exec #{container_name} /var/docker/before_startup.bash"
|
@@ -111,7 +111,19 @@ module RubyYacht::Runner
|
|
111
111
|
# ### Returns
|
112
112
|
# The response from docker-machine.
|
113
113
|
def get_machine_info(property)
|
114
|
-
|
114
|
+
return '' if docker_machine == ''
|
115
|
+
backtick("#{docker_machine} inspect default -f {{#{property}}}").strip
|
116
|
+
end
|
117
|
+
|
118
|
+
# This method gets the path to the docker-machine binary.
|
119
|
+
#
|
120
|
+
# If docker-machine is not installed or is disabled, this will be blank.
|
121
|
+
#
|
122
|
+
# ### Returns
|
123
|
+
# String
|
124
|
+
def docker_machine
|
125
|
+
return '' if RubyYacht.configuration.disable_docker_machine
|
126
|
+
backtick('which docker-machine').strip
|
115
127
|
end
|
116
128
|
|
117
129
|
# Stubbing
|