ruby_yacht 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/doc/TODO.md +1 -8
  4. data/lib/ruby_yacht/dsl/app.rb +37 -10
  5. data/lib/ruby_yacht/dsl/configuration.rb +21 -21
  6. data/lib/ruby_yacht/dsl/database.rb +53 -0
  7. data/lib/ruby_yacht/dsl/dsl.rb +14 -8
  8. data/lib/ruby_yacht/dsl/hook.rb +35 -15
  9. data/lib/ruby_yacht/dsl/project.rb +23 -10
  10. data/lib/ruby_yacht/dsl/{app_type.rb → server_type.rb} +39 -29
  11. data/lib/ruby_yacht/dsl.rb +1 -1
  12. data/lib/ruby_yacht/images/app/Dockerfile.erb +9 -5
  13. data/lib/ruby_yacht/images/app-dependencies/Dockerfile.erb +2 -2
  14. data/lib/ruby_yacht/images/database/Dockerfile.erb +12 -11
  15. data/lib/ruby_yacht/images/web/Dockerfile.erb +6 -2
  16. data/lib/ruby_yacht/images/web/add_app.rb +7 -1
  17. data/lib/ruby_yacht/images/web/app_config.erb +2 -0
  18. data/lib/ruby_yacht/plugins/mysql/scripts/setup.bash +11 -0
  19. data/lib/ruby_yacht/plugins/mysql.rb +27 -0
  20. data/lib/ruby_yacht/plugins/rails/scripts/install_gems.rb +6 -1
  21. data/lib/ruby_yacht/plugins/rails/scripts/load_seeds.rb +6 -4
  22. data/lib/ruby_yacht/plugins/rails/scripts/prepare_rails_for_launch.rb +1 -0
  23. data/lib/ruby_yacht/plugins/rails/scripts/update_rails_config.rb +1 -5
  24. data/lib/ruby_yacht/plugins/rails.rb +12 -4
  25. data/lib/ruby_yacht/plugins.rb +2 -1
  26. data/lib/ruby_yacht/runner/build_images.rb +32 -26
  27. data/lib/ruby_yacht/runner/checkout.rb +5 -4
  28. data/lib/ruby_yacht/runner/run_containers.rb +7 -6
  29. data/lib/ruby_yacht/runner/services.rb +2 -2
  30. data/lib/ruby_yacht/runner/shell.rb +5 -4
  31. data/lib/ruby_yacht/runner/update_hosts.rb +2 -1
  32. data/ruby_yacht.gemspec +1 -1
  33. data/spec/dsl/app_spec.rb +96 -10
  34. data/spec/dsl/configuration_spec.rb +53 -55
  35. data/spec/dsl/database_spec.rb +70 -12
  36. data/spec/dsl/hook_spec.rb +36 -19
  37. data/spec/dsl/project_spec.rb +26 -18
  38. data/spec/dsl/{app_type_spec.rb → server_type_spec.rb} +52 -28
  39. data/spec/fixtures/app-dependencies-dockerfile-rails +3 -0
  40. data/spec/fixtures/database-dockerfile +1 -8
  41. data/spec/fixtures/database-dockerfile-mysql +30 -0
  42. data/spec/fixtures/database-dockerfile-rails +1 -5
  43. data/spec/fixtures/database-dockerfile-with-seed-hooks +1 -8
  44. data/spec/fixtures/mars-before-startup-with-custom-file-copy +6 -0
  45. data/spec/fixtures/mars-dockerfile +0 -4
  46. data/spec/fixtures/mars-dockerfile-rails +2 -2
  47. data/spec/fixtures/mars-dockerfile-with-after-checkout-hooks +0 -4
  48. data/spec/fixtures/mars-dockerfile-with-before-startup-hooks +0 -4
  49. data/spec/fixtures/mars-dockerfile-with-custom-file-copy +23 -0
  50. data/spec/fixtures/mars-dockerfile-with-local-database +27 -0
  51. data/spec/fixtures/mars-dockerfile-with-remote-database +27 -0
  52. data/spec/fixtures/web-dockerfile-with-eponymous-app +20 -0
  53. data/spec/plugins/mysql_spec.rb +64 -0
  54. data/spec/plugins/rails_spec.rb +103 -43
  55. data/spec/runner/build_images_spec.rb +142 -11
  56. data/spec/runner/checkout_spec.rb +4 -4
  57. data/spec/runner/run_containers_spec.rb +21 -2
  58. data/spec/runner/runner_spec.rb +1 -1
  59. data/spec/runner/services_spec.rb +7 -2
  60. data/spec/runner/shell_spec.rb +3 -3
  61. data/spec/runner/update_hosts_spec.rb +26 -0
  62. data/spec/support/test_project.rb +16 -20
  63. metadata +20 -5
  64. data/lib/ruby_yacht/images/database/setup.bash +0 -15
