ruby_yacht 0.3.0 → 0.4.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.
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|