@@ -1,69 +1,72 @@
1
1
  module RubyYacht
2
- # This class represents a type of app that the user can configure.
2
+ # This class represents a type of server that the user can configure.
3
3
  #
4
- # An app type corresponds to a major app framework, like Ruby on Rails. App
5
- # types are defined by plugins, which also provide the logic for installing
6
- # and running the apps.
4
+ # An server type corresponds to a major server framework, like Ruby on Rails.
5
+ # Server types are defined by plugins, which also provide the logic for
6
+ # installing and running the server.
7
7
  #
8
- # You can configure this with RubyYacht::AppType::DSL
9
- class AppType
8
+ # You can configure this with RubyYacht::ServerType::DSL
9
+ class ServerType
10
10
  # The name of the type.
11
11
  attr_accessor :name
12
12
 
13
- # The attributes that we define on the project DSL once this app type has
13
+ # The type of container that this should be applied to.
14
+ attr_accessor :container_type
15
+
16
+ # The attributes that we define on the project DSL once this server type has
14
17
  # been loaded.
15
18
  #
16
19
  # Each entry will be a hash with a key for `name`, and optionally a key for
17
20
  # `default` and `required`. These values will be given to the
18
21
  # `add_attribute` method in the project DSL.
19
22
  #
20
- # The attribute names will be prefixed with the app type's name. For
21
- # instance, if the `rails` app type provides an `environment` attribute,
23
+ # The attribute names will be prefixed with the server type's name. For
24
+ # instance, if the `rails` server type provides an `environment` attribute,
22
25
  # it will be called `rails_environment` on the project's DSL. This prevents
23
26
  # conflicts with attributes from other plugins.
24
27
  attr_accessor :project_attributes
25
28
 
26
- # The attributes that we define on the app DSL once this app type has
29
+ # The attributes that we define on the server DSL once this server type has
27
30
  # been loaded.
28
31
  #
29
32
  # Each entry will be a hash with a key for `name`, and optionally a key for
30
33
  # `default` and `required`. These values will be given to the
31
34
  # `add_attribute` method in the project DSL.
32
35
  #
33
- # The attributes will only be defined on apps with this app type.
36
+ # The attributes will only be defined on servers with this server type.
34
37
  #
35
- # The attribute names will be prefixed with the app type's name. For
36
- # instance, if the `rails` app type provides an `environment` attribute,
37
- # it will be called `rails_environment` on the app's DSL. This prevents
38
+ # The attribute names will be prefixed with the server type's name. For
39
+ # instance, if the `rails` server type provides an `environment` attribute,
40
+ # it will be called `rails_environment` on the server's DSL. This prevents
38
41
  # conflicts with attributes from other plugins.
39
- attr_accessor :app_attributes
42
+ attr_accessor :server_attributes
40
43
 
41
- # The docker image that we use as the source for the app images.
44
+ # The docker image that we use as the source for the server images.
42
45
  attr_accessor :baseline_image
43
46
 
44
- # The custom environment variables that we set in the images for this app
47
+ # The custom environment variables that we set in the images for this server
45
48
  # type.
46
49
  #
47
50
  # Each entry will be a hash with the following keys:
48
51
  #
49
52
  # * **name: String** The name of the environment variable
50
- # * **image: String** The type of image that this is set in (e.g. app
53
+ # * **image: String** The type of image that this is set in (e.g. server
51
54
  # or database).
52
55
  # * **block** A block that will be called inside the Dockerfile
53
56
  # ERB for providing the value of the environment
54
57
  # variable.
55
58
  attr_accessor :environment_variables
56
59
 
57
- # This class provides a DSL for configuring a RubyYacht::AppType.
60
+ # This class provides a DSL for configuring a RubyYacht::ServerType.
58
61
  class DSL
59
62
  include RubyYacht::DSL::Base
60
63
  extend RubyYacht::DSL::Base::ClassMethods
61
64
 
62
- # This initiailzer creates the app type DSL.
65
+ # This initiailzer creates the server type DSL.
63
66
  #
64
67
  # ### Parameters
65
68
  #
66
- # * **name: Symbol** The name of the app type.
69
+ # * **name: Symbol** The name of the server type.
67
70
  def initialize(name)
68
71
  @name = name
69
72
  @environment_variables = []
@@ -72,10 +75,16 @@ module RubyYacht
72
75
 
73
76
  add_attribute :name
74
77
 
78
+ #
79
+ # :method: container_type
80
+ # You can call `container_type :app` to say that this server type is for
81
+ # apps. Other acceptable values are `database` and `web`.
82
+ add_attribute :container_type
83
+
75
84
  #
76
85
  # :method: baseline_image
77
86
  # You can call `baseline_image 'ubuntu'` to use ubuntu as the source
78
- # image for the app containers for this app type.
87
+ # image for the server containers for this server type.
79
88
  add_attribute :baseline_image
80
89
 
81
90
  #
@@ -85,13 +94,14 @@ module RubyYacht
85
94
  add_list :project_attribute
86
95
 
87
96
  #
88
- # :method: app_attribute
89
- # You can call `app_attribute name: :environment, default: 'staging'`
97
+ # :method: server_attribute
98
+ # You can call `server_attribute name: :environment, default: 'staging'`
90
99
  # to add an attribute to the app DSL.
91
- add_list :app_attribute
100
+ add_list :server_attribute
92
101
 
93
- creates_object RubyYacht::AppType, [:name, :baseline_image,
94
- :project_attributes, :app_attributes, :environment_variables]
102
+ creates_object RubyYacht::ServerType, [:name, :baseline_image,
103
+ :container_type, :project_attributes, :server_attributes,
104
+ :environment_variables]
95
105
 
96
106
  # This method defines a new environment variable set for this app type.
97
107
  #
@@ -102,8 +112,8 @@ module RubyYacht
102
112
  # * **name: String** The name of the environment variable.
103
113
  # * **block** A block for generating the environment variable.
104
114
  # This will have access to the project (as @project)
105
- # and the app (as @app) that we are building the
106
- # image for.
115
+ # and the server (as @server) that we are building
116
+ # the image for.
107
117
  def environment_variable(image, name, &block)
108
118
  @environment_variables << {image: image, name: name, block: block}
109
119
  end
@@ -5,4 +5,4 @@ require 'ruby_yacht/dsl/app'
5
5
  require 'ruby_yacht/dsl/database'
6
6
  require 'ruby_yacht/dsl/dns_server'
7
7
  require 'ruby_yacht/dsl/hook'
8
- require 'ruby_yacht/dsl/app_type'
8
+ require 'ruby_yacht/dsl/server_type'
@@ -1,9 +1,13 @@
1
- FROM <%= @project.system_prefix %>-<%= @app.app_type %>-app-dependencies
1
+ FROM <%= @project.system_prefix %>-<%= @app.server_type %>-app-dependencies
2
2
 
3
- ENV DATABASE_HOST <%= @project.database.host %>
4
- ENV DATABASE_NAME <%= @project.database.name %>
5
- ENV DATABASE_PASSWORD <%= @project.database.password %>
6
- ENV DATABASE_USERNAME <%= @project.database.username %>
3
+ <% database = @app.database(@project) %>
4
+ <% if database %>
5
+ ENV DATABASE_HOST <%= database.local? ? database.container_name(@project) : database.host %>
6
+ ENV DATABASE_NAME <%= database.name %>
7
+ ENV DATABASE_PASSWORD <%= database.password %>
8
+ ENV DATABASE_USERNAME <%= database.username %>
9
+ ENV DATABASE_TYPE <%= database.server_type %>
10
+ <% end %>
7
11
  ENV APP_PORT <%= @app.port %>
8
12
  ENV REPOSITORY_HOST <%= @project.repository %>
9
13
  ENV REPOSITORY_NAME <%= @app.repository_name %>
@@ -4,7 +4,7 @@
4
4
  # This is a slow process, so this should be kept as simple as possible so that
5
5
  # it can remain unchanged.
6
6
 
7
- FROM <%= @app_type.baseline_image %>
7
+ FROM <%= @server_type.baseline_image %>
8
8
 
9
9
  <%= include_environment_variables :app_dependencies %>
10
10
 
@@ -20,7 +20,7 @@ RUN touch /var/docker/.keep
20
20
  RUN chmod u+x /var/docker/*
21
21
 
22
22
  <% @project.apps.each do |app| %>
23
- <% next unless app.app_type == @app_type.name %>
23
+ <% next unless app.server_type == @server_type.name %>
24
24
 
25
25
  RUN git clone git@<%= @project.repository %>:<%= app.repository_name %> /var/code/<%= app.name %>
26
26
  WORKDIR /var/code/<%= app.name %>
@@ -1,16 +1,16 @@
1
- FROM <%= @project.system_prefix %>-<%= @app_type.name %>-app-dependencies
2
- <% database = @project.database %>
1
+ FROM <%= @project.system_prefix %>-<%= @app_server_type.name %>-app-dependencies
3
2
 
4
- ENV DEBIAN_FRONTEND noninteractive
5
- RUN apt-get install -y mysql-server
6
-
7
- ENV DATABASE_USERNAME <%= @project.database.username %>
8
- ENV DATABASE_PASSWORD <%= @project.database.password %>
9
- ENV DATABASE_NAME <%= @project.database.name %>
3
+ ENV DATABASE_USERNAME <%= @database.username %>
4
+ ENV DATABASE_PASSWORD <%= @database.password %>
5
+ ENV DATABASE_NAME <%= @database.name %>
6
+ ENV DATABASE_TYPE <%= @database.server_type %>
7
+ <%= include_environment_variables :database %>
10
8
  <% with_each_app_type do %>
11
9
  <%= include_environment_variables :database %>
12
10
  <% end %>
13
11
 
12
+ <%= include_event :install_libraries %>
13
+
14
14
  COPY setup.bash /var/docker/setup.bash
15
15
  COPY checkout.bash /var/docker/checkout.bash
16
16
  <% with_each_app_type do %>
@@ -19,10 +19,11 @@ COPY checkout.bash /var/docker/checkout.bash
19
19
 
20
20
  RUN chmod u+x /var/docker/*
21
21
 
22
- RUN /var/docker/setup.bash <%= database.name %> <%= database.username %> <%= database.password %>
22
+ <%= include_event :create_databases %>
23
23
 
24
- <% @project.apps.each do |app| %>
25
- <% @app_type = RubyYacht.configuration.find_app_type(app.app_type) %>
24
+ <% apps = @project.apps.select { |app| app.database_name == @database.name } %>
25
+ <% apps.each do |app| %>
26
+ <% @server_type = RubyYacht.configuration.find_server_type(app.server_type) %>
26
27
 
27
28
  RUN /var/docker/checkout.bash <%= @project.repository %> <%= app.name %> <%= app.repository_name %>
28
29
  WORKDIR /var/code/<%= app.name %>
@@ -13,13 +13,17 @@ 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
- <% if project.primary_app == nil %>
16
+ <% primary_app = project.primary_app %>
17
+ <% if project.apps.any? { |app| app.name == project.system_prefix } %>
18
+ <% primary_app = project.system_prefix %>
19
+ <% end %>
20
+ <% if primary_app == nil %>
17
21
  <% app_list = project.apps.map(&:name).join(',') %>
18
22
 
19
23
  RUN ruby /var/docker/add_project.rb <%= project.system_prefix %> <%= project.domain %> <%= app_list %>
20
24
  <% end %>
21
25
  <% project.apps.each do |app| %>
22
- RUN ruby /var/docker/add_app.rb <%= project.system_prefix %> <%= project.domain %> <%= app.name %> <%= app.port %> <%= app.name == project.primary_app %>
26
+ RUN ruby /var/docker/add_app.rb <%= project.system_prefix %> <%= project.domain %> <%= app.name %> <%= app.port %> <%= app.name == primary_app %>
23
27
  <% end %>
24
28
  <% end %>
25
29
 
@@ -5,7 +5,13 @@ require 'erb'
5
5
  @domain = ARGV.shift
6
6
  @app = ARGV.shift
7
7
  @port = ARGV.shift
8
- @container_name = "#{@project}-#{@app}"
8
+
9
+ if @project == @app
10
+ @container_name = @project
11
+ else
12
+ @container_name = "#{@project}-#{@app}"
13
+ end
14
+
9
15
  @is_primary_app = ARGV.shift == 'true'
10
16
 
11
17
  File.open(File.join("/etc/nginx/conf.d/#{@container_name}.conf"), 'w') do |file|
@@ -1,3 +1,4 @@
1
+ <% if @app != @project %>
1
2
  server {
2
3
  listen 80;
3
4
  server_name <%= @app %>.<%= @domain %>;
@@ -9,6 +10,7 @@ server {
9
10
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
10
11
  }
11
12
  }
13
+ <% end %>
12
14
  <% if @is_primary_app %>
13
15
  server {
14
16
  listen 80;
@@ -0,0 +1,11 @@
1
+ #! /bin/bash
2
+
3
+ service mysql start;
4
+ COMMAND="CREATE USER '$DATABASE_USERNAME'@'localhost' IDENTIFIED BY '$DATABASE_PASSWORD';";
5
+ COMMAND="$COMMAND CREATE USER '$DATABASE_USERNAME'@'%' IDENTIFIED BY '$DATABASE_PASSWORD';";
6
+
7
+ COMMAND="$COMMAND GRANT ALL ON $DATABASE_NAME.* to '$DATABASE_USERNAME'@'localhost';";
8
+ COMMAND="$COMMAND GRANT ALL ON $DATABASE_NAME.* to '$DATABASE_USERNAME'@'%';";
9
+ COMMAND="$COMMAND CREATE DATABASE $DATABASE_NAME;";
10
+
11
+ mysql -uroot -e "$COMMAND";
@@ -0,0 +1,27 @@
1
+ module RubyYacht::Plugins
2
+ # This module provides the plugin for managing MySQL databases.
3
+ module MySQL
4
+ # This method loads the configuration for the MySQL plugin.
5
+ def self.load
6
+ RubyYacht.configure do
7
+ server_type :mysql do
8
+ container_type :database
9
+ baseline_image 'mysql'
10
+
11
+ environment_variable :database, 'DEBIAN_FRONTEND' do
12
+ 'noninteractive'
13
+ end
14
+ end
15
+ end
16
+
17
+ RubyYacht.configure do
18
+ add_hooks(server_type: :mysql, folder: File.join(File.dirname(__FILE__), 'mysql', 'scripts')) do
19
+ during(:install_libraries) { command 'apt-get install -y mysql-server' }
20
+ during(:create_databases) { run_script 'setup.bash' }
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ RubyYacht::Plugins::MySQL.load
@@ -1,3 +1,8 @@
1
1
  #! /usr/local/bin/ruby
2
2
 
3
- system "bundle install"
3
+ command = "bundle install"
4
+ gem_groups = ENV['EXCLUDED_GEM_GROUPS']
5
+ unless gem_groups == ''
6
+ command += " --without #{gem_groups}"
7
+ end
8
+ system command
@@ -12,10 +12,10 @@ config_path = "./config/database.yml"
12
12
  username = ENV['DATABASE_USERNAME']
13
13
  password = ENV['DATABASE_PASSWORD']
14
14
  database = ENV['DATABASE_NAME']
15
-
15
+ rails_env = ENV['RAILS_ENV']
16
16
 
17
17
  database_config = {
18
- 'development' => {
18
+ rails_env => {
19
19
  'adapter' => 'mysql2',
20
20
  'encoding' => 'utf8',
21
21
  'reconnect' => true,
@@ -33,8 +33,10 @@ end
33
33
  system "bundle install"
34
34
  tables = `mysql -uroot -e "SHOW TABLES" #{database}`
35
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}\""
36
+ if rails_env == 'development'
37
+ test_database_command = "CREATE DATABASE #{database}_test; GRANT ALL ON #{database}_test.* TO '#{username}'@'%';"
38
+ system "mysql -uroot -e \"#{test_database_command}\""
39
+ end
38
40
  system "bundle exec rake db:reset"
39
41
  else
40
42
  system "bundle exec rake db:migrate; bundle exec rake db:seed"
@@ -5,6 +5,7 @@ require 'fileutils'
5
5
  system "bundle install"
6
6
  system "rake db:migrate"
7
7
  system "rails r Rails.cache.clear"
8
+ system "rm -f tmp/pids/*"
8
9
 
9
10
  if ENV['RAILS_ENV'] != 'development'
10
11
  system "rake assets:precompile"
@@ -2,10 +2,6 @@
2
2
  require 'yaml'
3
3
 
4
4
  database_host = ENV['DATABASE_HOST']
5
- local_database = (database_host == 'localhost')
6
- if local_database
7
- database_host = ENV['SYSTEM_PREFIX'] + '-database'
8
- end
9
5
 
10
6
  common_config = {
11
7
  'adapter' => 'mysql2',
@@ -20,7 +16,7 @@ database_config = {
20
16
  ENV['RAILS_ENV'] => common_config
21
17
  }
22
18
 
23
- if ENV['RAILS_ENV'] == 'development' && local_database
19
+ if ENV['RAILS_ENV'] == 'development'
24
20
  database_config['test'] = common_config.dup
25
21
  database_config['test']['database'] += '_test'
26
22
  end
@@ -4,26 +4,34 @@ module RubyYacht::Plugins
4
4
  # This method loads the configuration for the Rails plugin.
5
5
  def self.load
6
6
  RubyYacht.configure do
7
- app_type :rails do
7
+ server_type :rails do
8
+ container_type :app
8
9
  baseline_image 'ruby:2.3'
9
10
  project_attribute name: :environment, default: 'development'
11
+ project_attribute name: :excluded_gem_groups, default: []
10
12
  project_attribute name: :secret_key_base
11
13
 
12
- environment_variable :app, 'RAILS_ENV' do
14
+ environment_variable :app_dependencies, 'RAILS_ENV' do
13
15
  @project.rails_environment
14
16
  end
15
17
 
16
18
  environment_variable :app, 'SECRET_KEY_BASE' do
17
19
  @project.rails_secret_key_base
18
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
19
27
  end
20
28
  end
21
29
 
22
30
  RubyYacht.configure do
23
- add_hooks(app_type: :rails, folder: File.join(File.dirname(__FILE__), 'rails', 'scripts')) do
31
+ add_hooks(server_type: :rails, folder: File.join(File.dirname(__FILE__), 'rails', 'scripts')) do
24
32
  during(:install_libraries) { run_script 'install_gems.rb' }
25
33
 
26
- after(:build_checkout) { command 'bundle install && bundle clean --force' }
34
+ after(:build_checkout) { command 'bundle install --clean' }
27
35
 
28
36
  during(:load_database_seeds) { run_script 'load_seeds.rb' }
29
37
 
@@ -3,4 +3,5 @@ module RubyYacht
3
3
  module Plugins
4
4
  end
5
5
  end
6
- require 'ruby_yacht/plugins/rails'
6
+ require 'ruby_yacht/plugins/rails'
7
+ require 'ruby_yacht/plugins/mysql'
@@ -24,21 +24,24 @@ module RubyYacht::Runner
24
24
 
25
25
  id_path = File.join(ENV['HOME'], '.ssh', 'id_rsa')
26
26
  tmp_id_path = File.join('tmp', 'id_rsa')
27
- if File.exist?(id_path)
28
- FileUtils.cp(id_path, tmp_id_path)
29
- end
27
+ FileUtils.cp(id_path, tmp_id_path) if File.exist?(id_path)
30
28
 
31
- project.apps.map(&:app_type).uniq.each do |type_name|
32
- @app_type = RubyYacht.configuration.find_app_type(type_name)
33
- build_image 'app-dependencies', "#{@project.system_prefix}-#{@app_type.name}-app-dependencies"
29
+ project.apps.map(&:server_type).uniq.each do |type_name|
30
+ @server_type = RubyYacht.configuration.find_server_type(type_name)
31
+ build_image 'app-dependencies', "#{@project.system_prefix}-#{@server_type.name}-app-dependencies"
34
32
  end
35
33
 
36
- build_image 'database' if project.database.local?
34
+ project.databases.select(&:local?).each do |database|
35
+ @app_server_type = @server_type
36
+ @database = database
37
+ @server_type = RubyYacht.configuration.find_server_type(@database.server_type)
38
+ build_image 'database', @database.container_name(@project)
39
+ end
37
40
 
38
41
  @project.apps.each do |app|
39
42
  @app = app
40
- @app_type = RubyYacht.configuration.find_app_type(@app.app_type)
41
- build_image 'app', "#{@project.system_prefix}-#{app.name}"
43
+ @server_type = RubyYacht.configuration.find_server_type(@app.server_type)
44
+ build_image 'app', @app.container_name(@project)
42
45
  end
43
46
  @app = nil
44
47
  end
@@ -77,10 +80,10 @@ module RubyYacht::Runner
77
80
  set_image_settings(folder_name)
78
81
 
79
82
  @hook_events.each do |event|
80
- @app_types.each do |app_type|
81
- RubyYacht.configuration.fetch_hooks(app_type: app_type, event_type: event).each do |hook|
82
- next unless hook.script_path
83
- FileUtils.cp hook.script_path, "tmp"
83
+ @server_types.each do |server_type|
84
+ RubyYacht.configuration.fetch_hooks(server_type: server_type, event_type: event).each do |hook|
85
+ next unless hook.copied_file_path
86
+ FileUtils.cp hook.copied_file_path, "tmp"
84
87
  end
85
88
  end
86
89
  end
@@ -96,6 +99,7 @@ module RubyYacht::Runner
96
99
  end
97
100
 
98
101
  image_name ||= "#{@project.system_prefix}-#{folder_name}"
102
+
99
103
  docker "build -t #{image_name} tmp"
100
104
 
101
105
  FileUtils.rm(Dir[File.join("tmp", "*")])
@@ -103,7 +107,7 @@ module RubyYacht::Runner
103
107
 
104
108
  # This method establishes settings for building an image.
105
109
  #
106
- # This will set the `@templates`, `@hook_events`, and `@app_types` instance
110
+ # This will set the `@templates`, `@hook_events`, and `@server_types` instance
107
111
  # variables.
108
112
  #
109
113
  # ### Parameters
@@ -121,14 +125,14 @@ module RubyYacht::Runner
121
125
  case folder_name
122
126
  when 'app' then [:startup, :build_checkout]
123
127
  when 'app-dependencies' then [:install_libraries]
124
- when 'database' then [:load_database_seeds]
128
+ when 'database' then [:create_databases, :install_libraries, :load_database_seeds]
125
129
  else []
126
130
  end
127
131
 
128
- @app_types =
132
+ @server_types =
129
133
  case folder_name
130
- when 'database' then @project.apps.map(&:app_type).uniq
131
- else [@app_type.name]
134
+ when 'database' then [@server_type.name] + @project.apps.map(&:server_type).uniq
135
+ else [@server_type.name]
132
136
  end
133
137
  end
134
138
 
@@ -167,7 +171,7 @@ module RubyYacht::Runner
167
171
  result += "\n"
168
172
  next
169
173
  end
170
- RubyYacht.configuration.fetch_hooks(app_type: @app_type.name, event_type: event_type, event_time: time).each do |hook|
174
+ RubyYacht.configuration.fetch_hooks(server_type: @server_type.name, event_type: event_type, event_time: time).each do |hook|
171
175
  if options[:in_bash]
172
176
  result += "#{hook.command};\n"
173
177
  else
@@ -193,7 +197,7 @@ module RubyYacht::Runner
193
197
  # variables.
194
198
  def include_environment_variables(image_type)
195
199
  result = ""
196
- @app_type.environment_variables.select { |variable| variable[:image] == image_type }.each do |variable|
200
+ @server_type.environment_variables.select { |variable| variable[:image] == image_type }.each do |variable|
197
201
  result += "ENV #{variable[:name]} #{instance_eval(&variable[:block])}\n"
198
202
  end
199
203
  result
@@ -211,22 +215,24 @@ module RubyYacht::Runner
211
215
  # A String with the contents of the Dockerfile for copying the script.
212
216
  def copy_hooks(event_types)
213
217
  result = ""
214
- RubyYacht.configuration.fetch_hooks(app_type: @app_type.name).each do |hook|
215
- next if hook.script_name == ''
218
+ RubyYacht.configuration.fetch_hooks(server_type: @server_type.name).each do |hook|
219
+ next if hook.copied_file_name == ''
216
220
  next unless event_types.include?(hook.event_type)
217
- result += "COPY #{hook.script_name} /var/docker/#{hook.script_name}\n"
221
+ result += "COPY #{hook.copied_file_name} /var/docker/#{hook.copied_file_name}\n"
218
222
  end
219
223
  result
220
224
  end
221
225
 
222
226
  # 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
227
+ # sets each one as the `@server_type` instance variable, and then yields to the
224
228
  # block passed to the method.
225
229
  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)
230
+ original_server_type = @server_type
231
+ @project.apps.map(&:server_type).uniq.each do |server_type|
232
+ @server_type = RubyYacht.configuration.find_server_type(server_type)
228
233
  yield
229
234
  end
235
+ @server_type = original_server_type
230
236
  end
231
237
  end
232
238
  end
@@ -13,7 +13,7 @@ module RubyYacht::Runner
13
13
  attr_accessor :project_name
14
14
 
15
15
  # The name of the app.
16
- attr_accessor :app
16
+ attr_accessor :app_name
17
17
 
18
18
  # The branch that we are checking out.
19
19
  attr_accessor :branch
@@ -36,13 +36,13 @@ module RubyYacht::Runner
36
36
  #
37
37
  # This will take the app name and branch from the command line.
38
38
  def parse_positional_arguments(arguments)
39
- self.app = arguments.shift
39
+ self.app_name = arguments.shift
40
40
  self.branch = arguments.shift
41
41
  end
42
42
 
43
43
  # This method runs the logic for the command.
44
44
  def run
45
- if app.nil?
45
+ if app_name.nil?
46
46
  log "You must provide an app name"
47
47
  log "Run #{Command.short_script_name} help checkout for more information"
48
48
  return false
@@ -56,7 +56,8 @@ module RubyYacht::Runner
56
56
  project = self.project_named(self.project_name)
57
57
  return false unless project
58
58
 
59
- container_name = "#{project.system_prefix}-#{app}"
59
+ app = project.apps.find { |a| a.name == app_name.to_sym }
60
+ container_name = app.container_name(project)
60
61
 
61
62
  docker "exec #{container_name} bash -c 'cd /var/code; git fetch; git checkout .; git checkout #{branch}; git pull'"
62
63
  docker "exec #{container_name} /var/docker/before_startup.bash"
@@ -15,12 +15,9 @@ module RubyYacht::Runner
15
15
 
16
16
  projects.each do |project|
17
17
  @project = project
18
- if @project.check_out_locally
19
- FileUtils.mkdir_p File.join(ENV["PWD"], '..', 'code')
20
- end
21
18
 
22
- if project.database.local?
23
- run_container :database
19
+ project.databases.select(&:local?).each do |database|
20
+ run_container database.container_label
24
21
  end
25
22
 
26
23
  project.apps.each do |app|
@@ -70,7 +67,11 @@ module RubyYacht::Runner
70
67
  # * **name: Symbol** The name of the container, not including the system
71
68
  # prefix.
72
69
  def run_container(name)
73
- container_name = "#{@project.system_prefix}-#{name}"
70
+ if name == @project.system_prefix
71
+ container_name = name
72
+ else
73
+ container_name = "#{@project.system_prefix}-#{name}"
74
+ end
74
75
  remove_container container_name
75
76
 
76
77
  flags = ["-d"]
@@ -51,8 +51,8 @@ module RubyYacht::Runner
51
51
  end
52
52
 
53
53
  projects.each do |project|
54
- if project.database.local?
55
- docker "#{command} #{project.system_prefix}-database"
54
+ project.databases.select(&:local?).each do |database|
55
+ docker "#{command} #{database.container_name(project)}"
56
56
  end
57
57
 
58
58
  project.apps.each do |app|